Android:FragmentPagerAdapter 无法与 ViewPager 和 material TabLayout 一起使用
Android: FragmentPagerAdapter not working with ViewPager and material TabLayout
我正在设置一个 ViewPager
,它将根据 material 中 TabLayout
中的选定选项卡呈现片段。我有一个片段将把所有这些渲染为父视图(我不知道这是否是原因。),我正在做所有这些流程,因为我想将数据流设置为Master Detail flow
其中一个 activity 将显示 2 个片段,其中一个将有一个寻呼机显示 ViewPager
中的另一个片段
所以同时具有 TabLayout
和 ViewPager
的片段具有如下定义的 class:
public class InstructionsFragment extends Fragment {
private static final String TAG = InstructionsFragment.class.getSimpleName();
private TabLayout instructionsTab;
private ViewPager instructionsPager;
private int recipeIndex;
public InstructionsFragment(int recipeIndex) {
this.recipeIndex = recipeIndex;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_instructions, container, false);
this.loadViews(rootView);
return rootView;
}
@Override
public void onStart() {
super.onStart();
this.loadPager();
}
private void loadViews(View view) {
Log.i(TAG, "Loading views");
this.instructionsTab = view.findViewById(R.id.recipe_instructions_tabs);
this.instructionsPager = view.findViewById(R.id.recipe_instructions_pager);
this.instructionsTab.setupWithViewPager(this.instructionsPager);
}
private void loadPager() {
Log.i(TAG, "Loading pager");
FragmentManager fragmentManager = this.getFragmentManager();
IngredientsFragment ingredientsFragment = new IngredientsFragment(recipeIndex);
InstructionsPagerAdapter instructionsAdapter = new InstructionsPagerAdapter(fragmentManager, 0);
instructionsAdapter.addFragment(ingredientsFragment);
this.instructionsPager.setAdapter(instructionsAdapter);
}
此片段使用如下定义的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/instructions_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.tabs.TabLayout
android:id="@+id/recipe_instructions_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/recipe_detail_tab_ingredients_label" />
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/recipe_detail_tab_steps_label" />
</com.google.android.material.tabs.TabLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/recipe_instructions_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
所以基本上有 2 个静态选项卡,我只想测试一个,因为即使我删除了其中一个选项卡,它仍然不起作用。
FragmentPagerAdater
在class中定义如下:
public class InstructionsPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments = new ArrayList<>();
public InstructionsPagerAdapter(@NonNull FragmentManager fm, int behavior) {
super(fm, behavior);
}
public void addFragment(Fragment fragment) {
this.fragments.add(fragment);
}
@NonNull
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
当转到显示 InstructionsFragment
的 activity 时,由于某些原因,选项卡没有显示,默认情况下也没有选择片段。我确实做了一些调试,看看是否有错误,或者 viewPager 选择的片段是否是 运行,我在 logcat
中没有看到任何错误日志,而选择的片段实际上是 运行,所以我不知道如何继续。
这是屏幕显示我已实现的所有代码的方式:
这是不加载寻呼机代码时的样子:
我是 运行 Android 9
上的应用程序,这些是我项目中的依赖项:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
因为我不能post在评论中的代码是我做同样事情的方式,它在一个片段中工作
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.addFragment(new PickPowerballTickets(), getResources().getString(R.string.powerball));
adapter.addFragment(new PickMegaMillionsTickets(), getResources().getString(R.string.megamillions));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_pick_my_tickets, container, false);
viewPager = (ViewPager) view.findViewById(R.id.pager);
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(2);
tabLayout = (TabLayout) view.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
return view;
}
这是我的寻呼机适配器
public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
我能够通过动态添加选项卡使其工作,看起来 material 中的 TabsLayout
在使用 [=12= 时不支持在布局中使用一组静态选项卡]. ViewPager
必须有一个适配器,它为要在 ViewPager
.
中显示的 selected 片段提供选项卡的标题
FragmentPagerAdapter
的结束代码如下所示:
public class InstructionsPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments = new ArrayList<>();
private List<String> pageTitles = new ArrayList<>();
public InstructionsPagerAdapter(@NonNull FragmentManager fm, int behavior) {
super(fm, behavior);
}
public void addFragment(Fragment fragment, String tabTitle) {
this.fragments.add(fragment);
this.pageTitles.add(tabTitle);
}
@NonNull
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return this.pageTitles.get(position);
}
}
添加片段的标题列表,并在select编辑片段时select它。
我正在设置一个 ViewPager
,它将根据 material 中 TabLayout
中的选定选项卡呈现片段。我有一个片段将把所有这些渲染为父视图(我不知道这是否是原因。),我正在做所有这些流程,因为我想将数据流设置为Master Detail flow
其中一个 activity 将显示 2 个片段,其中一个将有一个寻呼机显示 ViewPager
所以同时具有 TabLayout
和 ViewPager
的片段具有如下定义的 class:
public class InstructionsFragment extends Fragment {
private static final String TAG = InstructionsFragment.class.getSimpleName();
private TabLayout instructionsTab;
private ViewPager instructionsPager;
private int recipeIndex;
public InstructionsFragment(int recipeIndex) {
this.recipeIndex = recipeIndex;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_instructions, container, false);
this.loadViews(rootView);
return rootView;
}
@Override
public void onStart() {
super.onStart();
this.loadPager();
}
private void loadViews(View view) {
Log.i(TAG, "Loading views");
this.instructionsTab = view.findViewById(R.id.recipe_instructions_tabs);
this.instructionsPager = view.findViewById(R.id.recipe_instructions_pager);
this.instructionsTab.setupWithViewPager(this.instructionsPager);
}
private void loadPager() {
Log.i(TAG, "Loading pager");
FragmentManager fragmentManager = this.getFragmentManager();
IngredientsFragment ingredientsFragment = new IngredientsFragment(recipeIndex);
InstructionsPagerAdapter instructionsAdapter = new InstructionsPagerAdapter(fragmentManager, 0);
instructionsAdapter.addFragment(ingredientsFragment);
this.instructionsPager.setAdapter(instructionsAdapter);
}
此片段使用如下定义的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/instructions_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.tabs.TabLayout
android:id="@+id/recipe_instructions_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/recipe_detail_tab_ingredients_label" />
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/recipe_detail_tab_steps_label" />
</com.google.android.material.tabs.TabLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/recipe_instructions_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
所以基本上有 2 个静态选项卡,我只想测试一个,因为即使我删除了其中一个选项卡,它仍然不起作用。
FragmentPagerAdater
在class中定义如下:
public class InstructionsPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments = new ArrayList<>();
public InstructionsPagerAdapter(@NonNull FragmentManager fm, int behavior) {
super(fm, behavior);
}
public void addFragment(Fragment fragment) {
this.fragments.add(fragment);
}
@NonNull
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
当转到显示 InstructionsFragment
的 activity 时,由于某些原因,选项卡没有显示,默认情况下也没有选择片段。我确实做了一些调试,看看是否有错误,或者 viewPager 选择的片段是否是 运行,我在 logcat
中没有看到任何错误日志,而选择的片段实际上是 运行,所以我不知道如何继续。
这是屏幕显示我已实现的所有代码的方式:
这是不加载寻呼机代码时的样子:
我是 运行 Android 9
上的应用程序,这些是我项目中的依赖项:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
因为我不能post在评论中的代码是我做同样事情的方式,它在一个片段中工作
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.addFragment(new PickPowerballTickets(), getResources().getString(R.string.powerball));
adapter.addFragment(new PickMegaMillionsTickets(), getResources().getString(R.string.megamillions));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_pick_my_tickets, container, false);
viewPager = (ViewPager) view.findViewById(R.id.pager);
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(2);
tabLayout = (TabLayout) view.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
return view;
}
这是我的寻呼机适配器
public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
我能够通过动态添加选项卡使其工作,看起来 material 中的 TabsLayout
在使用 [=12= 时不支持在布局中使用一组静态选项卡]. ViewPager
必须有一个适配器,它为要在 ViewPager
.
FragmentPagerAdapter
的结束代码如下所示:
public class InstructionsPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments = new ArrayList<>();
private List<String> pageTitles = new ArrayList<>();
public InstructionsPagerAdapter(@NonNull FragmentManager fm, int behavior) {
super(fm, behavior);
}
public void addFragment(Fragment fragment, String tabTitle) {
this.fragments.add(fragment);
this.pageTitles.add(tabTitle);
}
@NonNull
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return this.pageTitles.get(position);
}
}
添加片段的标题列表,并在select编辑片段时select它。