如何在Android中从片段编程方式切换选项卡?

28

我已经实现了一个继承自FragmentActivityTabActivity,其中有5个选项卡,每个选项卡都是一个Fragment。我想要做的是在程序中实现选项卡之间的切换。

例如:如果我在第四个选项卡,当点击按钮时,我想从tab4切换到tab1。尝试了很多次,但没找到解决方法。

我已经尝试了以下方法,但没有效果。

来自第二个选项卡

public void switchTabInActivity(String value){
    FirstTab parent;
    parent = (FirstTab) getActivity().getParent();
    parent.switchTab(value);
}

TabActivity

  /** To Change Tab*/
public void switchTab(String tabno){ 
    this.onTabChanged(tabno);
}
7个回答

31

要为材料支持切换TabLayout,可以通过以下方式从Fragment中执行:

1)发送一个广播,由父Activity接收并修改选项卡。

context.sendBroadcast(yourintent);

2.) Vino的回答的改进版,

TabLayout tabhost = (TabLayout) getActivity().findViewById(R.id.tabLayout);
tabhost.getTabAt(2).select();

tablayout是您主xml中定义的tablayout的ID。


5
没问题,它可以正常工作。只是要提醒一下,标签的索引是从0开始的。 - Rakesh Patil
嗨@ Kennedy,我的tabhost没有被初始化。它显示为空。NullPointerException的错误可能是什么? - Sandeep Yohans
现在它可以工作了,错误是因为我的一个愚蠢的错误。 :) - Sandeep Yohans
你好!有人可以帮我吗?我遇到了一个错误:无法解析方法'getActivity()' - Lloyd Dominic
@LloydDominic 确保你正在使用片段进行工作。 - Kennedy Nyaga

21

最后,我可以使用以下代码从片段(Fragments)中以编程方式切换选项卡:

  TabHost host = (TabHost) getActivity().findViewById(android.R.id.tabhost);
  host.setCurrentTab(2);

希望它能帮助某个人。


1
android.R.id.tabhost 会抛出 nullpointerexception 异常。您已经调用了 getActivity.findViewById。使用 findViewById(R.id.tabhost) 是正确的选项。 - Ojonugwa Jude Ochalifu

19

我在我的主活动中使用TabLayout而不是已弃用的TabHost(带有片段),其中包含选项卡。在我的第一个选项卡片段中,我有一个点击侦听器,用于更改我的MainActivity中的当前选项卡。

我通过以下代码在片段的onCreateView()方法中成功更改了当前选项卡。

TabLayout tabs = (TabLayout)((MainActivity)getActivity()).findViewById(R.id.tabs);
tabs.getTabAt(1).select();

2
这是工作的答案... 上面的不起作用,因为即使我们通过构造函数传递它,TabLayout 在片段中仍然为空。 - Mehtab

7

请参考这个回答:https://dev59.com/rVXTa4cB1Zd3GeqP3qZq#5460651

意思是让你查看该链接中的回复。该链接提供了关于如何在Python中打印调试语句的详细解释,可以帮助您在编写代码时进行调试。
((TabActivity) getParent()).getTabHost().setCurrentTab(2)

@Vino 这是来自 Fragment 的代码。getParent() 是 Fragment 中的一个方法,用于返回 Activity。 - ataulm
1
@Vino 试试用 getActivity() 替代 getParent() - TomTasche
请使用switchTab()并将其转换为您的具体实现,而不是使用已被弃用的TabActivity。 - ataulm
在您的TabActivity中实现一个名为getTabHost()的方法,该方法返回TabHost... - TomTasche
找到了答案,Tom。我已经回答了我的问题。感谢您的支持。 - vinothp
显示剩余3条评论

5
如果您使用的是TabLayout而不是TabHost,我建议对BENN1TH的答案进行修改,这对我很有效。
  TabLayout tabs = getActivity().findViewById(R.id.tab_layout);
  tabs.getTabAt(tabNumber).select(); 

(区别在于R.id.tab_layout


1
对于Kotlin,请使用此表单片段。
 activity!!.<tab_id_in_xml>.getTabAt(tab_number)!!.select()

0

这里是另一种“新”Kotlin的方法:

requireActivity().findViewById<TabLayout>(R.id.tab_layout)?.getTabAt(destinationTabNumber)?.select()

使用?.而不是!!来避免断言。


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