148

我看到一些关于这个的喋喋不休,但没有确定的。有没有办法将 TabWidget 中的选项卡放在屏幕底部?如果是这样,怎么做?

我尝试了以下方法,但没有奏效:

a) 将 tabwidget 设置在 framelayout 下方
b) 将 tabwidget 的重力设置为“bottom”

谢谢!拉帕尔

4

10 回答 10

272

这是在屏幕底部获取选项卡的最简单、最强大且可扩展的解决方案。

  1. 在您的垂直 LinearLayout 中,将 FrameLayout 放在 TabWidget 上方
  2. 在 FrameLayout 和 TabWidget 上都 设置layout_heightwrap_content
  3. 设置 FrameLayout 的android:layout_weight="1"
  4. 设置 TabWidget android:layout_weight="0"(默认为 0,但为了强调、可读性等)
  5. 设置 TabWidget android:layout_marginBottom="-4dp"(移除底部分隔线)

完整代码:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:layout_weight="1"/>

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:layout_marginBottom="-4dp"/>

    </LinearLayout>

</TabHost>
于 2010-04-25T23:40:31.437 回答
38

试试看 ;) 只看 FrameLayout(@id/tabcontent) 的内容,因为我不知道在滚动的情况下它会如何处理......在我的情况下它可以工作,因为我使用 ListView 作为我的选项卡的内容. :) 希望能帮助到你。

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <RelativeLayout 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent">
        <FrameLayout android:id="@android:id/tabcontent"
             android:layout_width="fill_parent" 
             android:layout_height="fill_parent"
             android:layout_alignParentTop="true" 
             android:layout_above="@android:id/tabs" />
    <TabWidget android:id="@android:id/tabs"
             android:layout_width="fill_parent" 
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true" />
    </RelativeLayout>
</TabHost>
于 2010-08-20T18:31:40.023 回答
11

有一种方法可以删除线。

1)按照本教程: android-tabs-with-fragments

2)然后应用Leaudro上面建议的RelativeLayout更改(将布局道具应用于所有FrameLayouts)。

您还可以将 ImageView 添加到第 1 项中的 tab.xml 并获得非常类似于 iPhone 的选项卡外观。

这是我现在正在处理的屏幕截图。我还有一些工作要做,主要是为图标做一个选择器并确保水平分布相等,但你明白了。就我而言,我使用的是片段,但相同的原则应该适用于标准选项卡视图。

在此处输入图像描述

于 2011-11-02T02:42:48.557 回答
3

对于所有试图删除 tabWidget 分隔线的人,这里有一个示例项目(及其各自的教程),它非常适合自定义选项卡,从而在选项卡位于底部时消除问题。Eclipse 项目:android-custom-tabs;原文解释:博客;希望这有帮助。

于 2011-04-13T13:04:53.517 回答
3

有两种方法可以在选项卡活动的底部显示选项卡。

  1. 使用相对布局
  2. 使用 Layout_weight 属性

请检查链接以获取更多详细信息

于 2011-09-20T16:31:14.617 回答
3

不确定它是否适用于所有版本的 Android(尤其是那些具有自定义 UI 内容的版本),但我能够通过添加删除底部的灰色条

 android:layout_marginBottom="-3dp"

到 TabWidget XML...

于 2011-07-29T23:52:55.687 回答
1

尝试将它们放在屏幕底部时,我遇到了与 android 选项卡相同的问题。我的场景是不使用布局文件并在代码中创建选项卡,我还希望从每个选项卡中触发活动,这使用其他方法似乎有点过于复杂,所以,这里是克服问题的示例代码:

在 android 中添加标签并放置它们

于 2011-01-29T18:29:58.807 回答
1

这可能不是您正在寻找的(将您的选项卡发送到屏幕底部不是一个“简单”的解决方案),但仍然是一个有趣的替代解决方案,我想向您指出:

ScrollableTabHost旨在表现得像 TabHost,但有一个额外的滚动视图以适应更多项目......

也许深入研究这个开源项目,您会找到问题的答案。如果我看到任何更容易的事情,我会回到你身边。

于 2010-03-07T18:12:47.767 回答
1

是的,请参阅:链接,但他使用 xml 布局,而不是活动来创建新选项卡,所以把他的 xml 代码(为 FrameLayout 设置 paddingTop - 0px)然后编写代码:

public class SomeActivity extends ActivityGroup {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

    TabHost tab_host = (TabHost) findViewById(R.id.edit_item_tab_host); 

    tab_host.setup(this.getLocalActivityManager());

    TabSpec ts1 = tab_host.newTabSpec("TAB_DATE"); 
    ts1.setIndicator("tab1"); 
    ts1.setContent(new Intent(this, Registration.class)); 
    tab_host.addTab(ts1); 

    TabSpec ts2 = tab_host.newTabSpec("TAB_GEO"); 
    ts2.setIndicator("tab2"); 
    ts2.setContent(new Intent(this, Login.class)); 
    tab_host.addTab(ts2); 

    TabSpec ts3 = tab_host.newTabSpec("TAB_TEXT"); 
    ts3.setIndicator("tab3"); 
    ts3.setContent(new Intent(this, Registration.class)); 
    tab_host.addTab(ts3); 

    tab_host.setCurrentTab(0);      


}

}

于 2010-03-30T05:44:39.480 回答
0

我建议将此代码用于稳定工作,它针对选项卡中的嵌套片段(例如嵌套 MapFragment)进行了优化,并在“不保留活动”上进行了测试:https ://stackoverflow.com/a/23150258/2765497

于 2014-04-18T09:12:07.487 回答