2010-07-02 66 views
2

我有一个Android上的选项卡视图的问题。与Tab初始化的Android问题

我使用4个xml布局文件(每个RelativeLayout)作为选项卡视图中选项卡的内容。

main.xml中包含:含有的LinearLayout含有TabWidget:(ID/tabhost @android)(@android:ID /标签)和一个的FrameLayout(@android:ID/tabcontent)

如果TabHost我一个接一个地在main.xml中嵌入多个工作正常...(除了我的main.xml是不可维护的,这是我想通过将文件拆分成简单的main.xml来解决的问题,它定义了标签和内容框架,然后将视图推到这个...)。

代码我有膨胀和4个RelativeLayout的XML文件插入到标签内容如下:

mTabHost = getTabHost(); 

View wv = null; 
wv = LayoutInflater.from(this).inflate(R.layout.user_tab, mTabHost.getTabContentView(), true); 
mTabHost.addTab(mTabHost.newTabSpec("User").setIndicator("User").setContent(wv.getId())); 

wv = LayoutInflater.from(this).inflate(R.layout.track_tab, mTabHost.getTabContentView(), true); 
mTabHost.addTab(mTabHost.newTabSpec("Track").setIndicator("Track").setContent(wv.getId())); 

wv = LayoutInflater.from(this).inflate(R.layout.chart_tab, mTabHost.getTabContentView(), true); 
mTabHost.addTab(mTabHost.newTabSpec("Chart").setIndicator("Chart").setContent(wv.getId())); 

//等等的多个选项卡。

当我运行此第一个选项卡(用户)是空的,其余选项卡包含所有视图的所有内容...所以tab2具有tab1-4的内容,tab3具有tab1-4的内容和tab4具有来自tab1-4的内容...返回到tab1,它现在具有来自tab1-4的所有内容。

代码工作得很好,在视图等各种对象的事件各方面都不错......这只是它们都糊涂起来的观点...

的是什么任何想法造成这种情况以及如何纠正它?

在此先感谢。

吉姆

回答

0

是什么原因造成这一点, 如何纠正它的任何想法?

首先,替换:

setContent(wv.getId()) 

有:

setContent(wv) 

二,替代:

LayoutInflater.from(this).inflate(R.layout.user_tab, mTabHost.getTabContentView(), true); 

有:

getLayoutInflater().inflate(R.layout.user_tab, mTabHost.getTabContentView(), false); 

第三个参数中的关键是false

+0

嗨,谢谢你。该应用程序不会使用setContent(wv) 编译,因为它声称setContent正在查找视图ID,它使用setContent(wv.getId())进行编译。 与假执行(和的getId()),但是抛出一个 ERROR/AndroidRuntime(224):了java.lang.RuntimeException:由造成无法创建选项卡的内容,因为无法与ID 2131099653 切换回找视图真正清除这个错误,但让我回到我开始的地方。 我怀疑你是正确的,关键是使用虚假的膨胀,但如果我这样做,我不会超过setContent .... 任何其他想法赞赏。 – Jim 2010-07-02 23:16:07

+0

@Jim:哦,等等,对 - 你需要使用像这样的加载器:http://github.com/commonsguy/cw-android/tree/master/Fancy/DynamicTab/ – CommonsWare 2010-07-03 06:07:44

+0

这是一个很酷的解决方案...看起来不错...我发现了一个与原始版本一起工作的替代方案。在这里发布它作为第二个答案 – Jim 2010-07-03 07:49:08

0

好吧......想通了,为什么原来的做法没有工作...固定它...从@CommonsWare也是一个很好的解决方案(谢谢!)

提供原代码的解决方案横空出世是这样的:

wv = getLayoutInflater().inflate(R.layout.user_tab, mTabHost.getTabContentView(), false); 
mTabHost.getTabContentView().addView(wv); 
mTabHost.addTab(mTabHost.newTabSpec("User").setIndicator("User").setContent(wv.getId())); 

的关键似乎是,膨胀的观点需要被添加到标签内容的观点,但是,传递给setContent的ID必须是我刚充了新的选项卡视图。因此,如果我使用true调用inflate,它将add作为子视图,但会返回父视图(即tabContent框架)...如果这是我传递给setContent的id,它会将所有的在屏幕上的那个视图中的对象...我原来的问题。

所以,但用false调用会创建视图,但会跳过添加到父级,但极其重要的是,它会返回NEW视图。所以,如果我这个tabContentView添加到帧以:

mTabHost.getTabContentView().addView(wv); 

然后在该setContent,将ID设置为一个新视图,C

宾果:工作

谢谢寻求帮助!

+0

Gining错误为'由...引发:java.lang.RuntimeException:无法创建标签内容,因为无法找到ID为-1android的视图 – Android 2012-04-18 06:17:19

+0

不要忘记确保每个你充气的标签页视图也有一个唯一的ID! – kurtzmarc 2013-07-03 03:21:23