Android 3.0では、フラグメントの新しい概念が導入されています。これにより、さまざまな画面サイズのインターフェイスの操作が簡単になります。 このトピックは、android-developers.blogspot.comの記事の翻訳です。 フラグメントの利点について説明し、この原則に基づいて動作するアプリケーションのシンプルだが完全な例を提供します。Android 3.0の重要な目標は、画面のサイズに応じてスケーリングする必要があるプログラムの作成を簡素化することです。 このため、次のツールがAndroidプラットフォームですでに利用可能です。
- UIフレームワークは最初からレイアウトマネージャーを使用するように設計されていたため、サイズに「適合する」ようにインターフェイスを記述することができました。 この例はListViewで、その高さは画面サイズに応じて異なり、QVGA、HVGA、およびWVGAの比率によって異なります。
- Android 1.6では、画面密度の新しい概念が導入されました。これにより、画面の物理サイズはほぼ同じですが、アプリケーションが異なる解像度間で簡単にスケーリングできるようになります。 開発者は、Droidなどの高解像度の携帯電話が導入されたときにすぐにこの機能の使用を開始しました。
- また、Android 1.6では、分類を使用して開発者が画面サイズを使用できるようになりました。QVGAの比率は「小」、HVGAとWVGAは「標準」、大画面は「大」です。 開発者は、リソースシステムを使用して、画面サイズに応じて異なるレイアウトを選択できます。
レイアウトマネージャーとさまざまなリソースの選択の組み合わせは、スケーラブルなインターフェイスを作成する長い道のりを表しています。 その結果、多くのハンドセットアプリケーションは、ハニカムで動作するタブレット用の特別なインターフェイスを使用しません。
フラグメントの概要
Android 3.0では、アプリケーションがフラグメントと呼ばれるインターフェースのスケーリングを支援する新しいクラスのサポートを導入しています。 フラグメントは、独自のインターフェースとライフサイクルを持つ独立したコンポーネントです。 特定のデバイスまたは画面に必要なUIストリームに応じて、ユーザーインターフェイスのさまざまな部分で繰り返し使用できます。
ある意味では、フラグメントをミニアクティビティと見なすことができますが、個別に起動することはできず、アクティビティ内に配置する必要があります。 実際、フラグメントAPIの導入により、アクティビティの操作時に開発者が直面した多くの問題を解決する機会が与えられました。フラグメントの有用性は、さまざまな画面解像度の通常の設定をはるかに超えているためです。
- ActivityGroupにネストされたアクティビティは良いアイデアでしたが、Activityはもともと独立したコンポーネントとして開発されていたため、操作が簡単ではありませんでした。 Fragment APIはこのためのはるかに優れたソリューションであり、ネストされたアクティビティの代替と見なす必要があります。
- Activityインスタンスのデータの保存は、Activity.onRetainNonConfigurationInstance()を使用して実行できますが、これはそれ自体が不格好であり、明らかではありません。 フラグメントはこのメカニズムに代わるもので、フラグを設定するだけでフラグメントのインスタンス全体を保存できます。
- フラグメントのインスタンス化の1つはDialogFragmentです。これは、アクティビティライフサイクルの一部として管理されるダイアログの表示を単純化します。 ダイアログの管理に使用されるアクティビティAPIを置き換えます。
- フラグメントの別のインスタンスはListFragmentで、データのリストの表示を簡素化します。 ListFragmentはListActivityに似ています(いくつかの追加機能を備えています)。その使用により、リスト内のデータの表示が簡単になります。
- アクティビティに添付されたすべてのフラグメントに関する情報は、フレームワークによって同じアクティビティの保存された状態に保存され、再起動時に復元されます。 したがって、保存される状態の数が削減されます。
- このフレームワークには、フラグメントのスタックを管理するための組み込みサポートがあり、アクティビティ内の[戻る]ボタンの動作のサポートが簡素化され、この動作は既存のアクティビティスタックと統合されます。
はじめに
これは、フラグメントを使用して複数のUIスレッドを実装する単純ですが完全な例です。 左側の要素のリストと右側の要素のデータを含むランドスケープレイアウトの設計から始めましょう。 必要なレイアウトは次のとおりです。
Activityのコードは特に興味深いものではなく、次のレイアウトでsetContentView()を呼び出すだけです。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment class="com.example.android.apis.app.TitlesFragment" android:id="@+id/titles" android:layout_weight="1" android:layout_width="0px" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/details" android:layout_weight="1" android:layout_width="0px" android:layout_height="match_parent" /> </LinearLayout>
最初の機能に気付くかもしれません:タグ
<fragment>
インターフェイス階層にフラグメントを設定できます。 上記のフラグメントはListFragmentプロパティを継承します。このプロパティは、レイアウトに応じて、現在の場所または別のアクティビティにある要素のデータを表示します。 フラグメント状態の変更がどのように保存されるかに注意してください。
public static class TitlesFragment extends ListFragment { boolean mDualPane; int mCurCheckPosition = 0; @Override public void onActivityCreated(Bundle savedState) { super.onActivityCreated(savedState);
また、通常のTextViewの要素にデータを表示するDetailsFragmentを実装する必要があります。
public static class DetailsFragment extends Fragment { public static DetailsFragment newInstance(int index) { DetailsFragment f = new DetailsFragment();
もう1つのUIスレッドをアプリケーションに追加します。 画面がポートレートモードの場合、2つのフラグメントを並べて表示するのに十分なスペースがありません。 つまり、リストのみを表示する必要があります。
縦向きの新しいレイアウトを書きましょう:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment class="com.example.android.apis.app.TitlesFragment" android:id="@+id/titles" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
これで、TitlesFragmentのデータを表示するコンテナがなくなり、リストのみが表示されます。 リスト項目をクリックすると、データが表示される別のアクティビティを呼び出す必要があります。
今、私たちに必要なのは、すでに準備されたDetailsFragmentを使用することです:
public static class DetailsActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
Activityを接続することにより、現在使用されている構成に基づいて、ストリームのUIの根本的な変更を使用するアプリケーションの完全に機能する例を取得します。 また、構成を変更すると、アプリケーションは画面サイズの要件に合わせて自動的に調整されます。
この例は、UIに合わせてフラグメントを使用する1つの方法を示しています。 デザインによっては、他のものを好む場合があります。 たとえば、アプリケーション全体を1つのアクティビティに入れることができます。このアクティビティでは、フラグメントの構造が変更されます。
いつものように、より多くの情報はSDKドキュメントにあります。 ApiDemosでも例を見つけることができます。
皆のための断片化
Fragment APIは、Android 3.0用に設計されたタブレット指向のアプリケーションで作業を開始する開発者に役立ちます。多くの場合、大画面が含まれます。 また、フラグメントを使用すると、TVなどのAndroid上の新しいデバイス用のアプリケーションのUIを簡単に構成できるようになります。
ただし、現在、Fragment APIは、タブレット用の電話用の既存のアプリケーションのインターフェースを改善するために最も需要があります。
また、フラグメントAPI(
Hurray !!! )を使用する静的ライブラリを作成して、以前のバージョンのAndroidで上記のメソッドを使用することも計画されています。 実際、この例のすべてのコードは静的クラスライブラリのみを使用し、Android 2.3で実行されます(Android 3.0 SDKの例と比較できますが、ほとんど違いはありません)。 私たちの目標は、これらのAPIを可能な限り類似させて、Android 3.0にアップグレードする時期に関係なく、すぐに作業を開始できるようにすることです。
ライブラリが利用可能になる正確な日付はまだありませんが、間違いなくすぐになります。 今のところ、Android 3.0でフラグメントの操作を開始できます。