2

I have a tabHost Activity with two tabs in my app. I start on tab 1. If I press the back button of Android, I can go to the former activity. When I go to the second tab and press the back button, I go back to the former activity aswell.

If I switch the tab again (so be again on the first tab), I get the following error:

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)

It also happens when I go to tab 2 again. So basically after I made the second switch, I can't go back.

Anyone knows how to fix this?

Problem solved! Here's my final code:

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 ();

    }

}
nsoeth
  • 371
  • 2
  • 5
  • 17
  • Try this answer: http://stackoverflow.com/a/10261449/4224337 – Rami Jan 04 '15 at 11:10
  • sorry if this is a stupid question, but... where do I put this code? I actually have 5 activities in my app: Login goes to Main. Main goes to the TabHost activity. Each tab opens a new intent with its own activity. – nsoeth Jan 05 '15 at 13:39
  • I haven't seen your code so i don't know exactly where to put this code coz i don't know how your classes looks like. But normally in your tabHost Activity (the main activity of your tabs), this is if you want to remove the *super()* call on the *saveInstanceState()* method, otherwise if you have fragments transactions inside your tabs, try to do it with "*transaction.commitAllowingStateLoss();*" instead of *commit();* – Rami Jan 05 '15 at 13:55
  • Okay, I put the code without super in EVERY activity and also replaced .commit; with .commitAllowingStateLoss(); whenever any Fragment gets loaded but my app still crashes. I added the code of my tabHost Activity. – nsoeth Jan 05 '15 at 14:22
  • I've a worry about this line "mLocalActivityManager.dispatchCreate(savedInstanceState);" , you pass a **Null** value to the dispatchCreate() method. And as i know, this method restore a state that was previously returned by saveInstanceState(). Maybe this is your problem. Try to debug your app to know exactly where it crashs. – Rami Jan 05 '15 at 14:49
  • thank you, I added some code and now it works. – nsoeth Jan 05 '15 at 17:00

1 Answers1

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 ();

}

I added this to my tabHost Activity and it did the work.

nsoeth
  • 371
  • 2
  • 5
  • 17