Android 在 Fragment 中添加选项卡
Posted
技术标签:
【中文标题】Android 在 Fragment 中添加选项卡【英文标题】:Android Adding Tab inside Fragment 【发布时间】:2014-02-17 07:55:05 【问题描述】:我正在尝试在片段中添加 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;
这给了我错误...需要此代码的助手...
LogCat:
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。我会将此作为答案提交,但我没有代码示例,我最终会被否决.. 【参考方案1】:如果您的目标是 API17 +,我相信这对您有用。 如果没有,你应该看看ViewContainers, and swipeable views。
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;
【讨论】:
公共类 MainActivity 扩展 FragmentActivity 实现 TabHost.OnTabChangeListener 啊,我的错。您是否尝试在 MainActivity 视图中有一个“主”选项卡?或者片段控制器内部的选项卡控制器,用于其中一个片段内部的选项卡式用户界面? 我有标签,如果 MainActivity 并且我试图在片段内有标签 @JonnyWright 试试这个:maxalley.wordpress.com/2013/05/18/… @CantThinkOfAnything 是的,您可以使用 SimpleGestureListener 以编程方式使它们可滑动。【参考方案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;
【讨论】:
布局是什么样的?【参考方案3】: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
【讨论】:
【参考方案4】:如果您使用:https://***.com/a/34224495/1386969
确保布局看起来像:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".view.user.DetailsFragment">
<TabHost
android:id="@+id/tabhost"
android:layout_
android:layout_>
<TabWidget
android:id="@android:id/tabs"
android:layout_
android:layout_>
</TabWidget>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_
android:layout_>
</FrameLayout>
</TabHost>
【讨论】:
以上是关于Android 在 Fragment 中添加选项卡的主要内容,如果未能解决你的问题,请参考以下文章
使用Fragment完成Tab选项卡-Android Fragment应用实战
调用onclick时Android从Fragment更改Tab
使用Fragment完成Tab选项卡-Android Fragment应用实战
Fragment、Volley 和 RecyclerView
Android FragmentTabHost popBackStack() 导致 IllegalStateException Fragment 已添加