2013-04-03 13 views
8

Buduję aplikację dla systemu Android, dla której chciałbym, aby moja pierwsza aktywność składała się z 2 kart, jedna dla profilu użytkownika i jedna dla aktywności znajomych. Dla tych kart wybrałem TabHost, ponieważ mój pasek działań Sherlocka już korzysta z nawigacji po liście, aby przejść do innych działań, więc nie mogę korzystać z nawigacji po kartach z paska akcji.java.lang.IllegalStateException: brak aktywności

Aplikacja pracował przez jakiś czas, ale teraz tylko jeden z moich zakładkach działa, jak tylko spróbować, aby przejść do drugiej zakładce, Dostaję java.lang.IllegalStateException: brak aktywności

I dodano wyjście Logcat dla tego błędu, chociaż nie jestem pewien, czy to pomaga, ponieważ nie ma śladu z powrotem do mojego kodu.

Próbowałem zastępując TabHost z FragmentTabHost, ale błąd nie ustąpi ...

Czy ktoś łaskawie mi punkt do pochodzenia/rozumieniu tego błędu? Z góry dziękuję !

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) 

AKTYWNOŚĆ

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

opublikować swój kod pliku AndroidManifest.xml – Pratik

+0

Manifest Android został dodany. – 2Dee

+0

Powyżej klasy Aktywności również określasz swój pakiet jako prawidłowy? 'package = com.enlavertical;' – Bigflow

Odpowiedz

22

Wreszcie dowiedziałem się, co to było o: "nie działanie" katastrofa była spowodowana faktem, że Użyłem niewłaściwego FragmentManager do zagnieżdżenia Fragmentów.

W przypadku zagnieżdżonych fragmentów, jedynym ważnym FragmentManager jest ten uzyskany w Fragmentie zawierającym, przez wywołanie getChildFragmentManager().

8

Ten błąd też mam. Wreszcie okazało się, że był przesłanianie metod onResume() OnStop() niepoprawnie

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

zmienił go do

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

Więc głupi błąd: P

+0

Ja też zrobiłem coś podobnego. Wywoływany super.onResume() wewnątrz onPause(). Niektóre metody, takie jak onCreate(), mają własną ochronę nieodebranych połączeń z ich super. – WindRider

+0

Dzięki, jej prace –

1

trzeba, że ​​transakcja, która ma być zatwierdzone po zapisaniu stanu aktywności ...

Użyj ft.commitAllowingStateLoss() zamiast ft.commit()

To rozwiąże twój problem.

Source

0

byłem tworząc fragment w myActivity.onCreate() pod numerem:

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

Podczas oglądania mojej aplikacji chciałbym wcisnąć przycisk wyłączania zasilania, a następnie aplikacja będzie katastrofy. Najwyraźniej, gdy urządzenie jest wyłączone, stany aktywności i fragmenty są zapisywane, odłączane, a następnie onCreate() i onCreateView() są wywoływane w Fragmentach.W tym stanie .remove(frag) nie można nazwać inaczej będzie rzucać:

nielegalnego stanu: brak aktywności

Więc, po prostu usunięte .remove(frag) i wszystko działa ponownie.

0

W moim przypadku używam ekranu powitalnego i miałem MainLauncher = true w MainActivity.

Powiązane problemy