如何根据xml中的条件设置match_parent和wrap_content?

How to set match_parent and wrap_content depending on condition in xml?

我需要根据某些条件设置 TextView 的 layout_height。我尝试过导入 LayoutParams 但它没有用。有什么想法吗?

android:layout_height="condition ? wrap_content : match_parent"

我需要在 xml 中完成,而不是使用代码

I think you use ConstraintLayouts that provides all solutions

if(a == b ) {

view.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));

} 
else 
{
view.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
}

您应该通过 LayoutParams 更改它:

    if(condition){
    LayoutParams params = (LayoutParams) textView.getLayoutParams();
    params.height = MATCH_PARENT;
    textView.setLayoutParams(params);}
else{
LayoutParams params = (LayoutParams) textView.getLayoutParams();
    params.height = WRAP_CONTENT;
    textView.setLayoutParams(params);}
<layout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:app="http://schemas.android.com/apk/res-auto"  
    xmlns:tools="http://schemas.android.com/tools">  

    <data>  

        <variable  
            name="user"  
            type="<package name>.UserModel" />  

        <import type="android.view.View"/>  
    </data>  

    <RelativeLayout  
        android:layout_width="match_parent"  
        android:layout_height="match_parent">  

        <TextView  
             android:layout_width="@{user.email.trim().length()>10 ? wrap_content : match_parent}""  
             android:layout_height="wrap_content"  
             android:text="@{user.email}"  />  

    </RelativeLayout>  
</layout>    

在这里试试这个 我从 here

得到了这个解决方案

您可以使用自定义 Binding Adapter

Create Binding Adapter as below

public class DataBindingAdapter {
    @BindingAdapter("android:layout_width")
    public static void setWidth(View view, boolean isMatchParent) {
        ViewGroup.LayoutParams params = view.getLayoutParams();
        params.width = isMatchParent ? MATCH_PARENT : WRAP_CONTENT;
        view.setLayoutParams(params);
    }
}

然后在您的 View 中使用此属性。

<TextView
    android:layout_width="@{item.isMatchParent, default = wrap_content}"
    ...
/>

注:

default = wrap_content很重要,因为创建视图时要指定宽高,绑定是否发生在视图渲染的位时间之后。

说明

为什么没有 BindingAdapter 就不可能。

因为Android没有提供View.setWidth(),大小可以通过classLayoutParams设置,所以要用LayoutParams。你不能在 xml 中使用 LayoutParams 因为这里也没有 View.setWidth() 方法。

这就是为什么下面的语法会出错

Cannot find the setter for attribute 'android:layout_width' with parameter type int

<data>

    <import type="android.view.ViewGroup.LayoutParams"/>

<data>

android:layout_width="@{item.matchParent ? LayoutParams.MATCH_PARENT : LayoutParams.WRAP_CONTENT}"

通过 xml 设置可见性有效,因为有 View.setVisibility() 方法可用

以下语法有效

<data>
    <import type="android.view.View"/>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>