Android学習ノートのFragment(三)

4960 ワード

書いてあるのは個人的な理解だけで、間違った大神たちが指摘してくれることを望んでいます.
Fragmentsによる動的Activityレイアウトの構築:
モデルを構築しておきます.like this:      
これはあるactivityのレイアウトで、大きな容器に2つの小さな容器が含まれていますが、小さな容器は何の役に立ちますか?
プログラムにfragmentを動的に追加するには、モデルを構築してから、動的に埋め込みます.(前に容器についてお話ししましたが、本質はLayoutです).このようなピットはfragmentに対応しています.つまり、私たちのFragmentManagerの方法ではadd、replaceのようにコンテナidに関連していますが、実際には青写真を構築し、異なるモジュール、つまり異なるコンテナに異なるfragmentを配置し、各コンテナはいつでも自分のfragmentを交換することができ、動的なメカニズムを実現しています.
 
FragmentsとBack Stack(バックグラウンドのスタック)
トランザクションを操作してfragmentsを動的に変更し、UI全体を変更できることを知っています.トランザクションに関連している以上、SQLからトランザクションにロールバックするメカニズムがあることを知っています.fragmentのトランザクションもありますか.
答えは肯定的です.たとえば、ユーザーインタラクションでトランザクションによってインタフェースを変更し、ユーザーが前のインタフェースに戻ることを望んでいる場合、commitの前にaddToBackStackを呼び出すだけで、このトランザクションを保存し、戻るボタンを押すとロールバックできます.(~.~)
例:FragmentTransaction fragmentTransaction=fragmentManagement.beginTransaction();
fragmentTransaction.add(R.id.ui_container, new MyListFragment());
Fragment fragment = fragmentManager.findFragmentById(R.id.details_fragment); fragmentTransaction.remove(fragment);
String tag = null;  ragmentTransaction.addToBackStack(tag);//commitの前にね!
fragmentTransaction.commit();
これにより、ロールバック時にMyListFragmentが削除され、DetailFragmentがリカバリを再開されます.
注意:fragmentがxmlで直接定義されている場合は、ロールバックなどのトランザクションを正常に使用できないので、トランザクションを使用するにはfragmentを追加する必要があります.
私の話では、どこから来たのか、どこから帰ったのか.
どのようにFragmentの過度なアニメーションを使って、またどのように自分のアニメーションをカスタマイズしますか?デフォルトのアニメーションを使用するには、FragmentTransactionのメソッドsettTransitionメソッドを使用してFragmentTransactionを渡す必要があります.TRANSIT_FRAGMENT_*,FragmentTransactionのようにTRANSIT_FRAGMENT_OPEN.
例:transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
また、独自の過剰アニメーションをカスタマイズし、setCustomAnimations()メソッドを使用して、2つのXMLアニメーションリソースを渡すこともできます.最初のパラメータのアニメーションは、トランザクションがfragmentに追加されたとき、2番目のパラメータのアニメーションは、トランザクションがfragmentを削除または置換したときにトリガーされます.
例:fragmentTransaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right);
注意:animatorは3.0から導入された(API Level 11)アニメーションで、3.0以降はanimator(Property Animation)というものを使うべきで、3.0以前はsupport libraryのは以前のアニメーションリソースしか使えませんでした.
FragmentsとActivitiesの間のインタフェース:
Fragmentクラスでは、getActivityを使用してバインドされたactivityを取得できます.これは現在のコンテキストオブジェクト(context)を見つけるのに役立ち、FragmentManagerを介して他のfragmentsにアクセスしたり、階層レイアウトのViewを見つけたりすることができます.
TextView textView = (TextView)getActivity().findViewById(R.id.textview);
fragmentとactivityでイベントを共有するにはどうすればいいのでしょうか?例をみる
//これはfragmentクラスのクリップです.インタフェースを定義してactivityにこのインタフェースを実現させます.fragmentはonAttachのときにactivityの参照を取得し、マルチステートでインタフェースオブジェクトに変換して共有イベントを行うことができます.
public interface OnSeasonSelectedListener { 
  public void onSeasonSelected(Season season); 
}

private OnSeasonSelectedListener onSeasonSelectedListener; 
private Season currentSeason;

@Override 
public void onAttach(Activity activity) { 
  super.onAttach(activity);

  try { 
     onSeasonSelectedListener = (OnSeasonSelectedListener)activity; 
  } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + 
                 “ must implement OnSeasonSelectedListener”); 
  } 
}

private void setSeason(Season season) { 
  currentSeason = season; 
  onSeasonSelectedListener.onSeasonSelected(season); 
}

 

レイアウトのないFragmentsの使用:
ほとんどの場合、fragmentsはモジュール化UIを組み立てるための設計であるが、activityの状態を保存するなど、バックグラウンドの動作を提供するためにUIのないfragmentを作成することもできる(構成が変更されるとactivityが再起動する).
コードクリップを次に示します.
public class NewItemFragment extends Fragment { 
   @Override 
   public void onAttach(Activity activity) { 
     super.onAttach(activity);

     //  activity   。 
   }

   @Override 
   public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);

    //            。 
   }

   @Override 
   public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState);

     //            
   } 
} 

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(workerFragment, MY_FRAGMENT_TAG);//UIがないので親コンテナIDは指定できませんが、tagしか指定できません.
fragmentTransaction.commit();
 
他のFragments:(これらはしばらく議論しませんが、activityの拡張に似ていますか?)1.DialogFragment
2.ListFragment
3.WebViewFragment