如何将控件添加到 Android 中的选项卡布局?

Posted

技术标签:

【中文标题】如何将控件添加到 Android 中的选项卡布局?【英文标题】:How to add controls to a Tab Layout in Android? 【发布时间】:2011-02-04 07:42:59 【问题描述】:

我正在关注本教程https://developer.android.com/guide/tutorials/views/hello-tabwidget.html 并已完成。现在我实际上想在这些选项卡中添加一些控件,例如文本框(文本编辑)。

我该怎么做?我使用 eclipse 作为我的 ide 转到我的 mail.xml 并转到布局视图,现在我得到一个 NullPointerException,所以我什至不能再将东西拖到布局上。

编辑

这就是我所拥有的

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_
    android:layout_>
    <LinearLayout
        android:orientation="vertical"
        android:layout_
        android:layout_>
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_
            android:layout_ />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_
            android:layout_>
            <LinearLayout
                android:orientation="vertical"
                android:layout_
                android:layout_>            
                <TextView 
                android:id="@+id/textview1"
                android:layout_
                android:layout_ 
                android:text="this is a tab" />
                <EditText android:text="" android:id="@+id/EditText01" android:layout_ android:layout_ android:password="true"></EditText>

            </LinearLayout>

            <TextView 
                android:id="@+id/textview2"
                android:layout_
                android:layout_ 
                android:text="this is another tab" />
            <TextView 
                android:id="@+id/textview3"
                android:layout_
                android:layout_ 
                android:text="this is a third tab" />
        </FrameLayout>
    </LinearLayout>
</TabHost>

【问题讨论】:

@chobo2:你看过我给出的答案了吗?我认为我对这个问题进行了相当彻底的审查。 @Steve : 抱歉一直在写期末考试,我现在正在看。 仅供参考,HelloTabWidget 使用已弃用的 UI 组件,并已从 Android 开发者网站中删除。 【参考方案1】:

选项卡刚开始工作有点有趣,因为有很多代码开销,但是一旦你按照自己的方式工作,它们就不会太糟糕了。要让标签正常工作,让我们从改进您的 XML 文件开始,然后我们可以确保实际加载它们的代码是正确的。

首先,您的 XML 文件。您应该使用 include 功能,而不是将所有内容直接包含在 main.xml 中。顾名思义,这使您可以处理一个单独的 xml 文件,然后用一行将其包含在您的主文件中。这使得 main.xml 文件更易于阅读。所以我们会修改你上面的文件,使它看起来像这样:

//No need to change anything above this
<FrameLayout
    android:id="@android:id/tabcontent"
    android:layout_
    android:layout_>

    <include layout="@layout/tab1"/>
    <include layout="@layout/tab2"/>
    //and however many other tabs you want to include

</FrameLayout>

然后您需要创建 tab1.xml、tab2.xml 等等。这些是普通的 xml 文件,因为它们以包含任意数量的其他小部件的 ViewGroup(即 LinearLayout、RelativeLayout)开头。这些小部件可以是 EditText、按钮、自定义视图等任何您想要的东西。唯一的规则是父 ViewGroup(顶部的那个)必须有一个唯一的 ID,以android:id="@+id/someUniqueName" 的方式。您将使用它来引用代码中的特定布局/选项卡。例如,这将是:

tab1.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_ 
    android:id="@+id/tab1Layout"
    android:orientation="vertical">

    <TextView ... />
    <EditText ... />
</LinearLayout>

完成后,我们可以查看您的代码。我假设你可能已经得到了这个,但以防万一这是你想要的:

public class YourProject extends TabActivity 

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

        Resources res = getResources();
        TabHost tabHost = getTabHost();

        tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("Tab1 title",
                res.getDrawable(R.drawable.logo1)).setContent(R.id.tab1Layout));

        (...)

        //You can also fill tabs with a separate activity like so:
        Intent intent = new Intent(this, YourClass.class);
        tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("Another title",
                res.getDrawable(R.drawable.logo2)).setContent(intent));

        tabHost.setCurrentTab(0);
    

如上所示,您可以将其中一个选项卡的内容设置为单独的活动。在这种情况下,活动被定义为具有自己的类、布局等的任何其他活动。通常你不应该这样做,而只是使用不同的视图(使用setContent(R.id.tabXLayout),但有时需要它。例如,如果如果您希望其中一个选项卡有一个列表,那么您需要在其中启动一个扩展 ListView 的活动,并包含 ListViews 的所有样板代码。

希望对你有帮助!

【讨论】:

我复制了除了 Intent 部分之外的内容,因为我不明白 (YourClass.class) 的用途。它没有运行我什至不确定在哪里可以找到错误,因为我尝试使用调试器遍历并且我得到所有这些未找到源的错误。 好的,不要管有意图的部分。这只是为了让您在主选项卡托管活动中使用另一个活动。 Android 中的调试与 Eclipse 中的正常调试有点不同,因为您不是在运行独立程序;就 Eclipse 所见,它正在运行模拟器并且模拟器没有崩溃,因此 Eclipse 不会报告任何易于阅读的内容。您需要做的是使用 LogCat。有关如何执行此操作的说明,请参阅此答案:***.com/questions/2552568/… 嗯还是有问题。是否可以发送完整的解决方案,以便我运行并试用? 这几乎整个解决方案。当您复制/粘贴时,您确实删除了“tab1.xml”对吗?那只是为了告诉您该 XML 属于一个名为 that 的文件。 LogCat 消息说了什么? 嘿。终于让它工作了。我只是误读了你的一个步骤。我仍然不确定缩进的作用以及如何设置它。【参考方案2】:

Eclipse 中的布局视图可能有点不稳定,尤其是对于复杂的布局。一些试验和错误可能会发现它阻塞的 View 节点。

关于进一步开发基于选项卡的布局,您有两种选择,“快速”方式或“正确”方式。首先是通过将其中一个 TextViews 替换为包含您想要的内容的 LinearLayout(或其他一些布局)来调整现有的布局 xml。

http://google.com/codesearch/p?hl=en#HQNWZ1u2Pig/trunk/HelloLayoutAndroid/res/layout/tab_widget.xml

但是,标签通常用于内容复杂的地方。为了可扩展性,最好在布局中定位 TabHost,调用 newTabSpec(),然后使用 setContent() 提供标识内部 Activity 的 Intent,该内部 Activity 提供自己的布局。

【讨论】:

嗨。谢谢,我可能会做快速的方法,因为我没有太多时间,这只是一个学习练习,可以让你更熟悉 android,但我想知道正确的方法,但是你刚才所说的在布局中找到 TabHost因为我只做了几个小时的 android,所以我就想不通了。我可以看一个例子吗?谢谢【参考方案3】:

包含在解析 XML 时经常会出现问题,我尝试过并得到:无法解析 @layout/mylayout.. 我的代码是 100% 正确的,但是如果您需要 Id 作为布局和其他属性,这是一个常见的问题。 示例: 我通过设计模式解决了这个问题,当您将 tabhost 放到布局中时,将其放置在您想要的任何位置,它会在 XML 编辑器上创建 3 个线性布局(tab1、tab2、tab3)...在每个选项卡(leanearlayout)中插入您需要用作选项卡内容的控件的标记。 并在 java 文件中执行下一个:

  TabHost tabHost = (TabHost)findViewById(R.id.tabHost);
    tabHost.setup();
    TabHost.TabSpec tab1 = tabHost.newTabSpec("smil1");
    TabHost.TabSpec tab2 = tabHost.newTabSpec("smil2");
    TabHost.TabSpec tab3 = tabHost.newTabSpec("smil3");
    tab1.setIndicator("#1");//the name will apear on the first tab
    tab1.setContent(R.id.smiles1); // the Id of the control you put in the first LeanerLayout

    tab2.setIndicator("#2"); // the same as abouv but for the second tab
    tab2.setContent(R.id.smiles2);
    tab3.setIndicator("#3"); // the thierd tab
    tab3.setContent(R.id.smiles3);
    // add the tabs
    tabHost.addTab(tab1);
    tabHost.addTab(tab2);
    tabHost.addTab(tab3);

如果包含在解析 XML 时出现问题,这就是解决问题的方法。

【讨论】:

【参考方案4】:

布局编辑器中的NullPointerException 是Android 开发工具中的known bug。

【讨论】:

以上是关于如何将控件添加到 Android 中的选项卡布局?的主要内容,如果未能解决你的问题,请参考以下文章

滑动选项卡布局错误

Android在图像按钮和其他中将普通布局更改为选项卡布局错误?

如何在列表视图之上设置选项卡布局但在 Android 中不覆盖?

如何在 Android 中创建类似于“选项卡布局”的圆形数组?

使用带有选项卡布局的自定义视图时无法从选项卡中删除填充

如何更改选项卡布局中所选选项卡的形状?