2014-02-14 1 views
0

나는 stackoverflow에 수많은 유사한 질문을 본 적이 있지만 내가 뭘 잘못하고 있는지 알아낼 수 없습니다. 나는 오류를 복제하는 아주 간단한 응용 프로그램을 만들었습니다.안드로이드 : 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는 기준에게 있습니다

mainActivity.addButton() 

0

은하지 마십시오 활동을 시작하는

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

방법을 안드로이드가 startActivity를 (의도) 경유에;

방법

그래서 예를 들어 대신 수행하여 AddButtonDialog이 내부 클래스는 단순히 오히려() main.addButton하는 것보다 addActivity로 전화를 걸 경우

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

Intent Guide

+0

빠른 응답을 보내 주셔서 감사합니다. 그렇다면 주 활동의 방법을 올바른 방법으로 어떻게 부르겠습니까? – Fuzz

+0

아 ... 방금 메서드를 호출하려고합니다. 나는 당신이 당신의 대화에서 MainActiviy를 시작하기를 원하는 다른 활동을하고 있다고 생각했습니다. – donfuxx

+0

아니요, Activity가 그것의 바로 위에있는 대화창 이후 이미 실행되고 있다고 가정합니다. 내가 이걸 어떻게 성취 할 수 있는지 알고 있니? – Fuzz

0

를 참조하십시오.

그렇다면 별도의 클래스에서이 메서드를 만들고 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(); 
+0

답변 해 주셔서 감사합니다. 실례지만 addActivity를 어떻게 호출합니까? 간단히 말해서 메인 클래스의 메소드를 호출하여 새 프래그먼트 (내 대화 상자에서)를 추가하고자합니다. – Fuzz

+0

은 Dialog 클래스의 내부 클래스이며, MainActivity 내에 작성되어 있습니까? –

0

하는 경우 당신이하고 싶은 것은 당신의 Activity에서 다른 곳에서 메소드를 호출하는 것입니다 :
1 - 기본 액티비티의 정적 변수 인 Activity 유형을 onCreate에 인스턴스화하여 인스턴스를 저장합니다. 당신의 활동이 기존의 경우 물론 MainActivity.getInstance().yourMethod();
그것을에만 작동합니다 : 당신이 전화 어디서나 -
2 - 간단하게 활동
3의 인스턴스를 반환라는 주요 활동에 정적 메서드를 작성, 예를 얻을!

관련 문제