如何以编程方式连接约束布局

问题描述 投票:0回答:1

我将为 Portal 模式和横向屏幕创建一个自适应 Android Activity,如下所示

  • 内容的ConstraintLayout(蓝光背景色),带有 android:id="@+id/contentAct"
  • Google 广告区域的 FrameLayout,带有 android:id="@+id/frameLayout_googleads"

所有这些都放在一个 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 android-constraintlayout
1个回答
0
投票

不鼓励您采用的方法。事实上,Android 为横向和纵向模式提供了替代资源文件夹。

您应该在

res/layout-land
文件夹中创建横向模式布局,而
res/layout-port
则用于纵向模式。

这样,您就不需要动态调整约束集了。

© www.soinside.com 2019 - 2024. All rights reserved.