java - 在片段内创建选项卡
问题描述
我有一个包含一个主要活动的应用程序,该活动有一个导航面板可以在片段之间切换。在一个片段中,我希望有选项卡可以在其他片段之间切换。我创建了一个可以从导航面板访问的单独片段:
public class EventsTabsFragment extends Fragment
{
private TabLayout events_tabs;
private ViewPager events_pager;
private static int int_items = 2;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState)
{
//the inflate() method takes the layout you wanna show as the first parameter
View view = inflater.inflate(R.layout.event_tabs, container, false);
//tabs for our fragment
events_tabs = view.findViewById(R.id.events_tabs);
events_pager = view.findViewById(R.id.events_pager);
events_pager.setAdapter(new MyAdapter(getChildFragmentManager()));
events_tabs.post(new Runnable() {
@Override
public void run() {
events_tabs.setupWithViewPager(events_pager);
}
});
return view;
}
class MyAdapter extends FragmentStatePagerAdapter
{
public MyAdapter(FragmentManager fm)
{
super(fm);
}
/**
* I WANNA SWITCH BETWEEN FRAGMENTS HERE
*/
@Override
public Fragment getItem(int position)
{
switch (position) {
case 0:
return new EventsActivity();
}
return null;
}
@Override
public int getCount()
{
return int_items;
}
/**
* This method returns the title of the tab according to the position.
*/
@Override
public CharSequence getPageTitle(int position)
{
switch (position)
{
case 0:
String main_events = "Events";
return main_events;
case 1:
String pending = "Pending event invites";
return pending;
}
return null;
}
}
}
它的 xml(event_tabs.xml) 使用TabLayout
andViewPager
并且看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/events_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
app:layout_constraintBottom_toTopOf="@+id/events"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/events_tab" />
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pending_invites_tab" />
</com.google.android.material.tabs.TabLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/events_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/events_tabs">
</androidx.viewpager.widget.ViewPager>
</androidx.constraintlayout.widget.ConstraintLayout>
似乎FragmentStatePagerAdapter
已被弃用。我不确定这是否会在运行程序后导致以下错误。
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
at androidx.fragment.app.FragmentTransaction.doAddOp(FragmentTransaction.java:245)
at androidx.fragment.app.BackStackRecord.doAddOp(BackStackRecord.java:180)
at androidx.fragment.app.FragmentTransaction.add(FragmentTransaction.java:234)
at androidx.fragment.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:173)
at androidx.viewpager.widget.ViewPager.addNewItem(ViewPager.java:1010)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1224)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
at android.view.View.measure(View.java:24510)
at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:763)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:426)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:105)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:247)
at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:117)
at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1532)
at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1607)
at android.view.View.measure(View.java:24510)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:24510)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1204)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:723)
at android.view.View.measure(View.java:24510)
at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1156)
at android.view.View.measure(View.java:24510)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:146)
at android.view.View.measure(View.java:24510)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24510)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:24510)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24510)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:736)
at android.view.View.measure(View.java:24510)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3004)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1833)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2122)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1721)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7595)
E/AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966)
at android.view.Choreographer.doCallbacks(Choreographer.java:790)
at android.view.Choreographer.doFrame(Choreographer.java:725)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7319)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934)
FragmentStatePagerAdapter
现在不支持在片段内创建选项卡有更好的解决方案吗?
解决方案
您应该按照FragmentStatePagerAdapter弃用通知中的建议使用FragmentStateAdapter以及ViewPager2 。
推荐阅读
- aws-lambda - 如何通过 boto3 更新 DynamoDB 表中的地图列表?
- python - 为不同的不和谐服务器存储变量
- javascript - Mocha 合约测试错误:在钩子中多次调用 Done()
- c# - GLSL:如何将 alpha 混合包含到带照明的片段着色器中
- node.js - 为 Storybook for React 创建开放的 80 端口
- android - Android 自定义库模块 BindingAdapter 属性无法识别
- java - 如何在java中使用过滤函数过滤匹配的字符串行
- java - 具有 manyToOne 关系的休眠自定义类型
- python - 在不更改底层 numpy 数组的情况下修改 pandas 列
- r - R 错误:在以“'C:\U”开头的字符串中使用了没有十六进制数字的“\U”