如何在Android程序中以编程方式处理配置更改(屏幕方向、应用程序显示大小等)

3
是的,在Stack Overflow上已经有很多关于同一主题的答案,其中大部分都提到了以下方法:

Manifest.xml:

<activity
        android:name=".MainActivity"
        android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
</activity>

手动处理配置更改:
override fun onConfigurationChanged (newConfig: Configuration) {

    super.onConfigurationChanged (newConfig)
    
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

        // TODO block 1:
        
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

        // TODO block 2:
    }
}

现在,假设我有一个简单的Android应用程序,其中包含一个RelativeLayout,其中包含一个按钮和一个文本字段(EditView)。整个应用程序已经以编程方式设计完成。
在竖屏模式下:文本字段和按钮如下所示,一个在另一个下面。

enter image description here

在横向模式下,我希望文本字段和按钮相邻,为此我将在上述onConfigurationChanged方法中更改x、y、高度、宽度等等。同样地,为了处理应用程序显示大小的变化(多窗口、多屏翻转设备),我需要做类似的操作。(目前,我不知道如何处理这些变化)。
目前,我的相对布局中只有两个视图:一个按钮和一个文本字段(EditView),假设当我的活动中有50-60个视图时,我需要为每个视图和每个场景(屏幕方向、应用程序显示大小等)更改x、y、高度和宽度。
这似乎是非常繁琐的,并且需要长时间维护,有没有其他更简便的方法来处理配置变化呢?
注意:我的整个应用程序是以编程方式设计的,没有使用Jetpack Compose。
附注:Android文档也提到了上述方法不是首选方法。

enter image description here

我也点击了这个链接,但似乎对上述情况没有什么用处。(如果我错了,请纠正我)

假设我有一个简单的Android应用,其中包含一个RelativeLayout。几年前,RelativeLayoutConstraintLayout取代了。有没有其他更简单的方法来处理配置更改呢?可以使用ConstraintLayout并更改约束条件。 - undefined
@CommonsWare,即使我使用ConstraintLayout,在配置更改时我仍然需要为每个视图更改约束条件。这样如何解决问题?我没有使用ConstraintLayout,而是使用绝对定位,即button.x = 100F。 - undefined
我没有使用ConstraintLayout,因为我使用的是绝对定位,即button.x = 100F。这种方法在很长很长时间内都不起作用。无论如何,如果你要以编程方式创建UI,你就需要以编程方式处理配置更改。 - undefined
2个回答

0
  • 你需要至少有一个根布局来创建你的活动,让它是LinearLayout。

  • 以编程方式将你的视图(TextView、Button)添加到你的LinearLayout中。

  • 添加相应的参数(边距、内边距等)。

  • 根据你的需求添加不同的参数。

  • 最后将以编程方式创建的视图添加到你的根视图中。

例如:-

private TextView getTextView(String text) {
    TextView textView = new TextView(MyLeaveActivity.this);
    textView.setText(text);
    textView.setPadding(20, 20, 20, 20);
    textView.setTextAlignment(TextView.TEXT_ALIGNMENT_CENTER);

    return textView;
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_leave);
    LinearLayout rootView=findViewById(R.id.maintable);
    TextView l1 = getTextView(data.getSrNo());
    final TableRow row = new TableRow(MyLeaveActivity.this);
    row.addView(l1, new TableRow.LayoutParams());
    rootView.addView(row, new TableLayout.LayoutParams());

}


我正在以编程方式创建我的视图,而不是使用XML。 - undefined
你说的“改变xy高度”是什么意思? - undefined
在纵向模式下,按钮和文本框是一个在另一个下面的。假设按钮的y坐标为100,文本框的y坐标为400。现在,为了使它们在横向模式下相邻,我需要更新按钮的x坐标、按钮的y坐标、文本框的x坐标和文本框的y坐标的值。 - undefined

-1
使用以下自由
  implementation 'com.intuit.sdp:sdp-android:1.1.0'
  implementation 'com.intuit.ssp:ssp-android:1.1.0'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接