結果的には、DialogFragment を使用しない場合より簡単に実装できました。正直これで正しいのかどうかは解りませんが、ダイアログのインスタンスはシステムで再作成される事を前提にしているので、DialogFragment 内の onCreateDialog で全て実装する事によって、再度 View をセットするというような処理は必要ありません。但し、行を選択して閉じる時に、dismiss() によってダイアログを終わらせています。 リストビューのデータは、本来 newInstance で put すべきでしょうが、onCreateDialog 内で全て完結するほうがスッキリしているのでそうしました。 行のクリックでは、View からデータを取得していますが、MyData に何かメソッドを実装して実行したい場合は、
MyAdapter adapter = (MyAdapter) parent.getAdapter(); MyData my_data = (MyData) adapter.getItem(position);で問題無いと思います MainActivity 内のソースコード
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// *********************************
// ボタンをクリック
// ( ダイアログフラグメント で表示 )
// *********************************
MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDialogFragment my_dialog_fragment = MyDialogFragment.newInstance("地域一覧");
// ダイアログの表示
// ※ この環境では、getSupportFragmentManager が必要です
my_dialog_fragment.show(getSupportFragmentManager(),"dialog");
}
});
}
// *********************************
// static クラスの定義
// 1) DialogFragment
// 2) ArrayAdapter
// 3) MyData
// *********************************
public static class MyDialogFragment extends DialogFragment {
// ユーザが呼び出す為のもの( 外側で処理しても良い )
public static MyDialogFragment newInstance(String title) {
// インスタンス作成
MyDialogFragment my_dialog_fragment = new MyDialogFragment();
// システムに引数を保存
Bundle args = new Bundle();
args.putString("title", title);
my_dialog_fragment.setArguments(args);
return my_dialog_fragment;
}
// *********************************
// ここが、ダイアログの作成時に呼ばれます
// 初回はユーザがダイアログを作成
// デバイスを横にした時はシステムが
// ダイアログを作成します
// *********************************
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// この中で使用するダイアログ作成用
final AlertDialog.Builder ad_builder_in_fragment;
// この DialogFragment に保存されているデータを取得
// ( システムが再作成した場合でも Bundle よりデータを取得できます )
String title = MyDialogFragment.this.getArguments().getString("title");
// DialogFragment から Activity を取得して使う
// ( ダイアログが使われる Activity を MyDialogFragment 内で取得しています )
ad_builder_in_fragment = new AlertDialog.Builder(MyDialogFragment.this.getActivity());
// タイトル設定
ad_builder_in_fragment.setTitle(title);
ad_builder_in_fragment.setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// キャンセル
}
});
// *********************************
// ダイアログのメインビューに
// リストビューを設定
// *********************************
LayoutInflater inflater = (LayoutInflater) MyDialogFragment.this.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ListView list_view = (ListView) inflater.inflate(R.layout.listview, null);
// *********************************
// 行をクリックした時のイベント
// *********************************
list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// View から行データを取得
TextView tv;
tv = (TextView) view.findViewById(R.id.textPlace);
String textPlace = tv.getText().toString();
tv = (TextView) view.findViewById(R.id.textCode);
String textCode = tv.getText().toString();
// メッセージの作成
String message = String.format("%s : %s", textPlace, textCode);
// logcat に表示
Log.i("lightbox", message );
// Toast で表示
Toast.makeText(MyDialogFragment.this.getActivity(),message, Toast.LENGTH_SHORT).show();
// TextView に表示
tv = (TextView) MyDialogFragment.this.getActivity().findViewById(R.id.textView);
tv.setText(message);
// 破棄
MyDialogFragment.this.dismiss();
}
});
// *********************************
// カスタム・アダプター
// *********************************
MyAdapter adapter = new MyAdapter(MyDialogFragment.this.getActivity(),R.layout.listview_item);
// *********************************
// ListView に表示するデータ
// *********************************
List<MyData> list = new ArrayList<MyData>();
list.add(new MyData("大阪","27"));
list.add(new MyData("東京","13"));
list.add(new MyData("岡山","33"));
list.add(new MyData("北海道","1"));
list.add(new MyData("沖縄","47"));
list.add(new MyData("京都","26"));
list.add(new MyData("滋賀","25"));
// *********************************
// 新しく領域確保して配列データを作成する
// *********************************
MyData[] my_data = list.toArray( new MyData[0] );
// *********************************
// カスタム・アダプターにデータをセット
// *********************************
adapter.addAll(my_data);
// *********************************
// ListView にカスタム・アダプターをセット
// *********************************
list_view.setAdapter(adapter);
ad_builder_in_fragment.setView(list_view);
// ダイアログを作成してシステムに返す
return ad_builder_in_fragment.create();
}
}
// *********************************
// MyData 専用アダブター
// *********************************
public static class MyAdapter extends ArrayAdapter {
public MyAdapter(Context context, int resource) {
super(context, resource);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
// 現在の View の取得
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.listview_item, null);
}
MyData my_data = (MyData)this.getItem(position);
TextView tv;
// listview_item 内の textPlace にデータをセット
tv = (TextView) rowView.findViewById(R.id.textPlace);
tv.setText(my_data.toString());
// listview_item 内の textCode にデータをセット
tv = (TextView) rowView.findViewById(R.id.textCode);
tv.setText(my_data.getValue());
return rowView;
}
}
// *********************************
// MyData
// *********************************
public static class MyData {
private String myString;
private String myValue;
public MyData(String myString,String myValue) {
this.myString = myString;
this.myValue = myValue;
}
// データ取得用
String getValue() {
return myValue;
}
@Override
public String toString() {
return myString;
}
}
※ 全てのソースコードはこちらにあります
|
|
【Android Studio 2の最新記事】
- Android : WebView 経由のデータベースアプリケーション
- Android で WebView を使ってWEBにあるデータベースのデータを取得する為のクラス
- WebView で JavaScript にデータを渡したい時に注意する事
- シンプル Android Data Binding : Android Studio 2.2 / 古い定義との違いと、以前のプロジェクトでエラーが出る場合の対処
- Android Studio で、ListView アプリケーションを作成するテンプレート
- Android : Data Binding で ListView へのデータ表示を凄く簡単にする
- Android Studio で理解不能なエラーが出た時の対処方法 : Invalidate Caches / Restart
- Android : TabHost のタブに下から上へのアニメーションを設定して、include で同一画面を使用するので 回転しないように AndroidMainfest で設定する
- Android : TabHost 内の各 TabSpec 内にある TextView の 端末回転時における保存と復帰
- Android の 端末回転時の EditText と TextView の違い
- ViewPager 内のイベントで設定した TextView の値を保持する Fragment 処理
- ExpandableListView を使用して、タップした時に明細データ表示する
- カスタム・リストビュー・ダイアログ : ダイアログ内の ListView を ArrayAdapter でカスタムする
- AlertDialog.Builder の setItems(int itemsId, DialogInterface .OnClickListener listener) を使用した、ListVie..
- AsyncTask<Params, Progress, Result> の Progress を無しにして、onPostExecute 内の処理を interface を使って MainA..
- javamail-android + AsyncTask でメール送信を行う為のテンプレート
- tools.jar の callHttpGet のテストと include による画面再利用と HttpPost クラスで掲示板書き込み / Android Studio
- Android の Spinner に関するいろいろな実装と知識 / Android Studio
- AsyncTask を継承して、Drawable を取得する専用クラスを作成する : Android Studio
- Android Studio が 2.0 になりました。前からの内容も含めて整理してます。


結果的には、



