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

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

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

android:layout_height="condition ? wrap_content : match_parent"

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

android height
5个回答
1
投票

您可以使用自定义Binding Adapter来完成。

创建绑定适配器,如下所示

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很重要,因为在创建视图时应指定宽度和高度,是否在视图渲染的位时间之后发生绑定。

Explaination

Why it is not possible without BindingAdapter.

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

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

找不到参数类型为int的属性'android:layout_width'的setter

<data>

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

<data>

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

Setting Visibility by xml works, because there is View.setVisibility() method available

下面的语法有效

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

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

0
投票

我认为您使用ConstraintLayouts提供所有解决方案


0
投票
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));
}

0
投票

您应该通过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);}

0
投票
<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得到这个解决方案

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