2014-02-14 59 views
0

我见过很多类似的问题,但我想不出什么我做错了。我做了一个非常简单的应用程序来复制错误。安卓:IllegalStateException异常:活动遭到破坏的计算器

该应用程序执行以下操作:
它在MainActivty的onCreate中添加一个片段。
用户可以从对话框添加另一个片段。
当对话框要求在MainActivity的addFragment方法抛出一个异常的事务执行。

这里是在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 

} 

} 

这里是调用在MainActivity

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

的AddButtonDialog这里是堆栈跟踪

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) 

我相当肯定我不是掌握片段生命周期的概念。请有人这么好解释我做错了什么。

+2

'MainActivity main = new MainActivity();'不这样做。你不应该尝试实例化活动 –

+0

谢谢。在我的主要活动中调用方法的正确方法是什么? – Fuzz

+0

尝试'MainActivity.this.add()' –

回答

1

传递给对话框的MainActivity参考,并尝试这个

mainActivity.addButton() 

哪里mainActivity是参考

0

别:

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

启动活动的方式在Android是通过startActivity(意向);方法

因此,例如做,而不是:

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

看到Intent Guide

+0

感谢您的快速回复。那么我如何以正确的方式在我的主要活动中调用方法? – Fuzz

+0

啊......你只是想调用一个方法。我以为你是在一个不同的活动,你想从你的对话框启动MainActiviy – donfuxx

+0

不,我认为活动已经运行,因为它只是一个对话框。你知道我会如何做到这一点? – Fuzz

0

如果您AddButtonDialog是一个内部类,然后简单地做出addActivity打电话,而不是做main.addButton()。

如果没有,那么尝试创建一个单独的类此方法并传入FragmentManager作为参数传递给它。因此,您可以在任何地方创建新创建的类的实例。

此外,尝试使用下面的Add按钮的方法,

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

谢谢你的回应。请原谅我的无知,但我该如何调用addActivity?我只想调用我的主类中添加一个新片段的方法(从我的对话框) – Fuzz

+0

是您的Dialog类的一个内部类,它是否写在MainActivity中? –

0

如果所有你想要做的是从别的地方调用你的活动方法:
1 - 创建在主要活动静态变量,类型的活动,并创建实例中的onCreate到这一点,所以你必须存储在您的实例。
2 - 在你所谓的主要活动创建一个静态方法获得实例,简单地返回您的活动
3的实例 - 无论身处何地拨打电话:MainActivity.getInstance().yourMethod();
当然,如果你的活动是现有只会工作!