我使用下面的代碼在 Fragment 中設定我的 TabLayout。問題是,即使我使用了registerOnPageChangeCallback(). 當我將包含 tablayout 的片段添加到底部導航視圖時,然后在滑動 tablayout 時會轉到沒有片段的白屏。我究竟做錯了什么?如果我在活動中使用 tablayout,它可以像往常一樣滑動。
public class BookcaseFragment extends Fragment {
private TabLayout tabLayout;
private ViewPager2 mViewPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_bookcase, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
tabLayout = view.findViewById(R.id.tab_layout_bookcase);
mViewPager = view.findViewById(R.id.bookcase_viewpager);
BookcaseViewPagerAdapter adapter = new BookcaseViewPagerAdapter(this);
mViewPager.setAdapter(adapter);
new TabLayoutMediator(tabLayout, mViewPager, (tab, position) -> {
switch (position){
case 0:
tab.setText("following");
break;
case 1:
tab.setText("downloaded");
break;
case 2:
tab.setText("watched");
break;
}
}).attach();
mViewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
tabLayout.getTabAt(position).select();
System.out.println(position);
}
});
}
}
public class BookcaseViewPagerAdapter extends FragmentStateAdapter {
public BookcaseViewPagerAdapter(@NonNull Fragment fragment) {
super(fragment);
}
@NonNull
@Override
public Fragment createFragment(int position) {
switch (position){
case 0:
return new FollowingFragment();
case 1:
return new DownloadedFragment();
case 2:
return new JustWatchedFragment();
default:
return new FollowingFragment();
}
}
@Override
public int getItemCount() {
return 3;
}
}
uj5u.com熱心網友回復:
這可能是由于 viewpager 為空引起的。您是否在片段本身中制作了viewpager?
只要我將 viewpager 放在片段 xml 中,我就可以讓它滑動。
用 kotlin 寫的,對不起,但應該還是一樣的想法。
class BookcaseFragment : Fragment() {
private var tabLayout: TabLayout? = null
private var mViewPager: ViewPager2? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_bookcase, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
tabLayout = view.findViewById(R.id.tab_layout_bookcase)
mViewPager = view.findViewById(R.id.bookcase_pager)
val adapter = BookcaseViewPagerAdapter(this)
adapter.addFragment(BlankFragment())
adapter.addFragment(BlankFragment())
adapter.addFragment(BlankFragment())
mViewPager?.adapter = adapter
tabLayout?.let { tabs->
mViewPager?.let { pager->
TabLayoutMediator(tabs, pager,
TabConfigurationStrategy { tab: TabLayout.Tab, position: Int ->
when (position) {
0 -> tab.text = "following"
1 -> tab.text = "downloaded"
2 -> tab.text = "watched"
}
}).attach()
pager.registerOnPageChangeCallback(object : OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
tabs.getTabAt(position)!!.select()
println(position)
}
})
}
}
}
}
class BookcaseViewPagerAdapter(fragment: Fragment) :
FragmentStateAdapter(fragment) {
private val arrayList: ArrayList<Fragment> = ArrayList()
fun getItem(position: Int): Fragment {
return arrayList[position]
}
fun addFragment(fragment: Fragment) {
arrayList.add(fragment)
}
override fun getItemCount(): Int {
return arrayList.size
}
override fun createFragment(position: Int): Fragment {
return arrayList[position]
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BookcaseFragment">
<androidx.viewpager2.widget.ViewPager2
android:id="@ id/bookcase_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.viewpager2.widget.ViewPager2>
<com.google.android.material.tabs.TabLayout
android:id="@ id/tab_layout_bookcase"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</com.google.android.material.tabs.TabLayout>
</FrameLayout>
您可以在此答案中找到更多資訊。在 Android 中正確實作 ViewPager2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513341.html
