AndroidでのFragmentとActivity通信の詳細
3215 ワード
AndroidでのFragmentとActivity通信の詳細
activityと通信
fragmentの実装はactivityとは独立しており、複数のactivityに使用することができるが、各activityには同じfragmentの異なるインスタンスが含まれている.FragmentはgetActivity()メソッドを呼び出して、その存在するactivityのオブジェクトを容易に取得し、activityのコントロールを検索することができます(findViewById()).
例:
同様に、activityはFragmentManagerの方法でframentたちを検索することもできます.
例:
Activityがfragmentに応答するイベント
場合によっては、fragmentとactivityがイベントを共有する必要がある場合があります.良い方法はfragmentでコールバックインタフェースを定義しactivityで実現することです.たとえば、そのニュースプログラムの例では、activityがあり、activityには2つのfragmentが含まれています.fragmentAはニュースタイトルを表示し、fragmentBはタイトルに対応する内容を表示します.fragmentAは、ユーザーがタイトルを選択したときにactivityに伝え、activityからfragmentBに伝える必要があります.fragmentBは対応する内容を表示します(なぜそんなに面倒なのですか?fragmentAからfragmentBに直接言えばいいのではないでしょうか.いいですよ.でも、あなたのfragmentは再利用可能な能力を減らしました.今、私のイベントを宿主に伝えるだけで、宿主がどのように処理するかを決めるので、再利用性がもっと良いのではないでしょうか).次の例では、OnArticleSelectedListenerインタフェース
fragmentAで定義:
次にactivityはインタフェースOnArticleSelectedListenerを実装し、メソッドonArticleSelected()でfragmentBに通知する.fragmentがactivityに追加されるとfragmentのメソッドonAttach()が呼び出されます.このメソッドでは、activityがOnArticleSelectedListenerインタフェースを実装しているかどうかを確認するのに適しています.チェックメソッドは、受信したactivityのインスタンスをタイプ変換することです.
次のようになります.
activityがそのインタフェースを実装していない場合、fragmentはClassCastException異常を放出します.成功した場合、mListenerメンバー変数はOnArticleSelectedListenerのインスタンスを保存します.そこでfragmentAはmListenerのメソッドを呼び出してactivityとイベントを共有することができる.たとえば、fragmentAがListFragmentの場合、リストの1つを選択するたびにfragmentAのonListItemClick()メソッドが呼び出されます.このメソッドでは、activityとイベントを共有するためにonArticleSelected()が呼び出されます.
onListItemClick()から入力されるパラメータidはリストの選択された行IDであり、もう一方のfragmentはこのIDでプログラムのContentProviderからタイトルの内容を取得する.
もし疑問があれば伝言を残してあるいは当駅のコミュニティに行って討論を交流して、読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!
activityと通信
fragmentの実装はactivityとは独立しており、複数のactivityに使用することができるが、各activityには同じfragmentの異なるインスタンスが含まれている.FragmentはgetActivity()メソッドを呼び出して、その存在するactivityのオブジェクトを容易に取得し、activityのコントロールを検索することができます(findViewById()).
例:
ViewlistView =getActivity().findViewById(R.id.list);
同様に、activityはFragmentManagerの方法でframentたちを検索することもできます.
例:
ExampleFragment fragment =(ExampleFragment)getFragmentManager().findFragmentById(R.id.example_fragment
Activityがfragmentに応答するイベント
場合によっては、fragmentとactivityがイベントを共有する必要がある場合があります.良い方法はfragmentでコールバックインタフェースを定義しactivityで実現することです.たとえば、そのニュースプログラムの例では、activityがあり、activityには2つのfragmentが含まれています.fragmentAはニュースタイトルを表示し、fragmentBはタイトルに対応する内容を表示します.fragmentAは、ユーザーがタイトルを選択したときにactivityに伝え、activityからfragmentBに伝える必要があります.fragmentBは対応する内容を表示します(なぜそんなに面倒なのですか?fragmentAからfragmentBに直接言えばいいのではないでしょうか.いいですよ.でも、あなたのfragmentは再利用可能な能力を減らしました.今、私のイベントを宿主に伝えるだけで、宿主がどのように処理するかを決めるので、再利用性がもっと良いのではないでしょうか).次の例では、OnArticleSelectedListenerインタフェース
fragmentAで定義:
public static class FragmentA extends ListFragment{
...
//Container Activity must implement this interface
public interface OnArticleSelectedListener{
public void onArticleSelected(Uri articleUri);
}
...
次にactivityはインタフェースOnArticleSelectedListenerを実装し、メソッドonArticleSelected()でfragmentBに通知する.fragmentがactivityに追加されるとfragmentのメソッドonAttach()が呼び出されます.このメソッドでは、activityがOnArticleSelectedListenerインタフェースを実装しているかどうかを確認するのに適しています.チェックメソッドは、受信したactivityのインスタンスをタイプ変換することです.
次のようになります.
public static class FragmentA extends ListFragment{
OnArticleSelectedListener mListener;
...
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
try{
mListener =(OnArticleSelectedListener)activity;
}catch(ClassCastException e){
throw new ClassCastException(activity.toString()+"must implement OnArticleSelectedListener");
}
}
...
activityがそのインタフェースを実装していない場合、fragmentはClassCastException異常を放出します.成功した場合、mListenerメンバー変数はOnArticleSelectedListenerのインスタンスを保存します.そこでfragmentAはmListenerのメソッドを呼び出してactivityとイベントを共有することができる.たとえば、fragmentAがListFragmentの場合、リストの1つを選択するたびにfragmentAのonListItemClick()メソッドが呼び出されます.このメソッドでは、activityとイベントを共有するためにonArticleSelected()が呼び出されます.
public static class FragmentA extends ListFragment{
OnArticleSelectedListener mListener;
...
@Override
public void onListItemClick(ListView l,View v,int position,long id){
//Append the clicked item's row ID with the content provider Uri
Uri noteUri =ContentUris.withAppendedId(ArticleColumns.CONTENT_URI,id);
//Send the event and Uri to the host activity
mListener.onArticleSelected(noteUri);
}
...
onListItemClick()から入力されるパラメータidはリストの選択された行IDであり、もう一方のfragmentはこのIDでプログラムのContentProviderからタイトルの内容を取得する.
もし疑問があれば伝言を残してあるいは当駅のコミュニティに行って討論を交流して、読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!