【问题标题】:Change vertical bias when there's not enough space空间不足时更改垂直偏差
【发布时间】:2019-06-23 20:53:54
【问题描述】:

问题

我在 ConstraintLayout 中有一个 TextView。考虑 TextView 的高度为 20dp,我希望它位于 ConstraintLayout 的顶部,边距为 50dp。但是,ConstraintLayout 的高度不是固定的,可能小于 70dp,这意味着 TextView 可能不适合其中。在这种情况下,我想将 TextView 垂直集中在 ConstraintLayout 中。

我的方法

我尝试了以下布局:

<ConstraintLayout android:layout_height="match_parent">

    <TextView
        android:layout_height="20dp"
        android:layout_marginTop="50dp"
        android:layout_marginBottom="50dp"
        app:layout_constraintVertical_bias="0.0"/>

</ConstraintLayout>

当 ConstraintLayout 中有足够的空间容纳 TextView 和上边距时,此布局效果很好。但是如果没有,我需要将垂直偏差更改为 0.5,以便将 TextView 集中在 ConstraintLayout 中。

因此,是否可以根据是否有足够的空间来满足所有约束来分配不同的偏差(在 XML 中或以编程方式)?否则,还有什么其他方法可以使用?

【问题讨论】:

    标签: android android-layout android-constraintlayout


    【解决方案1】:

    以下是如何以编程方式更改偏差:

     ConstraintSet set = new ConstraintSet();
        ConstraintLayout constraintLayout = (ConstraintLayout)findViewById(R.id.your_layout);
        set.clone(constraintLayout);
        set.setVerticalBias(R.id.your_textview_id, 0.5f);
        constraintSet.applyTo(constraintLayout);
    

    这是一种检测屏幕分辨率并检查高度限制的方法:

    private static String getScreenResolution(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        DisplayMetrics metrics = new DisplayMetrics();
        display.getMetrics(metrics);
        int width = metrics.widthPixels;
        int height = metrics.heightPixels;
    
        return "{" + width + "," + height + "}";
    }
    

    【讨论】:

    • 抱歉拖了这么久。您的回答很有帮助,但我解决问题的方式略有不同。我向视图树观察器添加了一个 OnGlobalLayoutListener,它检查 ConstraintLayout 的实际高度并将其与 TextView 的高度及其边距进行比较。在检查没有足够的空间后,我根据您的第一个 sn-p 更改垂直偏差。感谢您的帮助!
    • @Milack27 没关系,很高兴你达到了你想要的效果,也感谢你接受我的建议!
    • @NikosHidalgo 你的答案在 AndroidX 的情况下不起作用。
    • @jakirhussain ConstrainSet 是 AndroidX 中的一个类。你遇到了什么错误?
    • @NikosHidalgo 我没有得到任何运行良好但未设置偏差的错误代码。
    【解决方案2】:

    如果是 AndroidX,您可以使用此代码。

    ConstraintLayout.LayoutParams setParams = (ConstraintLayout.LayoutParams) 
    holder.mTextView.getLayoutParams();
    setParams.horizontalBias = 0;//0.3f in case of other then zero.
    setParams.verticalBias = 0;
    holder.mTextView.setLayoutParams(setParams);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多