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");
実行結果
==== やっぱり、これはサンプルであって実用に向いてない。