带有多个片段的 ActionBar 选项卡

编程入门 行业动态 更新时间:2024-10-23 09:32:10
本文介绍了带有多个片段的 ActionBar 选项卡的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我一直在尝试更新我的应用程序并开始使用片段,操作栏,以及我错过的所有其他 UI 功能.一世明白我可以在一个活动中有多个片段,有基于设备和所有好东西的不同布局,但是我正在努力按照我想要的方式获取一些标签内容.一世了解如何添加标签,在它们之间切换,但我如何拥有一个选项卡中有多个片段?所以例如我基本上有两个我希望用户能够来回切换的屏幕很容易(为什么我想使用标签).如果我有两个单独的活动,我可以在 xml 文件中指定它并使用布局使用 setContentView下面

I've been trying to update my app and get going with fragments, the action bar, and all the other UI features that I'm missing out on. I understand I can have multiple fragments in an activity, have different layouts based upon the device and all that good stuff but I'm struggling with getting some tab stuff the way I want. I understand how to add tabs, switching between them but how do I have more than one fragment in a tab? So for example I have essentially two screens I want the user to be able to switch back and forth from easily (why I want to use tabs). If I have two separate activities I can specify this in xml files and use setContentView using the layouts below

tab1_layout.xml

tab1_layout.xml

<LinearLayout xmlns:android="schemas.android/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <fragment android:name="com.example.tabrefactor.Fragment1" android:id="@+id/fragment_1" android:layout_height="wrap_content" android:layout_width="wrap_content"/> <fragment android:name="com.example.tabrefactor.Fragment2" android:id="@+id/fragment_2" android:layout_height="wrap_content" android:layout_width="wrap_content"/> <fragment android:name="com.example.tabrefactor.Fragment3" android:id="@+id/fragment_3" android:layout_height="wrap_content" android:layout_width="wrap_content"/> </LinearLayout>

tab2_layout.xml

tab2_layout.xml

<LinearLayout xmlns:android="schemas.android/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <fragment android:name="com.example.tabrefactor.Fragment4" android:id="@+id/fragment_4" android:layout_height="wrap_content" android:layout_width="wrap_content"/> </LinearLayout>

我可以将第二个布局转换为使用选项卡,因为它只包含一个片段,但我不确定如何将第一个布局合并为一个标签.这是允许的吗?提前致谢,

I can convert the second layout to using tabs since its only contains one fragment but I'm not sure how get the first layout into a single tab. Is that something that's allowed? Thanks in advance,

杰森·普林格

推荐答案

如果有人有简化或更好的想法,我将保持开放状态...

I'll leave this open incase someone has a simplification or a better idea...

最终采用了一种具有 3 个框架布局的基本布局的解决方法...

Eventually went with a workaround of having a base layout with 3 frame layouts...

<LinearLayout xmlns:android="schemas.android/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/fragment_sb" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/fragment_local" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/fragment_rest" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout>

然后在我的标签活动中,我制作了一个自定义 TabListener 来处理之间的更改.我使用的代码如下(我使用的是 actionbarsherlock,所以它看起来与正常的东西略有不同)

Then in my activity with the tabs I made a custom TabListener that handled the changes between. The code I used is below (I'm using actionbarsherlock so it'll look slightly different than the normal stuff)

public class TabActivity extends FragmentActivity { Fragment1 fragment1; Fragment2 fragment2; Fragment3 fragment3; Fragment4 fragment4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout); final ActionBar bar = getSupportActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); bar.setDisplayShowTitleEnabled(true); bar.setDisplayShowHomeEnabled(false); bar.setTitle("Title"); bar.addTab(bar.newTab() .setIcon(R.drawable.ic_list_tab_selected) .setTabListener(new ListTabListener(this))); bar.addTab(bar.newTab() .setIcon(R.drawable.ic_map_tab_selected) .setTabListener(new MapTabListener(this))); if (savedInstanceState != null) { bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.test_menu, menu); return super.onCreateOptionsMenu(menu); } public static class ListTabListener implements ActionBar.TabListener { private static final String fragment1Tag = "fragment1_tag"; private static final String fragment2Tag = "fragment2_tag"; private static final String fragment3Tag = "fragment3_tag"; private FragmentActivity activity; private Fragment1 fragment1; private Fragment2 fragment2; private Fragment3 fragment3; public ListTabListener(FragmentActivity activity) { this.activity = activity; FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); fragment1 = (Fragment1) activity.getSupportFragmentManager().findFragmentByTag(fragment1Tag); if (fragment1 != null && !fragment1.isDetached()) { ft.detach(fragment1); } fragment2 = (Fragment2) activity.getSupportFragmentManager().findFragmentByTag(fragment1Tag); if (fragment2 != null && !fragment2.isDetached()) { ft.detach(fragment2); } fragment3 = (Fragment3) activity.getSupportFragmentManager().findFragmentByTag(fragment1Tag); if (fragment3 != null && !fragment3.isDetached()) { ft.detach(fragment3); } ftmit(); } @Override public void onTabReselected(Tab tab, FragmentTransaction nullFt) { //Reselected don't do anything } @Override public void onTabSelected(Tab tab, FragmentTransaction nullFt) { FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); if(fragment1 == null) { fragment1 = new Fragment1(); ft.add(R.id.fragment_sb, fragment1, fragment1Tag); } else { ft.attach(fragment1); } if(fragment2 == null) { fragment2 = new Fragment2(); ft.add(R.id.fragment_local, fragment2, fragment2Tag); } else { ft.attach(fragment2); } if(fragment3 == null) { fragment3 = new Fragment3(); ft.add(R.id.fragment_rest, fragment3, fragment3Tag); } else { ft.attach(fragment3); } ftmit(); } @Override public void onTabUnselected(Tab tab, FragmentTransaction nullFt) { FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); if(fragment1 != null) ft.detach(fragment1); if(fragment2 != null) ft.detach(fragment2); if(fragment3 != null) ft.detach(fragment3); ftmit(); } } public static class MapTabListener implements ActionBar.TabListener { private static final String fragment4Tag = "fragment4_tag"; private FragmentActivity activity; private Fragment4 fragment4; public MapTabListener(FragmentActivity activity) { this.activity = activity; FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); fragment4 = (Fragment4) activity.getSupportFragmentManager().findFragmentByTag(fragment4Tag); if (fragment4 != null && !fragment4.isDetached()) { ft.detach(fragment4); } ftmit(); } @Override public void onTabReselected(Tab tab, FragmentTransaction nullFt) { //Reselected don't do anything } @Override public void onTabSelected(Tab tab, FragmentTransaction nullFt) { FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); if(fragment4 == null) { fragment4 = new Fragment4(); ft.add(R.id.fragment_rest, fragment4, fragment4Tag); } else { ft.attach(fragment4); } ftmit(); } @Override public void onTabUnselected(Tab tab, FragmentTransaction nullFt) { FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); if(fragment4 != null) ft.detach(fragment4); ftmit(); } } }

更多推荐

带有多个片段的 ActionBar 选项卡

本文发布于:2023-11-27 21:11:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1639618.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多个   选项卡   片段   ActionBar

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!