15

我的应用程序在 LinerLayout 中有一个 webview 和一些按钮。

问题是,我希望按钮在纵向模式下位于底部,在横向模式下位于左侧,而 webview 保持其状态。

两种不同的布局不起作用,因为它强制重新创建刷新 web 视图的活动。现在我在活动标签中使用android:configChanges="orientation",因此 webview 不会在方向更改时刷新。

有没有办法在改变屏幕模式时替换按钮的布局?

在此处输入图像描述

人像模式

在此处输入图像描述

横向模式

4

7 回答 7

16

我测试了片段,但是处理片段会使事情变得更加复杂,片段本身需要保存和恢复,这在具有 javascript 状态的 web 视图中可能不起作用,所以我进行了更多搜索,并在某处找到了一篇不错的文章,并进行了一些修改。我建议的解决方案:

首先,添加android:configChanges="orientation|screenSize|keyboard|keyboardHidden"应用程序而不是 android 来处理配置更改。

为横向和纵向制作两种不同的布局。在这两种布局中而不是 webview 中放置一个 FrameLayout,它充当 webview 的占位符。

像这样定义 initUI 方法,并将与 UI 初始化相关的所有内容都放在此方法中:

public void initui()
{
    setContentView(R.layout.main);
    if (wv == null) wv = new WebView(this);
    ((LinearLayout)findViewById(R.id.webviewPlace)).addView(wv);
    findViewById(R.id.home).setOnClickListener(this);
}

如果 webview 尚不存在,它将被创建并setContentView(R.layout.main)添加到布局中。您需要的任何其他 UI 自定义都在此之后出现。

并在onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    ((LinearLayout)findViewById(R.id.webviewPlace)).removeAllViews();
    super.onConfigurationChanged(newConfig);
    initUI();
}

onConfigChangewebview 中,从旧占位符中删除initui并将被调用,这会将其添加回新布局。

oncreate()调用initui()中,因此 ui 将首次初始化。

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    initUI()
}

我希望它对某人有帮助。

于 2012-12-18T17:07:04.420 回答
11

如果您正在使用android:configChanges="orientation|screenSize"

在清单中,它忽略了“ layout-land ”中的 XML。如果您为景观创建不同的 XML,请不要android:configChanges="orientation|screenSize"在清单中使用该活动的标记。

于 2016-01-11T05:27:26.387 回答
6

把它放在layout-land你想要的横向布局中。

这个想法是,你不应该真正使用configChange="orientation"它,因为它有它的缺点。你可以在这里找到详细的帖子。如果你想改变你的布局,你应该手动处理你的状态。当然,您可以通过编程方式执行此操作,但如果您想使用 xml 执行此操作。您可以使用片段维护 webView。

于 2012-12-12T20:59:17.273 回答
3

尝试使用此代码:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.activity_splash);
    }
于 2014-03-31T16:49:38.583 回答
1

使您的视图成为相对布局。当方向改变时,只需调整代码中每个视图的布局参数。让您的按钮包含在线性布局中

如在..

肖像

LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
buttonLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
buttonLinearLayout.setLayoutParams(lp);


LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.ABOVE, R.id.buttons);
webView.setLayoutParams(webParams);

景观

LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
buttonLinearLayout.setOrientation(LinearLayout.VERTICAL);
buttonLinearLayout.setLayoutParams(lp);


LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.TO_RIGHT_OF, R.id.buttons);
webView.setLayoutParams(webParams);

确保您使用的 LayoutParams 是 RelativeLayout 参数(始终使用视图父级的 Layoutparams)

于 2012-12-12T21:12:47.780 回答
0

在清单中添加

<activity android:name=".MyActivity"
      android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
      android:label="@string/app_name">

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (Resources.getSystem().getDisplayMetrics().widthPixels>
            Resources.getSystem().getDisplayMetrics().heightPixels)
    setContentView(R.layout.activity_layout1);
    else setContentView(R.layout.activity_layout2); 

...

}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    setContentView(R.layout.activity_layout1);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
    setContentView(R.layout.activity_layout2);
}

}

此处的文档: https ://developer.android.com/guide/topics/resources/runtime-changes.html

于 2021-08-24T13:07:15.420 回答
-1

您可以在资源下添加值(您需要的配置 - 例如土地、肖像)文件夹,并提及此配置所需的布局。就这么简单。

请查看以下链接以获取更多信息 - http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters

于 2014-09-11T05:34:38.270 回答