如何将控件添加到 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 中不覆盖?