当父项不是活动而是片段时的空选项卡
Empty tab when parent is not an activty but a fragment
我有一个 运行 Android 带有导航抽屉的应用程序 Activity。对于每个菜单项,我想实现一个单独的片段,这样我就可以使用相同的工具栏和抽屉菜单。现在,其中一个 Fragments 应该包含一个带有 3 个选项卡的视图(3 个带有 Recyclerviews 的 Fragments)。我创建了一个 Tabbed Activity 并将代码迁移到一个新的 Fragment 中。
当我第一次单击带有 Tab-Fragment 的菜单项时,它工作得很好。但是当我浏览菜单然后再次打开 Tab-Fragment 时,它显示了 3 个选项卡,但其中什么也没有。现在,当我单击第三个选项卡时,会显示数据。当我切换回第一个选项卡时,数据也回来了。只有中间的 Tab 保持空白。
我在一个全新的空项目上尝试了这种方法,只有一个导航抽屉 activity 和一个选项卡 activity,我还将代码迁移到一个片段中。我只使用了 Android-Studio (3.4.2) 生成的代码。这些选项卡中只有文本视图,但仍然存在同样的问题。
Tab-Fragment(从生成的 Tabbed Acitvity 迁移代码):
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
v = inflater.inflate(R.layout.activity_tab, container, false);
context = getActivity().getApplicationContext();
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(context, getActivity().getSupportFragmentManager());
ViewPager viewPager = v.findViewById(R.id.view_pager);
viewPager.setAdapter(sectionsPagerAdapter);
TabLayout tabs = v.findViewById(R.id.tabs);
tabs.setupWithViewPager(viewPager);
return v;
}
生成的 SectionsPagerAdapter:
public class SectionsPagerAdapter extends FragmentPagerAdapter {
@StringRes
private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2};
private final Context mContext;
public SectionsPagerAdapter(Context context, FragmentManager fm) {
super(fm);
mContext = context;
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position + 1);
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return "Some Title";
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
}
我只更改了"getCount"中的Tabs数量和"getPageTitle"中返回的String
我使用 NavigationItemSelectedListener 处理导航抽屉 Activity(主要)中的菜单项点击,并像这样更改 Fragment:
getSupportFragmentManager().beginTransaction().replace(R.id.content, new TabFragment()).commit();
"activity_tab" 布局如下所示:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
是否有可能在菜单项点击时继续使用 Fragments,或者我是否必须使用 Tabbed Activity?
首先,我认为你应该使用 childFragmentManager 而不是 supportFragmentManager。
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(context, getChildFragmentManager());
我有一个 运行 Android 带有导航抽屉的应用程序 Activity。对于每个菜单项,我想实现一个单独的片段,这样我就可以使用相同的工具栏和抽屉菜单。现在,其中一个 Fragments 应该包含一个带有 3 个选项卡的视图(3 个带有 Recyclerviews 的 Fragments)。我创建了一个 Tabbed Activity 并将代码迁移到一个新的 Fragment 中。 当我第一次单击带有 Tab-Fragment 的菜单项时,它工作得很好。但是当我浏览菜单然后再次打开 Tab-Fragment 时,它显示了 3 个选项卡,但其中什么也没有。现在,当我单击第三个选项卡时,会显示数据。当我切换回第一个选项卡时,数据也回来了。只有中间的 Tab 保持空白。
我在一个全新的空项目上尝试了这种方法,只有一个导航抽屉 activity 和一个选项卡 activity,我还将代码迁移到一个片段中。我只使用了 Android-Studio (3.4.2) 生成的代码。这些选项卡中只有文本视图,但仍然存在同样的问题。
Tab-Fragment(从生成的 Tabbed Acitvity 迁移代码):
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
v = inflater.inflate(R.layout.activity_tab, container, false);
context = getActivity().getApplicationContext();
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(context, getActivity().getSupportFragmentManager());
ViewPager viewPager = v.findViewById(R.id.view_pager);
viewPager.setAdapter(sectionsPagerAdapter);
TabLayout tabs = v.findViewById(R.id.tabs);
tabs.setupWithViewPager(viewPager);
return v;
}
生成的 SectionsPagerAdapter:
public class SectionsPagerAdapter extends FragmentPagerAdapter {
@StringRes
private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2};
private final Context mContext;
public SectionsPagerAdapter(Context context, FragmentManager fm) {
super(fm);
mContext = context;
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position + 1);
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return "Some Title";
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
}
我只更改了"getCount"中的Tabs数量和"getPageTitle"中返回的String
我使用 NavigationItemSelectedListener 处理导航抽屉 Activity(主要)中的菜单项点击,并像这样更改 Fragment:
getSupportFragmentManager().beginTransaction().replace(R.id.content, new TabFragment()).commit();
"activity_tab" 布局如下所示:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
是否有可能在菜单项点击时继续使用 Fragments,或者我是否必须使用 Tabbed Activity?
首先,我认为你应该使用 childFragmentManager 而不是 supportFragmentManager。
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(context, getChildFragmentManager());