2015-01-04 67 views
1

我有一個tabHost活動與我的應用程序中的兩個選項卡。我從標籤1開始。如果我按下Android的後退按鈕,我可以去前一個活動。當我轉到第二個標籤並按下後退按鈕時,我也會回到前一個活動。Android tabHost回去後崩潰

如果我再切換選項卡(所以第一個選項卡上再次),我收到以下錯誤:

01-04 11:37:32.639: E/AndroidRuntime(2056): FATAL EXCEPTION: main 
01-04 11:37:32.639: E/AndroidRuntime(2056): Process: com.example.damir.klicker, PID: 2056 
01-04 11:37:32.639: E/AndroidRuntime(2056): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1365) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:500) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:176) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.app.Activity.onKeyUp(Activity.java:2201) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.KeyEvent.dispatch(KeyEvent.java:2664) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.app.Activity.dispatchKeyEvent(Activity.java:2431) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.widget.TabHost.dispatchKeyEvent(TabHost.java:324) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2035) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1505) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.app.Activity.dispatchKeyEvent(Activity.java:2426) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3921) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3895) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3452) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3471) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3479) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3452) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3471) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3479) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3452) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3471) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3611) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3777) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2012) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1706) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1697) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1989) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.os.MessageQueue.nativePollOnce(Native Method) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.os.MessageQueue.next(MessageQueue.java:138) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.os.Looper.loop(Looper.java:123) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at android.app.ActivityThread.main(ActivityThread.java:5086) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at java.lang.reflect.Method.invoke(Method.java:515) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
01-04 11:37:32.639: E/AndroidRuntime(2056):  at dalvik.system.NativeStart.main(Native Method) 

當我去片2再次它也發生了。所以基本上我做了第二次開關後,我不能回去。

任何人都知道如何解決這個問題?

問題解決!這是我的最終代碼:

public class QuestionsResultTabHost extends ActionBarActivity { 

    LocalActivityManager mLocalActivityManager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fragment_questions_results); 

     TabHost tabs = (TabHost) findViewById(R.id.tabHost); 
     mLocalActivityManager = new LocalActivityManager(this, false); 
     mLocalActivityManager.dispatchCreate(savedInstanceState); 
     tabs.setup(mLocalActivityManager); 

     Intent questionIntent = new Intent(this, QuestionActivity.class); 

     Intent currentIntent = getIntent(); 
     Bundle extras = currentIntent.getExtras(); 
     if (extras != null) { 
      questionIntent.putExtra("moduleId", extras.getString("moduleId")); 
     } 
     tabs.addTab(tabs.newTabSpec("questions").setIndicator("Fragen").setContent(questionIntent)); 

     Intent resultIntent = new Intent(this, ResultActivity.class); 
     if (extras != null) { 
      resultIntent.putExtra("moduleId", extras.getString("moduleId")); 
     } 
     tabs.addTab(tabs.newTabSpec("result").setIndicator("Ergebnis").setContent(resultIntent)); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int id = item.getItemId(); 


     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
    } 

    @Override 
    protected void onResume() 
    { 
     mLocalActivityManager.dispatchResume(); 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() 
    { 
     mLocalActivityManager.dispatchPause(isFinishing()); 
     super.onPause(); 
    } 

    @Override 
    protected void onStop() 
    { 
     mLocalActivityManager.dispatchStop(); 
     super.onStop(); 
    } 

    @Override 
    protected void onSaveInstanceState (Bundle outState) 
    { 
     mLocalActivityManager.saveInstanceState(); 

    } 

} 
+0

試試這個回答:http://stackoverflow.com/a/10261449/4224337 – Rami 2015-01-04 11:10:04

+0

對不起,如果這是一個愚蠢的問題,但...我在哪裏把這段代碼?我的應用程序中實際上有5個活動:登錄轉到Main。主要進入TabHost活動。每個選項卡用自己的活動打開一個新的意圖。 – 2015-01-05 13:39:55

+0

我還沒有看到你的代碼,所以我不知道在哪裏放這個代碼因爲我不知道你的類是怎麼樣的。但通常在tabHost Activity(標籤的主要活動)中,這是如果您想要移除* saveInstanceState()*方法的* super()*調用,否則如果您的標籤中有片段事務,請嘗試使用「* transaction.commitAllowingStateLoss(); *」代替* commit(); * – Rami 2015-01-05 13:55:45

回答

2
@Override 
protected void onResume() 
{ 
    mLocalActivityManager.dispatchResume(); 
    super.onResume(); 
} 

@Override 
protected void onPause() 
{ 
    mLocalActivityManager.dispatchPause(isFinishing()); 
    super.onPause(); 
} 

@Override 
protected void onStop() 
{ 
    mLocalActivityManager.dispatchStop(); 
    super.onStop(); 
} 

@Override 
protected void onSaveInstanceState (Bundle outState) 
{ 
    mLocalActivityManager.saveInstanceState(); 

} 

我將此添加到我的tabHost活動,它所做的工作。

+0

它也適用於我..謝謝 – 2016-10-26 11:30:43