2017-03-09 1 views
0

DialogFragments에 문제가 있습니다. 나는 onclick이 progress 회 전자 (사용자 정의보기가있는 DialogFragment)를 표시하고 다른 작업으로 이동하는 버튼이있는 활동이 있습니다. 두 번째 활동에는 button2가 있습니다. onclick은 진행률 회 전자를 취소해야하는 이전 활동에 결과를 되돌려 보냅니다.대화 상자 조각을 닫을 때 onSaveInstanceState 후에이 작업을 수행 할 수 없습니다.

public class MainActivity extends AppCompatActivity { 

private Button button; 
private int stackLevel; 

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

    button = (Button)findViewById(R.id.button); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      showProgressDialog(); 

      Intent intent = new Intent(MainActivity.this,   SecondActivity.class); 
      startActivityForResult(intent,2); 
     } 
    }); 


} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if(requestCode==2){ 

     dismissProgressDialog(); 

    } 

} 

public void showProgressDialog() { 
    stackLevel++; 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    Fragment prev = getSupportFragmentManager().findFragmentByTag("progressDialog"); 
    if (prev != null) { 
     ft.remove(prev); 
    } 
    //ft.addToBackStack(null); 
    // Create and show the dialog. 
    DialogFragment newFragment = LoaderFragment.newInstance(stackLevel); 
    //newFragment.show(ft,"progressDialog"); 
    ft.add(newFragment, "progressDialog"); 
    ft.commitAllowingStateLoss(); 
} 


public void dismissProgressDialog() { 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    DialogFragment prev = (DialogFragment) getSupportFragmentManager().findFragmentByTag("progressDialog"); 
    if (prev != null) { 
     prev.dismiss(); 
    } 
     ft.commitAllowingStateLoss(); 
} 


} 

활동 2

public class SecondActivity extends AppCompatActivity { 

private Button button; 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.second_layout); 

    button = (Button)findViewById(R.id.button2); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      try { 
       setResult(2); 
      }catch (Exception e){ 

       e.printStackTrace(); 
      } 


      finish(); 

     } 
    }); 

} 
} 

하지만 내가 대화 조각

Caused by: java.lang.IllegalStateException: Can not perform this action  after onSaveInstanceState 
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1527) 
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1545) 
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:654) 
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:621) 
at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:201) 
at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:167) 
at com.example.am46517.samplefragmentapplication.MainActivity.dismissProgressDialog(MainActivity.java:70) 
at com.example.am46517.samplefragmentapplication.MainActivity.onActivityResult(MainActivity.java:42) 
at android.app.Activity.dispatchActivityResult(Activity.java:6926) 
at android.app.ActivityThread.deliverResults(ActivityThread.java:4293) 
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4347)  
at android.app.ActivityThread.-wrap20(ActivityThread.java) 

답변

0

나는 아래 라인에 문제가 있다고 생각을 해제 할 때 오류가 다음 무엇입니까 ; "심볼 LoaderFragment를 해결할 수 없습니다".

DialogFragment newFragment = LoaderFragment.newInstance(stackLevel); 

그러나 코드에 문제가있는 이유는 ProgressDialog를 인스턴스화 한 방법 때문일 수 있습니다. MainActivity에서 벗어나면 로컬에서 선언 된 것을 잃어 버렸기 때문에.

는 내가 전에 비슷한 문제가 발생하지만 나중에 따라서 주위에 방법, 생각 :

  1. 부모 활동 클래스를 만들기 ...
    public class CustomActivity extends AppCompatActivity
  2. 모두 대화 방법 showProgressDialog을 MainAcvity.java and SecondActivity.java extend CustomActivity.java
  3. 이동하자를()CustomActivity.java으로 dismissProgressDialog()로 지정한 다음 MainActivity.java 또는 S 결국

(두 방법 모두 공유 대중 모든 클래스 상속 CustomActivity에 방법이 될 것입니다 때문에) econdActivity.java이 파일을 다음과 같이 ..

1 CustomActivity.java

을 찾아야한다
public class CustomActivity extends AppCompatActivity { 
private int stackLevel; 
public void showProgressDialog() 
{ 
    stackLevel++; 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    Fragment prev = getSupportFragmentManager().findFragmentByTag("progressDialog"); 
    if (prev != null) { 
     ft.remove(prev); 
    } 
    //ft.addToBackStack(null); 
    // Create and show the dialog. 
    DialogFragment newFragment = LoaderFragment.newInstance(stackLevel); 
    //newFragment.show(ft,"progressDialog"); 
    ft.add(newFragment, "progressDialog"); 
    ft.commitAllowingStateLoss(); 
} 


public void dismissProgressDialog() 
{ 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    DialogFragment prev = (DialogFragment) getSupportFragmentManager().findFragmentByTag("progressDialog"); 
    if (prev != null) { 
     prev.dismiss(); 
    } 
    ft.commitAllowingStateLoss(); 
}} 

2 MainActivity.java

public class MainActivity extends CustomActivity { 
@Override 
protected void onCreate (Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick (View view) 
     { 
      showProgressDialog(); 

      Intent intent = new Intent(MainActivity.this, SecondActivity.class); 
      startActivityForResult(intent, 2); 
     } 
    }); 
} 

@Override 
protected void onActivityResult (int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == 2) { 
     dismissProgressDialog(); 
    } 
}} 
,

3. SecondActivity.java

public class SecondActivity extends CustomActivity { 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.second_layout); 

    Button button = (Button) findViewById(R.id.button2); 
    button.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) { 

      try { 
       setResult(2); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 

      finish(); 
     } 
    }); 
}} 

것은이 작동하는지의 내 질문에 대답하기위한

+0

감사합니다 (I이, 실행하는기도 ;-)) 보자보십시오. 나는 당신이 나에게달라고 부탁 한 변화를 만들었지 만, 여전히 나는 똑같은 문제를 겪고있다. – user1401232

+0

한 가지 흥미로운 점을 발견했습니다. try/catch를 사용하여 닫는 코드를 무시하면 제대로 작동합니다. – user1401232

+0

오 그거 대단해. 엄지 손가락! – Nelis

관련 문제