2017-03-09 7 views
0

DialogFragmentsで問題が発生しました。私はonclickが進捗スピナー(カスタムビューを持つDialogFragment)を表示し、別のアクティビティに移動するボタンを持つアクティビティを持っています。私の2番目のアクティビティでは、私はボタン2を持っています。これは、onclickが前のアクティビティにResultを返すので、進捗スピナーを却下するはずです。ダイアログフラグメントが閉じられているときに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

を閉じたときに、私は次のエラーを取得しています私は、下の行に問題があると思います; msgstr "シンボルLoaderFragmentを解決できません"。

DialogFragment newFragment = LoaderFragment.newInstance(stackLevel); 

しかし、あなたのコードに問題があるかもしれない理由は、ProgressDialogをどのようにインスタンス化したかにあります。 MainActivityから移動すると、ローカルで宣言されたものが失われてしまいます。

私はこのように、前に同様の問題に遭遇しましたが、後でそれを回避する方法を考え出し:


  1. public class CustomActivity extends AppCompatActivity
  2. MainAcvity.java and SecondActivity.java extend CustomActivity.java
  3. 移動両方のダイアログメソッドshowProgressDialogをしてみましょう...親アクティビティのクラスを作成します。 ()およびCustomActivity.javaにdismissProgressDialog()を設定し、MainActivity.javaまたはS econdActivity.java(両方の方法がCustomActivityを継承するすべてのクラスに共有のパブリックメソッドになっていたので)

最後に、あなたのファイルは、これらのようになるはずです。..

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

感謝を試してみてください。あなたが私に求めていた変更を加えましたが、それでも私は同じ問題を抱えています。 – user1401232

+0

もう1つ興味深いことが見つかりました。 – user1401232

+0

ああ、それは素晴らしいです..親指アップ! – Nelis

関連する問題