1. ホーム
  2. android

[解決済み] Android 4.0, 4.1 (<4.2) でサポートライブラリを使用せずにネストされたフラグメントを使用するためのベストプラクティス

2022-09-16 12:02:36

質問

4.0 および 4.1 タブレット用のアプリを書いています。 サポート ライブラリを使用したくありません。 (必要でなければ) 4.x api のみであるためです。

私のターゲットプラットフォームは、次のように非常によく定義されています: >= 4.0 および <= 4.1

このアプリは、マルチペインのレイアウト(2 つのフラグメント、左側に小さなフラグメント、右側に 1 つのコンテンツのフラグメント)と、タブを持つアクション バーを備えています。

これに似ています。

アクションバーのタブをクリックすると、「外側」のフラグメントが変更され、そのときの内側のフラグメントは、2つのフラグメントが入れ子になったフラグメント(1.左の小さなリストフラグメント、2.幅の広いコンテンツフラグメント)になっています。

私は今、フラグメント、特にネストされたフラグメントを置き換えるためのベストプラクティスが何であるかについて考えています。 ViewPager はサポート ライブラリの一部であり、このクラスのネイティブの 4.x 代替はありません。私の感覚では、「非推奨」であるように見えます。 - http://developer.android.com/reference/android/support/v4/view/ViewPager.html

それから、Android 4.2 のリリースノートを読みました。 ChildFragmentManager に関するリリースノートを読みましたが、4.0 と 4.1 をターゲットにしているので、これも使えません。

ChildFragmentManager は4.2のみ使用可能です

残念ながら、サポート ライブラリなしでフラグメントを使用するためのベスト プラクティスを示す良い例は、Android 開発者ガイド全体でも、ほとんどありません。

サポート ライブラリやそれに付随するすべてを使用せずに、ネストされたフラグメントで 4.1 アプリを書くことは、単純に不可能なのでしょうか。(Fragment の代わりに FragmentActivity を使用する必要がある、など?)? また、ベストプラクティスは何でしょうか?


現在、私が開発で抱えている問題は、まさにこの文言です。

<ブロッククオート

Android サポートライブラリは、ネストされたフラグメントをサポートするようになりました。 Android 1.6以降でネストされたフラグメントデザインを実装できます。

注意:レイアウトがフラグメントに含まれる場合、レイアウトをフラグメントに展開することはできません。 が含まれる場合、レイアウトをフラグメントに展開することはできません。 <fragment> . ネストされたフラグメントは、動的にフラグメントに追加された場合のみサポートされます。 に動的に追加された場合のみサポートされます。

ネストされたフラグメントをXMLで定義すると、どうやら以下のようなエラーが発生するようです。

Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_

現時点での自分なりの結論は、2.xプラットフォームをターゲットにする気もない4.1でも、スクリーンショットにあるようなネストしたフラグメントはサポートライブラリなしでは不可能である、ということです。

(これは実際には質問というより wiki エントリかもしれませんが、もしかしたら誰かが以前にそれを管理しているかもしれません)。

更新しました。

参考になる回答があります。 フラグメントの中のフラグメント

どのように解決するのですか?

制限事項

そのため、どのバージョンの FragmentManager のどのバージョンを使ってもできません。

そのため、コードでフラグメントを追加しなければなりません。これは問題のように思えるかもしれませんが、長い目で見れば、レイアウトを超柔軟にすることになります。

そのため getChildFragmentManger ? の背後にある本質は childFragmentManager の背後にある本質は、前のフラグメントのトランザクションが終了するまでロードを延期することです。そしてもちろん、それは 4.2 またはサポート ライブラリにおいてのみ自然にサポートされました。

ChildManager を使用しないネスト - 解決策

解決策、確かに!私はずっと前から、( ViewPager が発表されて以来)。

下記参照;これは Fragment であり、読み込みを延期するため Fragment はその内部で読み込むことができます。

は非常にシンプルで Handler は本当に本当に便利なクラスで、効果的にハンドラは現在のフラグメントトランザクションがコミットを終えた後にメインスレッド上で実行するスペースを待ちます (フラグメントがメインスレッド上で実行される UI に干渉するため)。

// Remember this is an example, you will need to modify to work with your code
private final Handler handler = new Handler();
private Runnable runPager;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    return inflater.inflate(R.layout.frag_layout, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    runPager = new Runnable() {

        @Override
        public void run()
        {
          getFragmentManager().beginTransaction().addFragment(R.id.frag_container, MyFragment.newInstance()).commit();
        }
    };
    handler.post(runPager);
}

/**
 * @see android.support.v4.app.Fragment#onPause()
 */
@Override
public void onPause()
{
    super.onPause();
    handler.removeCallbacks(runPager);
}

私はこれを「ベストプラクティス」とは考えませんが、このハックを使ったライブのアプリがあり、まだ何の問題も発生していません。

私はまた、ビューページャーを埋め込むためにこの方法を使っています。 https://gist.github.com/chrisjenx/3405429