2017-06-16 5 views
1

私のDialogFragmentには、ActivityまたはFragmentから渡すリスナーがあります。
この現在のコードでは、このダイアログを開いてバックグラウンドに移動し、長時間または低メモリにデバイスを置くとダイアログがクリアされます。私はbtnOKで再び押しアプリを開いたときに、それを防ぐためにためlistener = nullを低メモリで死んで再作成した後にDialogFragmentを閉じます。

public class Dialog extends DialogFragment { 
    DialogListener listener; 

    public static Dialog newInstance(String title, DialogListener listener) { 
     Bundle args = new Bundle(); 
     Dialog fragment = new Dialog(); 
     fragment.setArguments(args); 
     fragment.setListener(listener); 
     return fragment; 
    } 

    public void setListener(DialogListener listener) { 
     this.listener = listener; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState != null){ 
      dismiss(); 
     } 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.dialog_view, container); 
     Button btnOK = (Button) rootView.findViewById(R.id.btnOK); 

     btnOK.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listener.onClick(); 
       dismiss(); 
      } 
     }); 
     return rootView; 
    } 

    interface DialogListener { 
     void onClick(); 
    } 
} 


その後、私はNullPointerExceptionを取得することは同じように再作成するとき、私はDialogFragmentを解任します。

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(savedInstanceState != null){ 
     dismiss(); 
    } 
} 

それは破壊と再作成する場合フラグメントでうまく動作しますが、このソリューションは、すべてのケースではうまく機能しなければ、私は知らないのですか?私はonCreate()の中のダイアログを閉じ込めるので、私は恐らくダイアログを開くことができないユーザを扱わない場合があることを恐れている。
ご意見やご提案をいただければ幸いです。

答えて

0

アクティビティが破棄されている場合は、ダイアログを閉じることができます。

これをダイアログフラグメント内に追加するだけです。

@Override 
public void onSaveInstanceState(Bundle outState) { 
    dismissAllowingStateLoss(); 
    super.onSaveInstanceState(outState); 
} 
+0

私たちはできません。 onSaveInstanceState(...)内のダイアログを閉じると、java.lang.IllegalStateExceptionが発生します:onSaveInstanceStateの後にこのアクションを実行できません –

+0

私は自分の答えを編集しました。今すぐお試しいただけますか? –

+0

あなたが 'onSaveInstanceState()'で却下したいのであれば、あなたは 'onPause()'でそれを行うことができます。 – mac229

関連する問題