2014-02-14 56 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();
當然,如果你的活動是現有隻會工作!