OnFragmentInteractionListener/ Fragment to Activity, Fragment to Fragment メッセージングを実装する必要があります。
この問題の原因は、Fragment に関連する Activity が OnFragmentInteractionListener インターフェースを実装していないためです。
では、なぜ、どのようにこのインターフェースを実装する必要があるのでしょうか?順を追って見ていきましょう...。
フラグメントとアクティビティ、フラグメントとフラグメントの間の情報の受け渡し
2つのFragmentが互いに対話したい場合は、関連するActivityを通じて行う必要があります。2つのFragmentの間で直接メッセージをやり取りすることはできません。
インターフェースの定義
Fragmentとそれに関連するActivityの間でメッセージパッシングを行うには、Fragmentにインターフェースを定義し、Activityにそのインターフェースを実装すればよいのです。FragmentはonAttach()メソッドでActivityのインターフェースを取得し、インターフェースのメソッドを呼び出してActivityと通信を行います。
以下に、Fragmentの例としてHeadlinesFragment.javaを示します。
public class HeadlinesFragment extends ListFragment {
private OnFragmentInteractionListener mListener;
public HeadlinesFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Define an array
List<String> data = new ArrayList<String>();
for (int i = 0; i < 30; i++) {
data.add("smyh" + i);
}
//add the array to the ArrayAdapter
ArrayAdapter adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, data);
//setListAdapter() interface, not ListView.setAdapter() or other methods
setListAdapter(adapter);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
public void onFragmentInteraction(Uri uri);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
mListener.onFragmentInteraction(null);
}
...
}
Fragmentはメンバ変数mListenerを持ち、mListenerのonFragmentInteraction()メソッドを呼び出すことで、Activityに情報を渡せるようになったことに注目してください。もちろん、インターフェースに他のメソッドがあれば、他のメソッドも呼び出すことができます。
例えば、ユーザがListの項目をクリックすると、Fragment内の以下のメソッドが実行されます。そして、このメソッド内でonFragmentInteraction()を呼び、Activityに情報を渡します。
fragment_headlines.xmlをレイアウトします。
Activityでインターフェイスを実装する
ActivityはFragmentから情報を受け取るために、OnFragmentInteractionListenerインターフェイスを実装する必要があります。ここには、onFragmentInteraction(Uri)というメソッドが一つだけあり、トーストを印刷するために実装します。(もちろん、OnFragmentInteractionListenerに複数のメソッドを定義し、それを実装することも可能です)
MainActivity.java。
public class MainActivity extends ActionBarActivity implements HeadlinesFragment.OnFragmentInteractionListener {
private FragmentManager fm = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFragment();
}
private void initFragment() {
HeadlinesFragment headlinesFragment = new HeadlinesFragment();
fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container,headlinesFragment);
ft.commit();
}
@Override
public void onFragmentInteraction(Uri uri) {
Toast.makeText(this,"exchange,cornerfloor",Toast.LENGTH_LONG).show();
}
...
}
activity_main.xml です。
結果は以下のようになり、ListViewのいずれかの項目がクリックされると、トーストがポップアップ表示されるようになりました。(FragmentのonListItemClickメソッドの中でOnFragmentInteractionListenerメソッドを呼び出しているので、このような結果になるのでしょう)
簡単に言うと、フラグメントはActivityに情報を渡したり、同じActivityにバインドされている別のフラグメントに情報を渡したりする必要があるのです。ActivityはFragmentのOnFragmentInteractionListenerインターフェイスを実装する必要があります。なぜなら、メッセージの受け渡しは、このインターフェースにあるメソッドを通じて意図的に行われるからです。
関連
-
Androidでコンストラクタのインテントを解決できない原因と解決策
-
第20章 OnCheckedChangeListenerイベント (ゼロから学ぶAndroid)
-
android studio3.2 a pitfall: リソースの処理に失敗しました。詳細は上記の aapt の出力を参照してください。
-
AndroidStudioのコンパイル時のエラーを解決します。構成 ':classpath' のすべてのアーティファクトを解決できませんでした。
-
Androidで「デフォルトのアクティビティが見つからない」問題を解決する
-
Android StudioでJavaファイルが認識されない問題を解決(赤いJが表示される)。
-
アプリがGoogle検索でインデックスされない
-
Android ConstraintLayout コンストレイントレイアウト
-
Androidレイアウトにおけるmargin,padding,alignの使い分けと違いについて
-
ARMアセンブリ共通命令 NULL演算 NOP命令
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
android:ems="10 "とは何ですか?
-
Error:Execution failed for task :app:transformClassesWithInstantRunForDebug solution.
-
jniとjavaの間でbytearrayを受け渡しする
-
Android Studioの解決策:xxxは囲むクラスではありませんエラー
-
Jniエラー:構造体でも組合でもないものにメンバー 'FindClass' を要求する、 解決方法
-
Android eclipseが起動できない:選択項目を起動できず、最近起動した項目もない
-
root化されているのですが、adb shellの後、suを入力するとpermission deniedと表示されます。
-
Androidのボトムナビゲーションバー、3つのスタイルとインプリメンテーション
-
アンドロイドバージョン一覧
-
AndroidのRadioButtonの中央寄せ問題(解決済み)