简体   繁体   English

Android:IllegalStateException:活动已被破坏

[英]Android: IllegalStateException: Activity has been destroyed

I have seen numerous similar questions on stackoverflow but I can not figure out what I am doing wrong. 我在stackoverflow上看到了许多类似的问题,但是我无法弄清楚我在做什么错。 I have made a very simple app to replicate the error. 我做了一个非常简单的应用程序来复制错误。

The app does the following: 该应用程序执行以下操作:
it adds a fragment in the MainActivty's onCreate. 它在MainActivty的onCreate中添加了一个片段。
user can add another fragment from a dialog. 用户可以从对话框中添加另一个片段。
when the dialog calls the MainActivity's addFragment method an exception is thrown on the commit of the transaction. 当对话框调用MainActivity的addFragment方法时,将在提交事务时引发异常。

Here is the MainActivity 这是MainActivity

package com.example.testapp;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.Button;

public class MainActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final Button button = (Button) findViewById(R.id.add_button);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
             AddButtonDialog addButtonDialog = new AddButtonDialog();
             addButtonDialog.show(getSupportFragmentManager(), "ADD");
        }
    });

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    CustomFragment fragment = new CustomFragment();
    transaction.add(R.id.fragment_container, fragment);
    transaction.commit();
}


public void addButton() {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    CustomFragment fragment = new CustomFragment();
    transaction.add(R.id.fragment_container, fragment);
    transaction.commit(); // <-- Exception

}

}

and here is the AddButtonDialog that calls the MainActivity 这是调用MainActivity的AddButtonDialog

 public class AddButtonDialog  extends DialogFragment {
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        final LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.new_button_dialog, null);
        builder.setView(view)

               .setPositiveButton("Add", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int id) {
                       MainActivity main = new MainActivity();
                       main.addButton();
                   }
               });
        return builder.create();   
    }
}

And here is the stacktrace 这是堆栈跟踪

    02-14 10:09:27.781: E/AndroidRuntime(26291): FATAL EXCEPTION: main
    02-14 10:09:27.781: E/AndroidRuntime(26291): java.lang.IllegalStateException: Activity has been destroyed
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at com.example.testapp.MainActivity.addButton(MainActivity.java:35)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at com.example.testapp.AddButtonDialog$1.onClick(AddButtonDialog.java:22)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:185)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at android.os.Handler.dispatchMessage(Handler.java:99)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at android.os.Looper.loop(Looper.java:137)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at android.app.ActivityThread.main(ActivityThread.java:5328)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at java.lang.reflect.Method.invokeNative(Native Method)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at java.lang.reflect.Method.invoke(Method.java:511)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
    02-14 10:09:27.781: E/AndroidRuntime(26291):    at dalvik.system.NativeStart.main(Native Method)

I am fairly certain I am not grasping the concepts of the Fragment lifecycle. 我相当确定我没有掌握Fragment生命周期的概念。 Please would someone be so kind as to explain what I am doing wrong. 请有人好心地解释我做错了什么。

Pass a reference of MainActivity to the Dialog and try this MainActivity的引用传递给对话框,然后尝试执行此操作

mainActivity.addButton()

Where mainActivity is the reference 其中mainActivity是参考

don't: 别:

MainActivity main = new MainActivity();
                   main.addButton();

the way to start Activities in Android is via startActivity(intent); 在Android中启动活动的方法是通过startActivity(intent); method 方法

So for example do instead: 因此,例如:

Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

see Intent Guide 参见意图指南

If your AddButtonDialog is an inner class then simply make a call to addActivity rather than doing main.addButton(). 如果您的AddButtonDialog是一个内部类,则只需调用addActivity而不是执行main.addButton()。

If not then try creating this method in a separate class and pass FragmentManager as a parameter to it. 如果没有,请尝试在单独的类中创建此方法,并将FragmentManager作为参数传递给它。 Thus you can call this from anywhere creating instance of the newly made class. 因此,您可以在创建新类的实例的任何位置调用此方法。

Also, try using the below in your addButton method, 另外,请尝试在addButton方法中使用以下代码,

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
CustomFragment fragment = new CustomFragment();
transaction.replace(R.id.fragment_container, fragment); //this will replace your fragment_container with this fragment
transaction.addToBackStack(null);// this will help you get back to your first  fragment on back press
transaction.commit();

If all you want to do is calling a method in your Activity from somewhere else: 如果您只想从其他位置调用Activity中的方法:
1 - create a static variable in your main activity, of type Activity, and instantiate it in onCreate to this, so you have your instance stored. 1-在您的主要活动中创建一个静态变量,其类型为活动,并在onCreate上实例化该变量,以便存储您的实例。
2 - create a static method in your main activity called get instance, that simply returns an instance of your activity 2-在您的主要活动中创建一个名为get instance的静态方法,该方法仅返回您活动的实例
3 - wherever you are call : MainActivity.getInstance().yourMethod(); 3-无论您在哪里打电话: MainActivity.getInstance().yourMethod();
Of course it will only work if your activity is existing! 当然,仅当您的活动存在时,它才起作用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 IllegalStateException活动已被销毁错误android - IllegalStateException Activity has been destroyed error android java.lang.IllegalStateException:活动已被破坏SlidingFragmentActivity - java.lang.IllegalStateException: Activity has been destroyed SlidingFragmentActivity ChildFragmentManager java.lang.IllegalStateException:Activity已被销毁 - ChildFragmentManager java.lang.IllegalStateException: Activity has been destroyed 处理“活动已被破坏”(java.lang.IllegalStateException)异常? - Handling “Activity has been destroyed” (java.lang.IllegalStateException) exception? 异常java.lang.IllegalStateException:活动已被破坏 - Exception java.lang.IllegalStateException: Activity has been destroyed 错误java.lang.IllegalStateException:活动已被销毁 - Error java.lang.IllegalStateException: Activity has been destroyed java.lang.IllegalStateException:使用日期时间选择器库时活动已被破坏 - java.lang.IllegalStateException: Activity has been destroyed when using datetime picker library java.lang.IllegalStateException:创建日期选择器对话框时活动已被破坏 - java.lang.IllegalStateException: Activity has been destroyed on creating a datepicker dialog Android片段-在片段中按文本后,“活动已被破坏” - Android Fragments - “Activity has been destroyed” after pressing text in a fragment 在Android OS销毁某个活动之后,对活动的引用会如何处理? - What happens to references to an activity after it has been destroyed by the Android OS?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM