Java Android:IllegalStateException:活动已被销毁

Java Android:IllegalStateException:活动已被销毁,java,android,android-fragments,Java,Android,Android Fragments,我在stackoverflow上见过许多类似的问题,但我不知道我做错了什么。我制作了一个非常简单的应用程序来复制错误 应用程序执行以下操作: 它在主活动的onCreate中添加一个片段。 用户可以从对话框中添加另一个片段。 当对话框调用MainActivity的addFragment方法时,事务提交时会引发异常 这里是主要的活动 package com.example.testapp; import android.os.Bundle; import android.support.v4.ap

我在stackoverflow上见过许多类似的问题,但我不知道我做错了什么。我制作了一个非常简单的应用程序来复制错误

应用程序执行以下操作:
它在主活动的onCreate中添加一个片段。
用户可以从对话框中添加另一个片段。
当对话框调用MainActivity的addFragment方法时,事务提交时会引发异常

这里是主要的活动

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

}

}
 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();   
    }
}
这是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)
我相当肯定我没有掌握片段生命周期的概念。请有人解释一下我做错了什么。

不要:

MainActivity main = new MainActivity();
                   main.addButton();
在Android中启动活动的方式是通过startActivity(intent);方法

因此,举例来说,你应该:

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

请参见

如果AddButtonDialog是一个内部类,则只需调用addActivity,而不是执行main.addButton()

如果没有,则尝试在单独的类中创建此方法,并将FragmentManager作为参数传递给它。因此,您可以在创建新创建的类的实例的任何地方调用它

此外,请尝试在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();

MainActivity
的引用传递到该对话框并尝试此操作

mainActivity.addButton()

其中,
main活动
是参考

如果您只想从其他地方调用活动中的方法:
1-在主活动中创建一个静态变量,类型为activity,并在onCreate to this中实例化它,这样就可以存储实例。
2-在主活动中创建一个名为get instance的静态方法,该方法只返回活动的一个实例
3-无论您在哪里调用:
MainActivity.getInstance().yourMethod()

当然,只有当您的活动存在时,它才会起作用

MainActivity main=新的MainActivity()不要这样做。您不应该尝试实例化活动谢谢。在我的主活动中调用方法的正确方法是什么?请尝试
MainActivity.this.add()
我收到错误“没有MainActivity类型的封闭实例在范围内可访问”Ok我通过将MainActivity的引用传递到对话框中,根据您的建议使其正常工作。非常感谢。(你能将评论标记为正确答案吗?)谢谢你的快速回复。那么,我如何以正确的方式调用我主要活动中的方法呢。。。您只需要调用一个方法。我以为你在另一个活动中,你想从对话启动MainActivity否,我假设该活动已经在运行,因为它只是上面的一个对话框。你知道我将如何做到这一点吗?检查这个问题:谢谢你的回答。请原谅我的无知,但我如何称呼addActivity?我只想在我的主类中调用添加新片段(来自我的对话框)的方法。您的对话框类是内部类吗?它是在MainActivity中编写的吗?