Android tabHost回去后崩溃
问题描述:
我有一个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();
}
}
答
@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
试试这个回答:http://stackoverflow.com/a/10261449/4224337 – Rami 2015-01-04 11:10:04
对不起,如果这是一个愚蠢的问题,但...我在哪里把这段代码?我的应用程序中实际上有5个活动:登录转到Main。主要进入TabHost活动。每个选项卡用自己的活动打开一个新的意图。 – 2015-01-05 13:39:55
我还没有看到你的代码,所以我不知道在哪里放这个代码因为我不知道你的类是怎么样的。但通常在tabHost Activity(标签的主要活动)中,这是如果您想要移除* saveInstanceState()*方法的* super()*调用,否则如果您的标签中有片段事务,请尝试使用“* transaction.commitAllowingStateLoss(); *”代替* commit(); * – Rami 2015-01-05 13:55:45