DialogFragment はインナークラスで書くべきか。。

DialogFragment を使用する方法として、無名インナークラスで書いてしまうと
画面回転時、Activityライフサイクル上DialogFragment 派生インスタンスを参照できなくなるのか?
とにかく、落ちてしまう。

インナークラスでなく、public class で作るか、public で、static のインナークラスを書くしかないようで、
static のインナークラスを書くぐらいなら、外側で定義した方が書きやすい。

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.TextView;
/**
 * SimpleMessage
 */
public class SimpleMessage extends DialogFragment{
   private static String _message;
   private static String _title;
   private static String _positiveButtonDisplay;
   private static String _negativeButtonDisplay;
   private static String _neutralButtonDisplay;
   private static DialogInterface.OnClickListener _positiveListner;
   private static DialogInterface.OnClickListener _negativeListner;
   private static DialogInterface.OnClickListener _neutralListner;
   private static View _view;

   public SimpleMessage(){
   }
   public SimpleMessage setTitle(String title){
      _title = title;
      return this;
   }
   public SimpleMessage setMessage(String message){
      _message = message;
      return this;
   }
   public SimpleMessage setPositiveButton(String positiveButtonDisplay, DialogInterface.OnClickListener listner){
      _positiveButtonDisplay = positiveButtonDisplay;
      _positiveListner = listner;
      return this;
   }
   public SimpleMessage setNegativeButton(String negativeButtonDisplay, DialogInterface.OnClickListener listner){
      _negativeButtonDisplay = negativeButtonDisplay;
      _negativeListner = listner;
      return this;
   }
   public SimpleMessage setNeutralButton(String neutralButtonDisplay, DialogInterface.OnClickListener listner){
      _neutralButtonDisplay = neutralButtonDisplay;
      _neutralListner = listner;
      return this;
   }
   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState){
      LayoutInflater inflater = getActivity().getLayoutInflater();
      _view = inflater.inflate(android.R.layout.simple_list_item_1, null);
      TextView text1 = (TextView)_view.findViewById(android.R.id.text1);
      text1.setText(_message);
      if (_positiveListner ==null && _negativeListner==null && _neutralListner==null){
         Dialog dialog = super.onCreateDialog(savedInstanceState);
         if (_title ==null){
            dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
         }else{
            dialog.setTitle(_title);
         }
         return dialog;
      }
      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
      builder.setTitle(_title);
      builder.setView(_view);
      if (_positiveListner != null){
         builder.setPositiveButton(_positiveButtonDisplay, _positiveListner);
      }
      if (_negativeListner != null){
         builder.setNegativeButton(_negativeButtonDisplay, _negativeListner);
      }
      if (_neutralListner != null){
         builder.setNeutralButton(_neutralButtonDisplay, _neutralListner);
      }
      return builder.create();
   }
   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
      if (_positiveListner ==null && _negativeListner==null && _neutralListner==null){
         return _view;
      }
      return null;
   }
}

上記は、メッセージ表示用の View のレイアウトに、
 android.R.layout.simple_list_item_1 を使っている。

使用例、、、

FragmentManager fmanager = getFragmentManager();
new SimpleMessage().setTitle("タイトル").setMessage("メッセージ")
.setPositiveButton("許可する", new DialogInterface.OnClickListener(){
   @Override
   public void onClick(DialogInterface dialog, int which){
      Toast.makeText(getApplicationContext(), "Positive Click!", Toast.LENGTH_SHORT).show();
   }
})
.setNegativeButton("拒否する", new DialogInterface.OnClickListener(){
   @Override
   public void onClick(DialogInterface dialog, int which){
      Toast.makeText(getApplicationContext(), "Negative Click!", Toast.LENGTH_SHORT).show();
   }
})
.setNeutralButton("保留", new DialogInterface.OnClickListener(){
   @Override
   public void onClick(DialogInterface dialog, int which){
      Toast.makeText(getApplicationContext(), "Neutral Click!", Toast.LENGTH_SHORT).show();
   }
})
.show(fmanager, "tag1");

実行結果

f:id:posturan:20160313195255p:plain




==== やっぱり、これはサンプルであって実用に向いてない。