2010-12-15 53 views
2

我有一个布局main.xml这样开始了我的申请:更改Android的布局编程

​​

而且在设置菜单中,用户可以选择另一种布局,小(tiny.xml),其布局是这样的:

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

mainActivity延伸TabActivity,并在onCreate方法:

...

if (isTiny()) 
setContentView(R.layout.tiny); 
else 
setContentView(R.layout.main); 
mTabHost = getTabHost(); 

TabSpec newsTab = mTabHost.newTabSpec(NewsActivity.static_getTabActivityTag()); 
newsIntent = new Intent(this, NewsActivity.class);  
newsTab.setContent(newsIntent); 
TextView textView = new TextView(this); 

textView.setText(getResources().getString(NewsActivity.static_getIndicatorStringID()); 
textView.setTextSize(size); 
textView.setTextColor(color); 
textView.setBackgroundDrawable(background); 
tab.setIndicator(textView); 
mTabHost.addTab(newsTab); 

的想法是写一些代码在mainActivity#onRestart因此如果用户通过设置面板中更改布局加载新的布局了。如何实现它?我尝试使用setContentView 但它只是崩溃 并再次创建标签的意见,但它只是不工作,意见是空白的。

在此先感谢。

更新:添加了如何在活动中创建选项卡。

更新可以多次执行setContentView。我的问题与意图中的活动有关。

+0

什么是崩溃的堆栈跟踪?多次调用'setContentView()'应该没问题,但是你需要重新绑定任何'View'引用(即通过'findViewById'运行)。 – 2010-12-15 15:34:44

+1

你可以'setContentView'两次,但是你需要在之后重新初始化视图引用(为每个视图再次调用findViewById方法,添加各种监听器等等) – ognian 2010-12-15 15:35:36

+0

我刚刚检查过,它不会崩溃,但意见不起作用。也许是因为我正在重新创建它们而不是重新绑定它们? – pakore 2010-12-15 15:39:25

回答

3

您可以随时调用setContentView,而不必在onCreate中调用setContentView。我会用SharedPreferences来存储用户想要的内容视图。希望这可以帮助。

+0

你只能调用setContentView一次,虽然 – Falmarri 2010-12-15 18:53:00

+0

你可以多次调用它,因为我有多个项目调用onCreate以外的setContentView。编辑:这两次被说是这样做是一个错误,我后悔它会更好地使用单独的活动。在这种情况下,使用主题可能会更好,但这也可能是一个可接受的解决方案。 – schwiz 2010-12-15 18:54:36

+0

我使用创建选项卡的活动的代码更新了我的问题。我希望有所帮助。谢谢。 – pakore 2010-12-16 09:29:56