我将为 Portal 模式和横向屏幕创建一个自适应 Android Activity,如下所示
所有这些都放在一个 ConstraintLayout 中,其中 android:id="@+id/mainAct"
这是我期待的布局
传送门:
我正在使用 ConstraintSet 将这些布局连接在一起
这是我的来源:
ConstraintLayout constraintLayout = findViewById(R.id.mainAct);
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(constraintLayout);
int nIdRoot = R.id.mainAct;
int nIdAds = R.id.frameLayout_googleads;
int nIdContent = R.id.contentAct;
if(nOrientation== Configuration.ORIENTATION_LANDSCAPE){
Log.d("On Config Change","LANDSCAPE");
//for ads
constraintSet.clear(nIdAds, ConstraintSet.TOP);
constraintSet.connect(nIdAds,ConstraintSet.TOP,nIdRoot,ConstraintSet.TOP,0);
constraintSet.clear(nIdAds, ConstraintSet.LEFT);
//constraintSet.connect(R.id.frameLayout_googleads,ConstraintSet.LEFT,R.id.mainAct,ConstraintSet.LEFT,0);
constraintSet.clear(nIdAds, ConstraintSet.BOTTOM);
constraintSet.connect(nIdAds,ConstraintSet.BOTTOM,nIdRoot,ConstraintSet.BOTTOM,0);
constraintSet.clear(nIdAds, ConstraintSet.RIGHT);
constraintSet.connect(nIdAds,ConstraintSet.RIGHT,nIdRoot,ConstraintSet.RIGHT,0);
constraintSet.setVerticalBias(nIdAds, 0.5f);
constraintSet.setHorizontalBias(nIdAds, 1.0f);
//for content
constraintSet.clear(nIdContent, ConstraintSet.TOP);
constraintSet.connect(nIdContent,ConstraintSet.TOP,nIdRoot,ConstraintSet.TOP,0);
constraintSet.clear(nIdContent, ConstraintSet.LEFT);
constraintSet.connect(nIdContent,ConstraintSet.LEFT,nIdRoot,ConstraintSet.LEFT,0);
constraintSet.clear(nIdContent, ConstraintSet.BOTTOM);
constraintSet.connect(nIdContent,ConstraintSet.BOTTOM,nIdRoot,ConstraintSet.BOTTOM,0);
constraintSet.clear(nIdContent, ConstraintSet.RIGHT);
constraintSet.connect(nIdContent,ConstraintSet.RIGHT,nIdAds,ConstraintSet.LEFT,0);
constraintSet.setVerticalBias(nIdContent, 0.5f);
constraintSet.setHorizontalBias(nIdContent, 0.0f);
}
else{
Log.d("On Config Change","PORTRAIT");
//for ads
constraintSet.clear(nIdAds, ConstraintSet.TOP);
//constraintSet.connect(R.id.frameLayout_googleads,ConstraintSet.TOP,R.id.mainAct,ConstraintSet.TOP,0);
constraintSet.clear(nIdAds, ConstraintSet.LEFT);
constraintSet.connect(nIdAds,ConstraintSet.LEFT,nIdRoot,ConstraintSet.LEFT,0);
constraintSet.clear(nIdAds, ConstraintSet.BOTTOM);
constraintSet.connect(nIdAds,ConstraintSet.BOTTOM,nIdRoot,ConstraintSet.BOTTOM,0);
constraintSet.clear(nIdAds, ConstraintSet.RIGHT);
constraintSet.connect(nIdAds,ConstraintSet.RIGHT,nIdRoot,ConstraintSet.RIGHT,0);
constraintSet.setVerticalBias(nIdAds, 1.0f);
constraintSet.setHorizontalBias(nIdAds, 0.5f);
//for content
constraintSet.clear(nIdContent, ConstraintSet.TOP);
constraintSet.connect(nIdContent,ConstraintSet.TOP,nIdRoot,ConstraintSet.TOP,0);
constraintSet.clear(nIdContent, ConstraintSet.LEFT);
constraintSet.connect(nIdContent,ConstraintSet.LEFT,nIdRoot,ConstraintSet.LEFT,0);
constraintSet.clear(nIdContent, ConstraintSet.BOTTOM);
constraintSet.connect(nIdContent,ConstraintSet.BOTTOM,nIdAds,ConstraintSet.TOP,0);
constraintSet.clear(nIdContent, ConstraintSet.RIGHT);
constraintSet.connect(nIdContent,ConstraintSet.RIGHT,nIdRoot,ConstraintSet.LEFT,0);
constraintSet.setVerticalBias(nIdContent, 0.0f);
constraintSet.setHorizontalBias(nIdContent, 0.5f);
}
constraintSet.applyTo(constraintLayout);
看起来在 Portal 模式下工作正常, 但在横向模式下,内容布局的右侧连接到根布局的右侧,它应该连接到广告布局的左侧。
可以通过手动调整横向模式下 ContentLayout 的宽度来解决,如下所示,
//begin adjust content width step
View viewcontentAds = findViewById(R.id.frameLayout_googleads);
View viewcontentAct = findViewById(R.id.contentAct);
ViewGroup.LayoutParams layoutParamsAds = viewcontentAds.getLayoutParams();
ViewGroup.LayoutParams layoutParamsContent = viewcontentAct.getLayoutParams();
int nNewContentWidthPx = 0;
if(nOrientation== Configuration.ORIENTATION_LANDSCAPE) {
nNewContentWidthPx = getResources().getDisplayMetrics().widthPixels - layoutParamsAds.width;
}
else{
nNewContentWidthPx = getResources().getDisplayMetrics().widthPixels;
}
layoutParamsContent.width = nNewContentWidthPx;
//begin adjust content width step
但是如何在不手动调整的情况下纠正 ContentLayout 的宽度。
这是完整的模板可运行源代码 https://github.com/minhnv16/TestAdsMultiAct/blob/master/app/src/main/java/com/example/testadsmultiact/MainActivity.java
不鼓励您采用的方法。事实上,Android 为横向和纵向模式提供了替代资源文件夹。
您应该在
res/layout-land
文件夹中创建横向模式布局,而 res/layout-port
则用于纵向模式。
这样,您就不需要动态调整约束集了。