詳細はAndroid Fragmentの5:FragmentとActivityの通信

4695 ワード

AndroidではFragmentのより優雅な使い方やデータの伝達が行われています.https://github.com/peerless2012/SimpleFragment友達Githubのプロジェクト
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からタイトルの内容を取得する.