1

ドキュメントは、フラグメントが別の方法で機能するように設計されているため、フラグメントをネストするべきではないと述べています。だが!

範囲

しかし、ViewPagerを使用していて、そのフラグメント(表示されている画面)を他のフラグメントから構築する必要がある場合はどうなりますか。メッセンジャーアプリがあるとしましょう。メイン画面には「最後のメッセージ」(MessagesFragment)と呼ばれるフラグメントを含むViewPagerがあり、サブメイン画面(たとえばディスカッションまたはチャットルーム)にもViewPagerがありますが、メッセージ画面はMessagesFragment、NewMessageBarFragment、および他の情報を含むヘッダーフラグメントで構成されています。

問題

そのためにViewPagerを使用するべきではなく、ViewFlowオープンソースライブラリを使用することもできますが、そのようなアクティビティで保持されているコードはフラグメントでも混乱していると私は信じています。また、MessagesFragment内のNewMessageBarとHeaderInfoのフラグメントではなく、余分なレイアウトを埋めるアプローチもありますが、私にとっては2倍醜いです。

質問

この特定の状況でネストされたフラグメントを使用しても大丈夫ですか?あなたは何をお勧めします?

更新

時々それは本当に「必須」機能です。だが!ほとんどの場合、「レスポンシブデザイン」の方法に従うことをお勧めします:http://www.slideshare.net/kirillcool/sensitive-mobile-design-in-practice

4

3 に答える 3

5

クイックアップデート:

ネストされたは、 AndroidAPIバージョン17Fragmentで正式に導入されました。

于 2012-11-13T20:57:05.067 に答える
2

しかし、ViewPagerを使用していて、そのフラグメント(表示されている画面)を他のフラグメントから構築する必要がある場合はどうなりますか。

そうしないでください。

この特定の状況でネストされたフラグメントを使用しても大丈夫ですか?

絶対にありません

あなたは何をお勧めします?

「外側の」フラグメントを単純なレイアウトに置き換えます。PagerAdapter次に、それ自体がフラグメントを必要としない他の実装を使用します(FragmentPagerAdapterインターフェースも同様です)。FragmentPagerAdapterこれがすべてうまく機能することを確認するために、からいくつかのコードをつまむ必要があるかもしれません。

または、「MessagesFragment、NewMessageBarFragment、たとえばヘッダーフラグメントと他の情報」を1つのフラグメントに結合して、このページャーの動作を希望する画面サイズで使用します。これにより、画面サイズが小さい場合にUIのその部分が個別に分割されるため、コードがある程度重複する可能性があります。

于 2011-10-31T14:09:31.117 に答える
1

これが私の解決策です。これで、フラグメントからgetChildFragmentManagerを使用できます。これは新しいSupportLibraryに含まれています。私の本番ソリューションでは、最初にフラグメントが存在するかどうかをテストし、必要な場合にのみ追加します。

public class TestActivity extends SherlockFragmentActivity {

    private ViewPager mPager;

    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        setContentView(R.layout.pager);
        mPager = (ViewPager) findViewById(R.id.viewPager);
        mPager.setAdapter(new TestAdapter(getSupportFragmentManager()));
    }

    public class TestAdapter extends FragmentStatePagerAdapter {

        public TestAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return TestFragment.newInstance(position);
        }

        @Override
        public int getCount() {
            return 4;
        }
    }

    public static class TestFragment extends SherlockFragment {

        private static final int ID = 9129345;
        private static final String ARG_INDEX = "TestFragment.pageindex";

        public static TestFragment newInstance(int page) {
            TestFragment fragment = new TestFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_INDEX, page);
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.root_container, null);
            int pageId = getArguments().getInt(ARG_INDEX);

            FragmentTransaction transaction = getChildFragmentManager().beginTransaction();

            transaction.add(R.id.live_radio, TextFragment.newInstance("PAGE", pageId + 1));
            transaction.add(R.id.breaking_news, TextFragment.newInstance("TEXT", 1));
            transaction.add(R.id.main_container, TextFragment.newInstance("TEXT", 2));


            transaction.commit();

            return view;
        }

    }

    public static class TextFragment extends SherlockFragment {

        private static final String ARG_INDEX = "TextFragment.index";
        private static final String ARG_TEXT = "TextFragment.text";

        public static TextFragment newInstance(String text, int index) {
            TextFragment fragment = new TextFragment();
            Bundle args = new Bundle();
            args.putString(ARG_TEXT, text);
            args.putInt(ARG_INDEX, index);
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,   Bundle savedInstanceState) {
            TextView textView = new TextView(getActivity());
            textView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            textView.setText(getArguments().getString(ARG_TEXT) + " " + getArguments().getInt(ARG_INDEX));
            return textView;
        }

    }

}

ビューページャーを使用したメインレイアウト

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/player"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/player"
        android:layout_alignParentTop="true" >
    </android.support.v4.view.ViewPager>

</RelativeLayout>

フラグメントレイアウト

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:id="@+id/live_radio"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <FrameLayout
        android:id="@+id/breaking_news"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <FrameLayout
        android:id="@+id/main_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</LinearLayout>
于 2012-11-16T09:25:56.017 に答える