如何在运行时更改布局?

Posted

技术标签:

【中文标题】如何在运行时更改布局?【英文标题】:how to change layout at runtime? 【发布时间】:2013-03-27 13:50:17 【问题描述】:

我有一个线性布局,将一个按钮、一个网格视图和一个文本视图设置在一个 xml 文件中。当屏幕处于纵向时,所有这些元素都可以正常显示。但是,当我将屏幕方向更改为横向时,textview 会消失。我想更改配置更改的布局。我想以某种方式水平显示元素,使它们中的每一个都占据屏幕的一定百分比。我还必须更改网格视图中每行显示的项目数,也许还有其他一些参数。到现在为止我有这个,但我不知道如何更改其余参数。

@Override
public void onConfigurationChanged(Configuration newConfig) 
    super.onConfigurationChanged(newConfig);
    LinearLayout linearlayout= (LinearLayout) findViewById(R.id.LinearLayout02);
    GridView gridview=(GridView) findViewById(R.id.gridview);
    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)           
       linearlayout.setOrientation(LinearLayout.HORIZONTAL);     
    
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
        linearlayout.setOrientation(LinearLayout.VERTICAL);         
    

【问题讨论】:

需要更改哪些参数? 我还不确定,我可能不得不使用相对布局而不是线性布局...关键是我需要左侧的 gridview 和右侧的 textview。该按钮将位于右上角。 【参考方案1】:

您需要在 /res/ 目录中创建一个名为 layout-land 的文件夹,然后在该文件夹中创建一个与其他布局同名的新布局 xml 并放置项目(TextView 等.) 当设备处于横向状态时您希望它们在哪里,android 会从那里处理其余的事情。

编辑:使用以下代码:

@Override
public void onConfigurationChanged(Configuration newConfig) 
     super.onConfigurationChanged(newConfig);
     setContentView(R.layout.my_main_layout);

     //save your text from textviews, edittexts, etc. in temp variables

     InitializeUI(); //take your findViewById stuff out of onCreate and put it in its own method that can be called here as well.

     //set you textviews, etc back to previous values from temp vars

 

应该可以的。

【讨论】:

问题是我不希望在配置更改时重新创建我的活动,所以我修改了 AndroidManifest.xml 以避免这种情况。而且由于我的活动没有在配置更改时重新创建,因此将 xml 放在 layout-land 文件夹中对我不起作用。 好的,所以你的清单中有`android:configChanges="keyboardHidden|orientation|screenSize"`?无论如何创建我提到的文件夹和文件,我将用如何处理onConfigurationChanged来更新我的答案。 是的,我的清单中有这个。好的,我已经更改了它,但该应用程序没有在布局域中应用视图。而且我不想在运行时重置新布局,因为我会丢失视图的当前状态......我只想将元素放在其他地方 不想丢失什么样的状态信息?此方法不会像正常旋转那样调用 onDestroy/onCreate,因此您最终丢失的只是可以存储在临时变量中的布局信息。这应该应用横向文件夹中的布局。您是否更改了布局 xml 的名称和/或您是否根据需要重新定位 xml 中的项目? InitializeUI() 应该做什么? gridview = (GridView) findViewById(R.id.gridview); 例如?

以上是关于如何在运行时更改布局?的主要内容,如果未能解决你的问题,请参考以下文章

在运行时更改自动布局

如何在运行时在android中切换布局?

在片段中在运行时更改方向时更改布局而不重新创建视图

在 Swift 运行时更改自动布局约束的 UIView 的框架

自动布局:窗口调整大小时如何更改框架的原点?

更改 iOS 应用本地化运行时间