【问题标题】:Android. Tablayout inside a tab of another tablayout安卓。另一个选项卡布局的选项卡内的选项卡布局
【发布时间】:2016-08-18 14:46:12
【问题描述】:

是否可以在另一个选项卡布局的选项卡内有一个选项卡布局?我创建了以下图像以获得更好的解释。所需的滑动动作如图所示。

我的主要活动

Xml

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMode="fixed"
            app:tabGravity="fill"/>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"  />

</android.support.design.widget.CoordinatorLayout>

代码

public class MainActivity extends AppCompatActivity {

    private TabLayout tabLayout;

    private final static int[] tabIcons = {
            R.drawable.ic_tab_1,
            R.drawable.ic_tab_2,
            R.drawable.ic_tab_3,
            R.drawable.ic_tab_4
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        setupTabIcons();
    }

    private void setupTabIcons() {
        tabLayout.getTabAt(0).setIcon(tabIcons[0]);
        tabLayout.getTabAt(1).setIcon(tabIcons[1]);
        tabLayout.getTabAt(2).setIcon(tabIcons[2]);
        tabLayout.getTabAt(3).setIcon(tabIcons[3]);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new Fragment1());
        adapter.addFrag(new Fragment2());
        adapter.addFrag(new Fragment3());
        adapter.addFrag(new Fragment4());
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {

        private final List<Fragment> mFragmentList = new ArrayList<>();

        ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        void addFrag(Fragment fragment) {
            mFragmentList.add(fragment);
        }
    }
}

片段

Xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:background="@android:color/holo_blue_light"
    android:id="@+id/fragment_1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="myContext">

    <TextView
        android:text="It is just a text."
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

代码

public class Fragment1 extends Fragment {

    public Fragment1() { }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment.
        return inflater.inflate(R.layout.fragment_1, container, false);
    }
}

Fragment2_A 和 Fragment2_B XML 和 Java 代码应该如何?

【问题讨论】:

  • 为什么不可能?我不明白还是什么?
  • 还有什么问题?据我所知,将ViewPager 保留在Fragment 中并保留在另一个ViewPager 中是没有问题的。并且默认行为就像您希望的那样 - 当在 Fragment 内部放置另一个 ViewPager 时,它会“吞下”触摸事件直到边框,然后当它无法滑动时,它会将 MotionEvent 传递给父级。你能显示你的R.layout.fragment_1 吗?您的 R.layout.fragment_2 应该包含另一个具有自己 ID 的 TabLayout
  • @snachmsm 问题用R.layout.fragment_1 编辑。对不起,我只是一个Android初学者,没有问题^^只是我没有找到直接的解决方案。我的问题是第一个布局是在一个活动中声明的,但第二个我不知道在哪里声明它,因为我有两个片段Fragment2_AFragment2_B,而不是一个活动。

标签: android android-fragments android-viewpager slide android-tablayout


【解决方案1】:

好的,所以在你的片段中你只有TextView。现在为fragment_2 放置另一个TabLayoutViewPager(你不需要AppBarCoordinator,它们已经从Activity 的父布局中出现了)

frag2.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <android.support.design.widget.TabLayout
        android:id="@+id/frag2_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="fixed"
        app:tabGravity="fill"/>
    <android.support.v4.view.ViewPager
        android:id="@+id/frag2_viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"  />
</LinearLayout>

您必须创建 Frag2 Fragment ,在 OnCreateView 内使用上述布局初始化,然后为 frag2_viewpager ViewPager 类设置另一个适配器为 frag2a.xmlfrag2b.xml Fragments 仅,他们可以让我们假设只有TextViews 或其他。 TabLayout 将被放置在上面,在 Frag2 内(和一个在 Activity 中,如图所示)

【讨论】:

  • 我必须将TabLayout 放在Fragment2_AFragment2_B 两个片段中?
  • 查看编辑。简而言之:只需使用Frag2,在其中为另一个片段创建另一个适配器。 TabBar 将只是 Frag2Frag2aFrag2b 中的一个(另一个),如您所愿初始化。图片上的滑动功能(实际上是触摸事件传递)将开箱即用
  • 好的,如果我理解正确的话,我有 3 个片段用于此选项卡。 RootFrag2Frag2_AFrag2_B。最后这两个是正常的片段。在根目录中,我为这两个片段创建了另一个适配器(我刚刚将主要活动改编为片段)。但是我在setupViewPager 方法声明中使用getSupportFragmentManager() 得到一个错误。 Cannot resolve method 'getSupportFragmentManager()'.
  • How can I access getSupportFragmentManager() in a fragment? 请注意,您在Fragment 中始终有getActivity() 方法,可能会有所帮助(((MainActivity) getActivity()).methodInsideMainActivity()
  • 不需要。 RecyclerView 有自己的“内存”用于携带Fragments,默认情况下它设置为 1。这意味着回收器保持一个视图/片段左右(当然是当前),以便在没有“滞后”的情况下平滑刷卡的可能性绘制另一个整个屏幕。您可以使用setOffscreenPageLimit 增加此值。但是,如果您的应用程序崩溃,则意味着您可能在 Frag2 或任何 Frag2children 中存在错误,当Fragment 被删除(分离)时发生
【解决方案2】:

我知道这不是问题的直接答案,我可能会因此受到惩罚,但你不应该在标签中嵌套标签。谷歌使用称为材料设计的设计概念。选项卡的规则之一是不要嵌套它们。这是该页面的链接:https://material.google.com/components/tabs.html#tabs-usage。我认为,作为开发人员,我们必须遵循这一点,才能使 Android 平台尽可能地通用和令人惊叹。

谢谢, 橡木

【讨论】:

  • 我什至没有意识到这一点,非常感谢你这么说,老实说。
【解决方案3】:

简单

一切都将保持相同,就像您在Activity中设置ViewPager一样。只是你需要在 Fragment 中使用getChildFragmentManager() 而不是getFragmentManager()

来自getChildFragmentManager() documentation

返回一个私有的 FragmentManager 用于放置和管理 Fragment 在这个 Fragment 内部。

来自getFragmentManager() documentation

返回 FragmentManager 用于与关联的 Fragment 进行交互 与此片段的活动。

完整代码见@this answer

【讨论】:

    猜你喜欢
    • 2015-10-28
    • 2016-06-12
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多