【问题标题】:FragmentTabHost Setup ErrorFragmentTabHost 设置错误
【发布时间】:2015-12-29 08:45:55
【问题描述】:

我正在尝试使用FragmentTabHost 实现嵌套片段,但是我不断收到setup() 函数的错误。代码如下。

这是我的课程文件

public class ForumFragment extends Fragment{
private FragmentTabHost mTabHost;
public ForumFragment() {
    // Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_forum,container,false);


    mTabHost = (FragmentTabHost) view.findViewById(android.R.id.tabhost);
    mTabHost.setup(getActivity(), getChildFragmentManager(),android.R.id.tabcontent);

    mTabHost.addTab(mTabHost.newTabSpec("Tab1").setIndicator("DBoard"), DiscussionBoardFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("Tab2").setIndicator("Events"), EventsFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("Tab3").setIndicator("HW Help"), HWHelpFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("Tab4").setIndicator("Classifieds"), ClassifiedsFragment.class, null);

    return view;

}

这是我的 XML 文件

<TabHost
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"
android:id="@+id/tabhost">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        </TabWidget>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <RelativeLayout
                android:id="@+id/DBoard"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"></RelativeLayout>

            <RelativeLayout
                android:id="@+id/Events"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"></RelativeLayout>

            <RelativeLayout
                android:id="@+id/HWHelp"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"></RelativeLayout>
            <RelativeLayout
                android:id="@+id/Classifieds"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"></RelativeLayout>

        </FrameLayout>
    </LinearLayout>

这是我收到的错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentTabHost.setup(android.content.Context, android.support.v4.app.FragmentManager, int)' on a null object reference
                                                                                     at com.ForumFragment.onCreateView(ForumFragment.java:30)
                                                                                     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
                                                                                     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                                     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
                                                                                     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
                                                                                     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
                                                                                     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
                                                                                     at android.os.Handler.handleCallback(Handler.java:739)
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                     at android.os.Looper.loop(Looper.java:145)
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:6897)
                                                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                                                     at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

【问题讨论】:

  • 使用R.id.tabhost 而不是android.R.id.tabhost
  • 将其更改为 R.id.tabhost 时出现意外的转换错误
  • 而不是getChildFragmentManager(),您应该使用getSupportFragmentManager() 以获得更多帮助,请参阅developer.android.com/reference/android/support/v4/app/…
  • 该链接是我用作参考的链接,并且使用了 getChildFragmentManager() ..

标签: android android-fragments android-studio fragment-tab-host android-nested-fragment


【解决方案1】:

改变

mTabHost.setup(getActivity(), getChildFragmentManager(),android.R.id.tabcontent);

mTabHost.setup(getActivity(), getSupportFragmentManager(),android.R.id.tabcontent);

【讨论】:

    【解决方案2】:

    您必须将您的片段转换为 android.support.v4.app.Fragment 因为您使用的是 android.support.v4.app.FragmentTabHost 并且它是 仅支持 android.support.v4.app.Fragment。

    阅读这一行android.support.v4.app.FragmentTabHost.setup(android.content.Context, android.support.v4.app.FragmentManager, int)

    【讨论】:

      【解决方案3】:

      问题出在这一行:
      mTabHost = (FragmentTabHost) view.findViewById(android.R.id.tabhost);

      您需要扩充自己的 R 文件,而不是 android.R。只需将其更改为:

      mTabHost = (FragmentTabHost) view.findViewById(R.id.tabhost);

      并在 XML 文件中将 &lt;TabHost 更改为 &lt;android.support.v4.app.FragmentTabHost

      【讨论】:

      • 当我将 android.R 更改为 R.id 时。我收到一个类型转换错误。
      • 是的,您需要转换为 TabHost,而不是 FragmentTabHost。请参阅编辑后的答案。同时将 mTab​​Host 声明为 TabHost
      • @LuciusHipan 他正在使用FragmentTabHost,根据他写的代码见这个链接:developer.android.com/reference/android/support/v4/app/…有一个错误,而不是getChildFragmentManager(),他应该使用getSupportFragmentManager()
      • 你是对的,你能添加你的答案吗?还是编辑我的?
      • 使用 getSupportFragmentManager() 我也得到一个错误,我应该导入什么吗?
      【解决方案4】:

      Android Studio 不提供依赖项,因此您必须手动导入它们。文件 > 项目结构 > 应用程序(在“模块”下)> 依赖项选项卡。点击底部的“+”添加一个库依赖;在本例中为“support-v4”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 2015-04-18
        • 2017-05-09
        • 1970-01-01
        相关资源
        最近更新 更多