如何根据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}"/>
我需要根据某些条件设置 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}"/>