在Fragment中添加选项卡的Android实现

7

我正在尝试在一个片段中添加TabHost ......以下是代码。在此片段中,我尝试添加TabHost以显示两个选项卡。

public class TablesFragment extends Fragment {

TabHost tabHost;
TabHost.TabSpec spec;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.tables_fragment, container,
            false);
    tabHost = (TabHost) rootView.findViewById(android.R.id.tabhost);
    tabHost.setup();

    Intent intentAndroid = new Intent().setClass(getActivity(),
            NewsFragment.class);
    spec = tabHost.newTabSpec("Android").setContent(intentAndroid)
            .setIndicator("Android");
    tabHost.addTab(spec);

    Intent intentBus = new Intent().setClass(getActivity(), NewsFragment.class);
    spec = tabHost.newTabSpec("Welcome").setIndicator("Welcome")
            .setContent(intentBus).setIndicator("Welcome");
    tabHost.addTab(spec);
    return rootView;
}

这个代码给我报错了...需要帮助...

日志:

01-26 16:21:27.092: E/AndroidRuntime(5597): FATAL EXCEPTION: main
01-26 16:21:27.092: E/AndroidRuntime(5597): java.lang.IllegalStateException: Did you    forget to call 'public void setup(LocalActivityManager activityGroup)'?
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:692)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.widget.TabHost.setCurrentTab(TabHost.java:358)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.widget.TabHost.addTab(TabHost.java:236)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at com.fifaworldcup2014.TablesFragment.onCreateView(TablesFragment.java:31)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at com.fifaworldcup2014.MainActivity.onTabChanged(MainActivity.java:164)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.widget.TabHost.invokeOnTabChangeListener(TabHost.java:391)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.widget.TabHost.setCurrentTab(TabHost.java:376)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:546)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.view.View.performClick(View.java:4084)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.view.View$PerformClick.run(View.java:16966)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.os.Handler.handleCallback(Handler.java:615)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.os.Looper.loop(Looper.java:137)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at android.app.ActivityThread.main(ActivityThread.java:4745)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at java.lang.reflect.Method.invokeNative(Native Method)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at java.lang.reflect.Method.invoke(Method.java:511)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-26 16:21:27.092: E/AndroidRuntime(5597):     at dalvik.system.NativeStart.main(Native Method)

我知道这已经过去将近一年了,但是使用针对API17的v22兼容库并使用TabLayout,我已经能够在顶层活动中添加选项卡,为每个选项卡添加片段,然后向这些片段添加TabLayout并获取第二级选项卡并添加片段(嵌套)。当将子片段添加到片段时,必须使用getChildFragmentManager。我会把这个作为答案提交,但我没有代码示例,最终可能会被踩。 - BK-
4个回答

11

我相信如果你的目标是API17+,这对你可能有用。 否则,你应该看一下ViewContainers和可滑动视图

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTabHost;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class TabHostParentFragment extends Fragment {

private FragmentTabHost tabHost;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
tabHost = new FragmentTabHost(getActivity());
tabHost.setup(getActivity(), getChildFragmentManager(), R.layout.my_parent_fragment);

Bundle arg1 = new Bundle();
arg1.putInt("Arg for Frag1", 1);
tabHost.addTab(tabHost.newTabSpec("Tab1").setIndicator("Frag Tab1"),
    NewsFragment.class, arg1);

Bundle arg2 = new Bundle();
arg2.putInt("Arg for Frag2", 2);
tabHost.addTab(tabHost.newTabSpec("Tab2").setIndicator("Frag Tab2"),
    MyNestedFragment2.class, arg2);

return tabHost;
}

1
公共类 MainActivity 扩展了 FragmentActivity 并实现了 TabHost.OnTabChangeListener 接口 - MKDenys
编辑了我的答案,我相信其中一个应该可以解决问题,无论您是否使用API 17。 - chriskvik
谢谢!花了五个小时寻找解决这个问题的方案。 - MKDenys
1
@JonnyWright 请尝试遵循以下步骤:https://maxalley.wordpress.com/2013/05/18/android-creating-a-tab-layout-with-fragmenttabhost-and-fragments/。 - chriskvik
1
@CantThinkOfAnything 是的,你可以通过编程使用SimpleGestureListener使它们可滑动。 - chriskvik
显示剩余5条评论

2

请查看下面的代码,如果您仍在寻找答案,它一定会帮助您,并且它将适用于旧版本的API 11。

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AnalogClock;
import android.widget.TabHost;

public class TabFragment extends Fragment {

    private TabHost mTabHost;
    View rootView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.tabinterview, container, false);
        mTabHost = (TabHost) rootView.findViewById(R.id.tabhost);
        mTabHost.setup();
        TabHost.TabSpec spec = mTabHost.newTabSpec("tag");
        spec.setIndicator("Android");
        spec.setContent(new TabHost.TabContentFactory() {

            @Override
            public View createTabContent(String tag) {
                // TODO Auto-generated method stub
                return (new AnalogClock(getActivity()));
            }
        });
        mTabHost.addTab(spec);
        spec = mTabHost.newTabSpec("tag1");
        spec.setIndicator("java");
        spec.setContent(new TabHost.TabContentFactory() {

            @Override
            public View createTabContent(String tag) {
                // TODO Auto-generated method stub
                return (new AnalogClock(getActivity()));
            }
        });
        mTabHost.addTab(spec);
        spec = mTabHost.newTabSpec("tag2");
        spec.setIndicator("Favourate");
        spec.setContent(new TabHost.TabContentFactory() {

            @Override
            public View createTabContent(String tag) {
                // TODO Auto-generated method stub
                return (new AnalogClock(getActivity()));
            }
        });
        mTabHost.addTab(spec);
        return rootView;
    }
}

2
布局长什么样? - Lion789

0

如果您使用的是:https://dev59.com/WXvaa4cB1Zd3GeqPHcI_#34224495

请确保布局如下:

<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=".view.user.DetailsFragment">

<TabHost
    android:id="@+id/tabhost"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

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

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


0
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AnalogClock;
import android.widget.TabHost;

public class TabFragment extends Fragment {

    private TabHost mTabHost;
    View rootView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.tabinterview, container, false);
        mTabHost = (TabHost) rootView.findViewById(R.id.tabhost);
        mTabHost.setup();
        TabHost.TabSpec spec = mTabHost.newTabSpec("tag");
        spec.setIndicator("Android");
        spec.setContent(new TabHost.TabContentFactory() {

            @Override
            public View createTabContent(String tag) {
                // TODO Auto-generated method stub
                return (new AnalogClock(getActivity()));
            }
        });
        mTabHost.addTab(spec);
        spec = mTabHost.newTabSpec("tag1");
        spec.setIndicator("java");
        spec.setContent(new TabHost.TabContentFactory() {

            @Override
            public View createTabContent(String tag) {
                // TODO Auto-generated method stub
                return (new AnalogClock(getActivity()));
            }
        });
        mTabHost.addTab(spec);
        spec = mTabHost.newTabSpec("tag2");
        spec.setIndicator("Favourate");
        spec.setContent(new TabHost.TabContentFactory() {

            @Override
            public View createTabContent(String tag) {
                // TODO Auto-generated method stub
                return (new AnalogClock(getActivity()));
            }
        });
        mTabHost.addTab(spec);
        return rootView;
    }
}

this code how to give Page Link

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接