2013-04-03 98 views
8

Tôi đang xây dựng một ứng dụng Android mà tôi muốn hoạt động đầu tiên của mình bao gồm 2 tab, một tab cho hồ sơ của người dùng và một cho hoạt động của bạn bè. Đối với các tab này, tôi đã chọn một TabHost vì Thanh tác vụ Sherlock của tôi đã sử dụng điều hướng danh sách để di chuyển sang các hoạt động khác nên tôi không thể sử dụng điều hướng tab từ thanh tác vụ.java.lang.IllegalStateException: Không hoạt động

Ứng dụng làm việc một thời gian, nhưng bây giờ chỉ có một trong các tab của tôi làm việc, ngay sau khi tôi cố gắng để di chuyển đến tab thứ hai, tôi nhận được một java.lang.IllegalStateException: Không có hoạt động

tôi thêm đầu ra Logcat cho lỗi này, mặc dù tôi không chắc chắn nó giúp vì không có dấu vết quay lại mã của tôi.

tôi đã cố gắng thay thế TabHost với một FragmentTabHost, nhưng lỗi vẫn còn ...

Bất cứ ai có vui lòng chỉ cho tôi về nguồn gốc/ý nghĩa của lỗi này? Cảm ơn trước !

logcat:

04-03 08:19:39.380: W/dalvikvm(958): threadid=1: thread exiting with uncaught exception  (group=0x40a71930) 
04-03 08:19:39.400: E/AndroidRuntime(958): FATAL EXCEPTION: main 
04-03 08:19:39.400: E/AndroidRuntime(958): java.lang.IllegalStateException: No activity 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1075) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1861) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1474) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.os.Handler.handleCallback(Handler.java:725) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.os.Looper.loop(Looper.java:137) 
04-03 08:19:39.400: E/AndroidRuntime(958): at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-03 08:19:39.400: E/AndroidRuntime(958): at java.lang.reflect.Method.invokeNative(Native Method) 
04-03 08:19:39.400: E/AndroidRuntime(958): at java.lang.reflect.Method.invoke(Method.java:511) 
04-03 08:19:39.400: E/AndroidRuntime(958): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-03 08:19:39.400: E/AndroidRuntime(958): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-03 08:19:39.400: E/AndroidRuntime(958): at dalvik.system.NativeStart.main(Native Method) 

HOẠT ĐỘNG

public class HomeActivity extends SherlockFragmentActivity implements ActionBar.OnNavigationListener { 

private ActionBar mActionBar; 
private TabHost tHost; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.home_activity_layout); 

    //Setting the list navigation on actionBar 
    mActionBar = getSupportActionBar(); 
    Context context = getSupportActionBar().getThemedContext(); 
    ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(context, R.array.list_menu_items, R.layout.sherlock_spinner_item); 
    list.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item); 
    mActionBar.setDisplayShowTitleEnabled(false); 
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
    mActionBar.setListNavigationCallbacks(list, this); 

    //Setting the subnavigation with TabHost 
    tHost = (TabHost) findViewById(android.R.id.tabhost); 
    tHost.setup(); 



    /** Defining tab builder for profile tab */ 
    TabHost.TabSpec tabSpecProfile = tHost.newTabSpec("profile"); 
    tabSpecProfile.setIndicator("PROFILE"); 
    tabSpecProfile.setContent(new TabContentMaker(this)); 
    tHost.addTab(tabSpecProfile); 

    /** Defining tab builder for community tab */ 
    TabHost.TabSpec tabSpecCommunity = tHost.newTabSpec("community"); 
    tabSpecCommunity.setIndicator("COMMUNITY"); 
    tabSpecCommunity.setContent(new TabContentMaker(this)); 
    tHost.addTab(tabSpecCommunity); 

    /** Defining Tab Change Listener event. This is invoked when tab is changed */ 
    TabHost.OnTabChangeListener tabChangeListener = getOnTabChangeListener(); 

    /** Setting tabchangelistener for the tab */ 
    tHost.setOnTabChangedListener(tabChangeListener); 
} 

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    //changing activity here 
    return true; 
} 

private TabHost.OnTabChangeListener getOnTabChangeListener(){ 
    TabHost.OnTabChangeListener tabChangeListener = new TabHost.OnTabChangeListener() { 

     @Override 
     public void onTabChanged(String tabId) { 
      android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); 
      MyProfileFragment profileFragment = (MyProfileFragment) fm.findFragmentByTag("profile"); 
      CommunityFeedFragment communityFragment = (CommunityFeedFragment) fm.findFragmentByTag("community"); 
      android.support.v4.app.FragmentTransaction ft = fm.beginTransaction(); 

      /** Detaches the profileFragment if exists */ 
      if(profileFragment!=null) 
       ft.detach(profileFragment); 

      /** Detaches the communityFragment if exists */ 
      if(communityFragment!=null) 
       ft.detach(communityFragment); 

      /** If current tab is profile */ 
      if(tabId.equalsIgnoreCase("profile")){ 

       if(profileFragment==null){ 
        /** Create MyProfileFragment and adding to fragmenttransaction */ 
        ft.add(R.id.realtabcontent,new MyProfileFragment(), "profile"); 
       }else{ 
        /** Bring to the front, if already exists in the fragmenttransaction */ 
        ft.attach(profileFragment); 
       } 

      }else{ /** If current tab is community */ 
       if(communityFragment==null){ 
        /** Create CommunityFragment and adding to fragmenttransaction */ 
        ft.add(R.id.realtabcontent,new CommunityFeedFragment(), "community"); 
       }else{ 
        /** Bring to the front, if already exists in the fragmenttransaction */ 
        ft.attach(communityFragment); 
       } 
      } 
      ft.commit(); 
     } 
    }; 
    return tabChangeListener; 
} 

ANDROID MANIFEST

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.enlavertical" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.Styled" > 
    <activity 
     android:name="com.enlavertical.HomeActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 
+0

đăng mã tệp AndroidManifest.xml của bạn – Pratik

+0

Tệp kê khai Android đã được thêm. – 2Dee

+0

Phía trên lớp Hoạt động, bạn cũng xác định gói của mình phải không? 'package = com.enlavertical;' – Bigflow

Trả lời

22

Cuối cùng phát hiện ra điều này là về: "không hoạt động" vụ tai nạn là do thực tế là Tôi đã sử dụng sai số FragmentManager để lồng mảnh.

Đối với các đoạn lồng nhau, chỉ có FragmentManager hợp lệ là phần thu được trong Phân đoạn có chứa, bằng cách gọi getChildFragmentManager().

8

Tôi cũng nhận được lỗi này. Cuối cùng, phát hiện ra rằng tôi đã trọng các phương pháp onResume() onStop() sai

@Override 
protected void onResume() { 
    super.onResume(); 
    initilizeMap(); 
} 
@Override 
protected void onStop() { 
    super.onResume(); 
    finish(); 
} 

thay đổi nó để

@Override 
protected void onResume() { 
    super.onResume(); 
    initilizeMap(); 
} 
@Override 
protected void onStop() { 
    super.onStop(); 
    finish(); 
} 

Sai lầm Vì vậy, Silly: P

+0

Tôi cũng đã làm điều tương tự. Được gọi là super.onResume() bên trong onPause(). Một số phương thức như onCreate() đã tự bảo vệ các cuộc gọi nhỡ đến siêu của họ. – WindRider

+0

Cảm ơn, các tác phẩm của nó –

1

Bạn cần rằng giao dịch được cam kết sau khi trạng thái của hoạt động được lưu ...

Sử dụng ft.commitAllowingStateLoss() thay vì ft.commit()

Điều đó sẽ giải quyết được vấn đề của bạn.

Source

0

tôi đã tạo ra một đoạn trong myActivity.onCreate() bằng cách gọi:

getSupportFragmentManager() 
    .beginTransaction() 
    .remove(frag) 
    .replace(idOfViewBeingReplaced, frag) 
    .commit(); 

Trong khi xem ứng dụng của tôi, tôi sẽ nhấn nút tắt nguồn và sau đó ứng dụng sẽ sụp đổ. Rõ ràng, khi thiết bị được tắt nguồn, trạng thái Hoạt động và Phân đoạn được lưu, tách ra và sau đó onCreate()onCreateView() được gọi trên Phân đoạn.Trong trạng thái này, .remove(frag) không thể gọi hoặc nếu không nó sẽ ném:

tình trạng bất hợp pháp: không có hoạt động

Vì vậy, tôi chỉ xóa .remove(frag) và tất cả mọi thứ đang làm việc một lần nữa.

0

Trong trường hợp của tôi, tôi sử dụng màn hình giật gân và tôi đã có MainLauncher = true trong MainActivity.

Các vấn đề liên quan