詳細はAndroid Fragmentの5:FragmentとActivityの通信
4695 ワード
AndroidではFragmentのより優雅な使い方やデータの伝達が行われています.https://github.com/peerless2012/SimpleFragment友達Githubのプロジェクト
SimpleFragment
AndroidではFragmentのより優雅な使い方やデータの伝達が行われています.
TABでFragmentを切り替える
表示するFragment を検索
存在しない場合は、に新しいものを作成して追加(add)します.
既に存在する場合は現在のFragmentを非表示にし、見つかったFragment
バックスタックへの追加でFragmentを切り替えます
Fragment をフルスクリーンで表示
ロールバックスタックに追加すると、Activityのスタック構造をシミュレートするFragmentとActivityの通信http://www.jizhuomi.com/android/course/381.html
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で定義されます.
Javaコード
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のインスタンスをタイプ変換することです.以下に示します.
Javaコード
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は、activityとイベントを共有するためにサム・Listenerのメソッドを呼び出すことができる.たとえば、fragmentAがListFragmentの場合、リストの1つを選択するたびにfragmentAのonListItemClick()メソッドが呼び出されます.このメソッドでは、activityとイベントを共有するためにonArticleSelected()が呼び出されます.
Javaコード
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からタイトルの内容を取得する.
SimpleFragment
AndroidではFragmentのより優雅な使い方やデータの伝達が行われています.
TABでFragmentを切り替える
表示するFragment を検索
存在しない場合は、に新しいものを作成して追加(add)します.
既に存在する場合は現在のFragmentを非表示にし、見つかったFragment
private Fragment preFragment;
private void changeFragment(String fragmentName,String tag,Bundle data) {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment currentFragment = fragmentManager.findFragmentByTag(tag);
if (currentFragment != null && currentFragment == preFragment) return;
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (currentFragment == null) {
currentFragment = Fragment.instantiate(this, fragmentName, data);
transaction.add(R.id.fragment_content, currentFragment, tag);
if (preFragment != null) {
transaction.hide(preFragment);
}
}else {
transaction.hide(preFragment);
transaction.show(currentFragment);
}
preFragment = currentFragment;
transaction.commit();
}
が切り替わったとき Bundle bundle3 = new Bundle();
bundle3.putString(TabFragment1.CONTENT, " TabFragment ");
changeFragment(TabFragment3.class.getName(),TabFragment3.TAG, bundle3);
を表示する.バックスタックへの追加でFragmentを切り替えます
Fragment をフルスクリーンで表示
ロールバックスタックに追加すると、Activityのスタック構造をシミュレートするFragmentとActivityの通信http://www.jizhuomi.com/android/course/381.html
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で定義されます.
Javaコード
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のインスタンスをタイプ変換することです.以下に示します.
Javaコード
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は、activityとイベントを共有するためにサム・Listenerのメソッドを呼び出すことができる.たとえば、fragmentAがListFragmentの場合、リストの1つを選択するたびにfragmentAのonListItemClick()メソッドが呼び出されます.このメソッドでは、activityとイベントを共有するためにonArticleSelected()が呼び出されます.
Javaコード
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からタイトルの内容を取得する.