【问题标题】:Tabhost not updating tabs选项卡主机不更新选项卡
【发布时间】:2017-10-23 20:41:51
【问题描述】:

我正在尝试在项目中使用垂直选项卡,但无法让 tabhost 工作。我认为我没有从 Java 中获得正确的信息,但我不确定我做错了什么。只有很多例子,但它们似乎已经过时了。似乎 tabhost 发生了很大变化,所以我不确定正确的语法。这是我的 xml:

 <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/tabhost" ...>
    <LinearLayout android:orientation="horizontal"...>
        <FrameLayout ...>
            <TabWidget
                android:id="@android:id/tabs"
                android:visibility="gone" .../>

            <LinearLayout
                android:orientation="vertical" ...>

                <Button
                    android:id="@+id/button_map"
                    android:onClick="tabHandler" .../>

                <Button
                    android:id="@+id/button_chat"
                    android:onClick="tabHandler" .../>

                <Button
                    android:id="@+id/button_player_stat"
                    android:onClick="tabHandler" ... />

                <Button
                    android:id="@+id/button_dest_card"
                    android:onClick="tabHandler" .../>
            </LinearLayout>
        </FrameLayout>
        <FrameLayout android:id="@android:id/tabcontent" ...>

        <LinearLayout
            android:id="@+id/tab1"
            android:orientation="vertical" ...>

            <TextView
                android:text="This is tab 1" .../>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/tab2" 
            android:orientation="vertical" ...>

            <TextView
                android:text="This is tab 2" ... />
        </LinearLayout>
            </LinearLayout>
        </FrameLayout>
    </LinearLayout>
    </TabHost>

然后在 java 上我正在尝试这样做:

@Override
    protected void onCreate(Bundle savedInstanceState) {
       ....
        tabHost = (TabHost) findViewById(android.R.id.tabhost);
        tabHost.setup();
    }

然后是tabHandler

public void tabHandler(View target){
        button_map.setSelected(false);
        button_chat.setSelected(false);
        if(target.getId() == R.id.button_map){
            tabHost.setCurrentTab(0);
            button_map.setSelected(true);
        } else if(target.getId() == R.id.button_chat){
            tabHost.setCurrentTab(1);
            button_chat.setSelected(true);
        } 
        }

当我尝试运行它时,当我单击“选项卡”(我的按钮)时没有任何反应。代码到达了正确的位置,但我认为 findview() 获取了错误的 tabHost。在调试器上,我看到 tabhost currentTab 设置为 -1,这就是为什么我认为它是错误的 tabhost。我还尝试将 tabhost 从“@android:id/tabhost 更改为 @+id/tabhost,但是在使用 setup() 时会引发异常,它抱怨它应该是 @android:id/tabhost。任何帮助将不胜感激!

【问题讨论】:

    标签: java android android-tabhost


    【解决方案1】:

    不要在新应用中使用 TabHost 来实现选项卡。 Use a ViewPager 代替。

    如果符合您的用例,您还可以使用 Android 支持库中的底部导航视图。 Here is one relevant tutorial.

    【讨论】:

    • 不使用tabHost有什么原因吗? TabActivity 已被弃用,但 Tabhost 不是。当我搜索如何制作标签时,它似乎是一个相当常见的解决方案。
    • 正确,TabHost 类本身没有被弃用。然而,谷歌关于如何实现选项卡式导航的最新指南并没有提到它(这是我提供的第一个链接)。
    • 另外,developer.android.com/training/backward-compatible-ui/… 上的一些信息讨论了如果您需要支持旧版本的 Android,请使用 TabHost。你有这样的要求吗?
    • 不,我只是想知道为什么 viewPager 会更好。