こんにちは、Habr、この記事ではFragmentのような興味深い要素についてお話したいと思います。この記事は科学的なブレークスルーではなく、この要素の使用に関する小さなチュートリアルです。 猫の下で、何か新しいことを学びたいと思っている人は、どうぞ。
フラグメントは、アクティビティのモジュール部分であり、独自のライフサイクルとさまざまなイベントのハンドラを備えています。 AndroidにはAPI 11のフラグメントが追加されているため、開発者はタブレット画面などの大画面でより柔軟なユーザーインターフェイスを開発できます。 しばらくして、古いバージョンにフラグメントサポートを追加するライブラリが作成されました。
アクティビティを使用した場合と比べて、すぐに目に見える利点があります
- それらを使用すると、タブレットの設計を簡単にレスポンシブにすることができます。
- 機能モジュールへのコードの分離。したがって、コードサポートは安価です。
主なクラス
3つの主要なクラスがあります。
android.app.Fragment-実際、彼から。 フラグメントは継承されます
android.app.FragmentManager-このクラスのインスタンスを使用すると、フラグメント間のすべての相互作用が発生します
android.app.FragmentTransaction-このクラスは、名前が示すとおり、トランザクションに必要です。
現在、ListFragment、PreferenceFragmentなど、特定のタスクを解決するためのFragmentクラスにはさまざまな種類があります。
フラグメントの基本
フラグメントを作成するために必要なことは、フラグメントからクラスを継承することだけです。 フラグメントを特定のマークアップにバインドするには、その中にonCreateView()メソッドを定義する必要があります。 このメソッドは、フラグメントが属するビューを返します。
public class ExampleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.you_layout_for_fragment, container, false); return view; } }
フラグメント内のどこからでもこのビューを取得するには、単にgetView()を呼び出します
フラグメントを作成しましたが、画面に配置したいと思います。 これを行うには、FragmentManagerのインスタンスを取得し、必要なトランザクションを完了する必要があります。
まず、フラグメントで何ができるかを調べる必要があります。
add() -フラグメントを追加
remove() -フラグメントを削除します
replace() -フラグメントを置き換えます
hide() -フラグメントを非表示にします
show() -フラグメントを表示します
また、アクティビティでデフォルトで行われるように、トランザクションをスタックに追加するには、 addToBackStack(String)を使用し、スタックの以前の状態を返すためにpopBackStack()メソッドを呼び出す必要があります。
画面にフラグメントを追加します。
ExampleFragment youFragment = new ExampleFragment(); FragmentManager fragmentManager = getFragmentManager() fragmentManager.beginTransaction()
アクティビティとフラグメントをリンクする方法は?
アクティベーションメソッドを呼び出すには、 getActivity()メソッドを介してインスタンスを取得するだけです
if (getActivity() != null) MainActivity act = (MainActivity ) getActivity();
フラグメントにアクセスするために、トランザクションを作成するときに作成したフラグメントオブジェクトへのリンクがあります
アクティビティからフラグメントのイベントを処理する必要がある場合、最善の解決策は、アクティビティ内のインターフェイスをアクティブにし、フラグメント内のこのインターフェイスのオブジェクトに親アクティビティを持ってくることです。
値またはオブジェクト全体をフラグメントに転送する必要がある場合があります。たとえば、この購入の詳細な説明を開く要素をクリックして買い物リストを作成します。 すぐにこのパラメーターを取得してフラグメントコンストラクターに渡したいと思いますが、Googleではフラグメントコンストラクターの再定義をお勧めしません。 したがって、この状況から抜け出すには2つの方法があります。
- オブジェクトをシリアル化する
- Parcableメソッドをオーバーライドして、Parcelコンテナーにオブジェクトを渡す
- いくつかの場所で、オーバーライドされたコンストラクタを介してフラグメントを作成するために、静的ファクトリメソッドを作成することを見ました
Androidの場合はアクティビティとフラグメント間でパラメータを転送するためにParcelを使用する方が正しいため、2番目のオプションでこれがどのように行われるかを示します。
public class MyObject implements Parcelable { public String paramOne; public int paramToo; public MyObject(String paramOne, int paramToo) { this.paramOne = paramOne; this.paramToo = paramToo; } private MyObject(Parcel parcel) {
ここでは、フラグメント間で受け渡したいクラスにParcelableインターフェイスを実装しました。
フラグメントに渡すには、次を実行する必要があります。
MyObject obj = new MyObject("", 1 ); Bundle bundle = new Bundle(); bundle.putParcelable("key", obj); youFragment.setArguments(bundle);
次に、新しいフラグメントのonCreateView()メソッドで渡したオブジェクトを取得する必要があります。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.you_layout_for_fragment, container, false); if(getArguments() != null) MyObject obj = getArguments().getParcelable("key"); return view; }
UPD。 getArguments()からのobjオブジェクトの取得を修正、firexelに感謝
フラグメントアニメーション
フラグメントを作成し、アクションを実行し、アクティビティとやり取りする方法を学びましたが、すべてを代表的に見せるために、フラグメントをアニメーションを追加することで少しアニメーション化することができます。
フラグメントを追加および削除する独自のアニメーションを作成するには? res / animatorディレクトリに2つのファイルを作成する必要があります。1つは追加をアニメートするのに役立ち、2つ目は削除する
それらの1つの例を示します。
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="together"> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:propertyName="x" // android:valueType="floatType" android:valueTo="0" // android:valueFrom="1280" // android:duration="2000"/> // </set>
ルート要素はobjectAnimatorであり、その属性はアニメーションパラメーターを設定します。
ここで、アニメーションを使用してsetCustomAnimations()メソッドを呼び出す必要があり、次のトランザクション中にフラグメントが有効になります。
ExampleFragment youFragment = new ExampleFragment(); FragmentManager fragmentManager = getFragmentManager() fragmentManager.beginTransaction() .setCustomAnimations(R.animator.show_fr, R.animator.remove_fr); .add(R.id.container_for_fragments, youFragment) .addToBackStack("myStack") .commit();
ほとんどすべてがすでに書かれていますが、フラグメントについてはまだたくさん話すことができますが、私はフラグメントに関するすべての基本的な知識を組み合わせて、この要素について何も知らない人が自由にそれらを使用できるようにしたかったのです。