1

文档说你不应该嵌套碎片,因为它们被设计为以另一种方式工作。但!

范围

但是如果我使用 ViewPager 并且它的片段(可见屏幕)应该由其他片段构造。假设我们有一个信使应用程序。在主屏幕上有一个 ViewPager 带有名为“最后一条消息”(MessagesFragment) 的片段,在子主屏幕上(比如讨论或聊天室)我们也有一个 ViewPager 但消息屏幕由 MessagesFragment、NewMessageBarFragment 和例如带有其他信息的标题片段组成.

问题

有人可以说我们不应该为此使用 ViewPager,我们可以使用 ViewFlow 开源库,但相信我,在这样的活动中保存的代码即使有片段也是一团糟。还有一种方法可以填充额外的布局,而不是 MessagesFragment 中 NewMessageBar 和 HeaderInfo 的片段 - 但对我来说它是双重丑陋的。

问题

在这种特殊情况下可以使用嵌套片段吗?你会推荐什么?

更新

有时它确实是“必备”功能。但!在大多数情况下,我建议遵循“响应式设计”方式:http ://www.slideshare.net/kirillcool/responsive-mobile-design-in-practice

4

3 回答 3

5

快速更新:

嵌套是在Android API 版本 17Fragment中正式引入的。

于 2012-11-13T20:57:05.067 回答
2

但是如果我使用 ViewPager 并且它的片段(可见屏幕)应该由其他片段构造。

不要那样做。

在这种特殊情况下可以使用嵌套片段吗?

绝对不是

你会推荐什么?

用简单的布局替换你的“外部”片段。然后使用其他一些PagerAdapter本身不需要片段的实现(就像FragmentPagerAdapter接口一样)。您可能需要从中提取一些代码FragmentPagerAdapter以确保一切正常。

或者,将“MessagesFragment、NewMessageBarFragment 和例如标题片段与其他信息”组合成一个片段,用于您希望具有此寻呼机行为的屏幕尺寸。这可能会导致一定数量的代码重复,以便为较小的屏幕尺寸单独拆分 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;
        }

    }

}

带有 viewpager 的主布局

<?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 回答