Android学習ノートのFragment(三)
書いてあるのは個人的な理解だけで、間違った大神たちが指摘してくれることを望んでいます.
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の参照を取得し、マルチステートでインタフェースオブジェクトに変換して共有イベントを行うことができます.
レイアウトのないFragmentsの使用:
ほとんどの場合、fragmentsはモジュール化UIを組み立てるための設計であるが、activityの状態を保存するなど、バックグラウンドの動作を提供するためにUIのないfragmentを作成することもできる(構成が変更されるとactivityが再起動する).
コードクリップを次に示します.
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(workerFragment, MY_FRAGMENT_TAG);//UIがないので親コンテナIDは指定できませんが、tagしか指定できません.
fragmentTransaction.commit();
他のFragments:(これらはしばらく議論しませんが、activityの拡張に似ていますか?)1.DialogFragment
2.ListFragment
3.WebViewFragment
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