フラグメントの使用第6章では、動的なUIを構築します
マルチプレーンのAndroidで動的なユーザー・インターフェースを作成するには、交換可能なモジュールように行動するには、encapsulation UIコンポーネントと活動を実施する必要があります。私たちは、それが独自のレイアウトを定義し、そのライフサイクルを管理することができ、ビットネストされた行為のような役割を果たしており、これらのモジュールを作成するために、フラグメントのクラスを使用することができます。フラグメントは、それがAndroid3.0新しいAPIで、より多くの明白な利点があります。断片は、異なる画面サイズ用に構成されたレイアウトを変更するために異なる組み合わせで作用するように構成することができ、そのレイアウトを、指定された場合、画面がわずかな断片を示してもよいし、2つ又は2で大画面に表示することができますフラグメントの1以上。この章では、この古いバージョンとしてAndroid1.6をサポートするために継続しながら、ダイナミックなユーザーエクスペリエンスを作成し、機器の異なる画面サイズのユーザーエクスペリエンスを最適化するために、フラグメントを使用する方法について説明します。以下では、コンテンツのプレビューです:
1. Androidのサポートライブラリ
Androidのサポートライブラリを結合することにより、新しいAPIの最新のバージョンを使用する方法を学びます
2.フラグメントを作成します。
いくつかの基本的な行動フラグメントを作成し、実装する方法を学びます
3。柔軟なUIを構築します
異なる画面フラグメントのレイアウト構成のためのさまざまな提供方法を学びます
4.フラグメントを連通
開始フラグメントに断片またはアクティビティと通信するための通信経路を設定する方法を学びます
6.1 Androidのサポートライブラリ
Androidのサポートライブラリ(サポートライブラリ)のサポートAPIライブラリJARファイルを提供し、ライブラリを使用すると、システムの初期のバージョンではAPIの最近のシステムのバージョンを使用することができ、良いニュースは、サポートライブラリは、APIのフラグメントのバージョンを提供することであるのでこのシステムはまた、それを使用することができます1.6 3.0へのバージョン間とすることができます。このセクションでは、簡単にアプリケーションの我々のシステムバージョンは、動的夜のUIをサポートするように、低フラグメントをサポートするためのサポートライブラリを設定する方法について説明します。
6.1.1 当社のエンジニアリング・サポート・ライブラリーに応じて設定
図6-1に示す。1.ダウンロードAndroidのサポートSDK Managerパッケージ、:
図6-1は、 Androidのサポートスクリーンショットをダウンロード
2.あなたのAndroidプロジェクトにlibsディレクトリを作成します。
3.あなたのjarファイルを見つけて、あなたはligs /ディレクトリにライブラリを使用することをコピーし、例えば、
<SDK> /extras/android/support/v4/android-support-v4.jar
4.更新マニフェストファイルは、最小APIレベル4を設定し、ターゲットのAPIレベル15(現時点での最新システムバージョン4.0.3)
< 使用-SDK アンドロイド:minSdkVersionが= "4" アンドロイド:targetSdkVersion = "15" />
6.1.2 インポート我々は、ライブラリのAPIをサポート
サポートライブラリは、様々なAPIが含まれている、あなたは、システムユーザの低いバージョンの使用を検討するために、彼らはこのシステムAPIを持っていない可能性があり、これらのAPIを使用する場合があります。SLは、私たちのためにそれのために設計されています。あなたはAPIのSLに関するすべてのドキュメントを見つけることができ、公式APIドキュメントをandroid.support.v4をご参照ください。*
あなたは、新しいシステム、新しいフラグメントクラスの使用を使用して、独自の開発環境に注意を払う場合は特に、SLを使用するときは、新しいシステムを使用しているように、あなたは、あなたがすべき、すべての機器に関連しないように注意し、互換性を、あるべき表6-1に示す導入:
輸入android.support.v4.app.Fragment。 輸入android.support.v4.app.FragmentManager。 ...
リスト6-1
6.2フラグメントの作成
あなたが追加または削除することができ、行為が実行されている、独自の入力イベントを受け取り、それは自身のライフサイクルを持って、行為のモジュラーの一部としてフラグメントと考えることができます。このセクションでは、我々のアプリケーションはまだ古いシステムのバージョンのAndroid 1.6上で実行されている場合にはフラグメントのクラスライブラリのサポートを使用する方法について説明します。あなたが直接あなたのアプリケーションを宣言する最小APIレベルをサポートする場合はもちろん、サポートライブラリを使用する必要はありません、11(アンドロイド3.0)であるが、このアプローチは、現時点では望ましいものではありません。
6.2.1 フラグメントのクラスを作成します
まず、私たちはその後、ちょうど活動として、キーライフサイクル・アプローチをオーバーライドし、フラグメントのクラスを継承する必要があります。実際の方法は、我々は理由ここでレイアウトを作成する必要性、フラグメントは、我々はリスト6-2に次のコードを参照することができ、正しく実行するための、唯一のonCreateView()このメソッドを書き換える必要があります。
輸入android.os.Bundle; 輸入android.support.v4.app.Fragment。 輸入android.view.LayoutInflater; 輸入android.view.ViewGroup; パブリック クラス ArticleFragmentは延びフラグメント{ @Override パブリックビューonCreateView(LayoutInflater用インフレータ、のViewGroup容器、 バンドルsavedInstanceState){ // 为这个断片填充布局 戻り inflater.inflate(R.layout.article_view、容器、偽の); } }
リスト6-2
活性のようなフラグメントはまた、)行為はonPause(呼び出したとき、例えば、(例えば、追加又は活動から削除など)は、状態を管理することを可能にする意志の行為の任意の断片を他のライフサイクルコールバックメソッドを実装する必要がありますonPause()コールバックを受信します。使用するためのフラグメントについての詳細は、APIフレームワークを説明します。
6.2.2 フラグメントActivitに追加するために使用するXML Y-を中
断片は、再利用可能なモジュール式のUIコンポーネント、クラスFragmentActivityフラグメント関連付けられなければならない親オブジェクトの各インスタンスです。あなたはレイアウトXMLファイル内の活動に関連付けを完了するために、各フラグメントを定義することができます。あなたはAPIレベル11システムのサポートされる最小バージョンを作成した場合、あなたはFragmentActivityは、システムの以前のバージョン用に設計されているので、直接活動を使用して、ライブラリーフラグメントをサポートできることに注意してください。「大きい」として、お使いのデバイスの画面は、あなたが1つの行為に二つの断片を追加することができたときにここでは、レイアウトファイルの例です。リスト6-3に示すように:
解像度/レイアウト-大/ news_articles.xml:
< のLinearLayout のxmlns:アンドロイド= "http://schemas.android.com/apk/res/android" アンドロイド:オリエンテーション= "水平" アンドロイド:layout_width = "fill_parent" アンドロイド:layout_height = "fill_parent" > < フラグメントアンドロイド:名前= "com.example.android.fragments.HeadlinesFragment" アンドロイド:ID = "@ + ID / headlines_fragment" アンドロイド:layout_weight = "1" アンドロイド:layout_width = "0dp" アンドロイド:layout_height = "match_parent" /> <フラグメントアンドロイド:名= "com.example.android.fragments.ArticleFragment" アンドロイド:ID = "@ + ID / article_fragment" アンドロイド:layout_weight = "2" アンドロイド:layout_width = "0dp" アンドロイド:layout_height = "match_parent" /> </ のLinearLayout >
リスト6-3
ここではリスト6-4に示すように、コード内の上記レイアウトxmlファイルを使用する方法は次のとおりです。
輸入android.os.Bundle; 輸入android.support.v4.app.FragmentActivity。 パブリック クラス MainActivityは延びFragmentActivity { @Override 公共 ボイドのonCreate(バンドルsavedInstanceState){ スーパー.onCreate(savedInstanceState)。 setContentView(R.layout.news_articles)。 } }
リスト6-4
注:XMLでfargmentを定義すると、実行時に削除することはできません。次のセクションで、私たちは、動的にユーザーと対話する方法を説明します
柔軟なフラグメントを作成するために、6.3
あなたは、画面サイズの広い範囲をサポートし、あなたのアプリケーションを設計するために注文すると、あなたは、ユーザーエクスペリエンス、様々な画面サイズを最適化するために、別のレイアウト構成で、あなたのフラグメントを再利用することができます。例えば、による大画面とは逆に、電話機上の時間表示の断片は、より多くのフラグメントプレートに表示されてもよいです。
のは、図6-2を見てみましょう:
図6-2プレートで電話機の異なる断片の使用
FragmentManagerクラスは、ダイナミックなユーザーエクスペリエンスを作成するための活動時間を実行することができ、追加、削除、使用方法フラグメントを置換提供します。
6.3.1 アクティビティで実行されているフラグメントを追加します
代わりに、XML定義された断片を使用する、などの実行時に動的に、より多くの柔軟性を追加しません。あなたが断片を変更する予定がある場合は、ライフサイクルで動作する、動的なメカニズムを使用する必要があります。このような取引のフラグメントの実装を追加または削除として、我々は、追加提供FragmentTransctionを作成するFragmentManagerクラスを使用して削除し、APIのフラグメントの様々なを交換する必要があります。あなたが断片を取り外して交換することを可能にする役割を果たす場合は、行為の最初の(また、元の親クラスとして理解)断片のonCreateに()を追加する必要があります。非常に重要なルールは、断片、実行時のフラグメントを追加することを特にを扱うときは、Viewコンテナパッケージフラグメントが存在しなければならないということです。我々はまだレイアウトxmlファイルに使用しますが、我々は、レイアウトではなく、レイアウト-大をサポートするために、我々は、動的フラグメントを追加するためのコードを使用しているため、断片のみを表示するので、XMLフラグメントノードが宣言していることができません。リスト6-5に示すように、そしてXMLは、一つだけでframeLayoutです。
解像度/レイアウト/ news_articles.xml:
< でframeLayout のxmlns:アンドロイド= "http://schemas.android.com/apk/res/android" アンドロイド:ID = "@ + ID / fragment_container" アンドロイド:layout_width = "match_parent" アンドロイド:layout_height = "match_parent" />
リスト6-5
私たちの活動では、サポートライブラリAPIはFragmentMangerを取得するためにgetSupportFragmentManager()を呼び出します。次いで断片を追加し、その追加()メソッドを介してFragmentTransactionを作成するためのbeginTransaction()を呼び出します。あなたは行為で複数のトランザクション処理を実行するために、同じFragmentTransactionフラグメントを使用することができます。あなたが変更と判断された場合、あなたは私たちの操作をコミットするためにcommit()を呼び出す必要があります。リスト6-6に示すように具体的な動作、:
インポートandroid.os.Bundle; インポートandroid.support.v4.app.FragmentActivity; パブリック クラスは MainActivity 延びFragmentActivityを{ @Override 公共 ボイドのonCreate(バンドルsavedInstanceState){ スーパー.onCreate(savedInstanceState); setContentView(R.layout.news_articles)。 // 空気でframeLayoutかどうかを確認する IF(findViewById(R.id.fragment_container)!= nullが){ // 我々が以前の状態から回復している場合は、私たちが直接バックは何もする必要はありません IF(savedInstanceState!= nullを{) 返します。 } // 、このような実装とリソースCD HeadlinesFragmentオブジェクトを作成 HeadlinesFragment firstFragment = 新しい新しいHeadlinesFragmentを(); // フラグメントテントのエキストラを設定するためには、パラメータ firstFragment.setArguments(。getIntent()getExtrasを()); // フラグメントに追加します'fragment_container'(でframeLayout) getSupportFragmentManager()のbeginTransaction() .add(R.id.fragment_container、firstFragment).commit(); } } }
リスト6-6
フラグメントがでframeLayoutの実行時に追加されているので、我々はレイアウトXMLファイルを使用するのではなく6.2にフラグメント<フラグメント>に書かれているので、私たちは、動的に追加、削除、フラグメントを置き換えることができます。
6.3.2 フラグメントを交換してください
替换fragment ,不是用add()而是使用replace()。请记住,当你使用FragmentTransaction执行更换或删除一个fragment交易,它常 常是适当允许用户向后导航“撤消”的转变。在你提交之前请调用FragmentTransaction.addToBackStack()方法。当删除或 替换一个fragment,并添加回栈的操作时,被删除的fragment已停止(没有被destroyed)。如果用户后退导航,那么fragment 恢复并重新启动。如果你不添加addToBackStack(),则当fragment被移除和替换时,直接被destroyed。下面我们看下代码清单 6-7:
// 创建fragment并给他一个参数用于确定选择文章的位置 ArticleFragment newFragment = new ArticleFragment(); Bundle args = new Bundle(); args.putInt(ArticleFragment.ARG_POSITION, position); newFragment.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); //我们需要把文章标题Fragment替换为文章内容Fragment // 我们添加了addToBackStack(),表示用户向后导航的时候fragment不会被destroyed transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // 提交 transaction.commit();
代码清单6-7
如果在addToBackStack()中传入null,表示你可能更高级的操作,例如使用FragmentManager.BackStackEntry。
6.4 与其他Fragment通信
为了重用Fragment的UI组件,你应该建立一个定义了自己的布局和行为的完全独立并模块化的组件。一旦你定义了这些可重用的 Fragment,你可以与Activity相关联,并与应用逻辑连接,以实现整体复合UI。通常情况下,你会想几个Fragment相互通信,例如基于 用户事件改变内容。所有Fragment的通信是通过相关的Activity。两个Fragment,不应该直接通信。
6.4.1定义一个接口
为了允许一个Fragment 与Activity通信, 你可以在Fragment类里定义一个接口并在Activity中实现此接口。Fragment在它的onAttach()生命周期方法中捕获接口的实 现,然后调用接口方法为了与Activity通信。下面让我们来看下代码清单6-8:
public class HeadlinesFragment extends ListFragment { OnHeadlineSelectedListener mCallback; // 容器Activity必须实现这个接口,用来传递消息 public interface OnHeadlineSelectedListener { public void onArticleSelected(int position); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // 确保容器Activity已经实现回调接口,如果没有则会抛出一个异常 try { mCallback = (OnHeadlineSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnHeadlineSelectedListener"); } } ... }
代码清单6-8
现在fragment能通过调用Activity中的onArticleSelected() 方法来传递消息了。等会我们将展示实现的代码。
例如下面的onListItemClick()方法,当用户点击fragment 中的list item时会调用此方法。我们这个fragment 使用这个回调接口传递事件到父类Activity。如代码清单6-9所示:
@Override public void onListItemClick(ListView l, View v, int position, long id) { //通知父类activity选择的item mCallback.onArticleSelected(position); }
代码清单6-9
6.4.2 实现一个接口
为了从fragment接收事件回调, 父类activity必须实现这个在fragment类中定义的接口。例如下面的代码实现了这个接口,如代码清单6-10所示:
public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener{ ... public void onArticleSelected(Uri articleUri) { //用户从HeadlinesFragment选择文章的标题 // do something } }
代码清单6-10
6.4.3 传递消息到Fragment
我们通过Fragment实例的findFragmentById()方法直接获取ArticleFragment。
关于接口的具体实现,下面让我们看下代码清单6-11:
public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener{ ... public void onArticleSelected(int position) { //用户从HeadlinesFragment选择文章的标题 //从 res/layout-large/获得文章 fragment ArticleFragment articleFrag = (ArticleFragment) getSupportFragmentManager().findFragmentById(R.id.article_fragment); if (articleFrag != null) { //如果articleFrag不为空,我们正在使用的是双面板布局(平板设备) //调用 ArticleFragment的这个方法来更新内容 articleFrag.updateArticleView(position); } else { //否则,我们使用的是单面板(手机设备) //创建fragment并给他传入一个参数用于确定选择文章的位置 ArticleFragment newFragment = new ArticleFragment(); Bundle args = new Bundle(); args.putInt(ArticleFragment.ARG_POSITION, position); newFragment.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); //我们需要把文章标题Fragment替换为文章内容Fragment //表示用户可以后退导航 transaction.replace(R.id.fragment_container、newFragment); transaction.addToBackStack(ヌル); // 最後に使用してトランザクションを提出し transaction.commitを(); } } }
リスト6-11
ます。https://www.cnblogs.com/Codenewbie/articles/2973165.htmlで再現