其他分享
首页 > 其他分享> > 有什么办法让Mvx.MvxLinearLayout尊重android:layout_weight吗?

有什么办法让Mvx.MvxLinearLayout尊重android:layout_weight吗?

作者:互联网

我有一个水平的项目列表,希望平均共享可用的屏幕宽度.

以前,我曾使用索引绑定到每个项目,并使用静态LinearLayout来使每个项目具有相同的layout_weight.

当我用Mvx.MvxLinearLayout和ItemsSource绑定替换静态LinearLayout并将项目的标记移动到Itemtemplate中时,MvxLinearLayout不再考虑layout_weight.

我尝试了各种方法来重组项目模板,并且似乎没有办法让此控件在安排其项目时服从layout_weight.

有没有什么方法可以让Mvx.MvxLinearLayout尊重android:layout_weight,或者有其他方法可以给我一个动态的项目列表,这些项目将在给定固定尺寸边界的情况下进行均匀排列?

编辑

假设包含3个项目的列表,其字符串属性为“名称”.

该标记可以正常工作,提供3个等宽的文本项:

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        local:MvxBind="Text Items[0].Name"
        />
    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        local:MvxBind="Text Items[1].Name"
        />
    <TextView
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        local:MvxBind="Text Items[2].Name"
        />
</LinearLayout>

此方法不起作用,布局权重未正确应用于TextView:

<Mvx.MvxLinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    local:MvxBind="ItemsSource Items"
    local:MvxItemTemplate="@layout/item_template" />

ItemTemplate布局文件:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_weight="1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    local:MvxBind="Text Name" />

解决方法:

问题是,将MvxLinearLayout与ItemTemplate一起使用时,mvvmcross会插入一个附加视图.因此,与其获取视图层次结构,不如:

MvxLinearLayout->文字检视

您最终得到:

MvxLinearLayout-> MvxListItemView-> TextView.

因此,适用于TextView的布局属性(尤其是权重)对于LinearLayout是不可见的. MvxListItemView使用默认的布局属性(包装内容)填充,并且看不到任何重量效果.

动作发生的位置在MvxViewGroupExtensions(例如Refill)中,子视图添加到LinearLayout中,在MvxAdapter中,CreateBindableView方法,子视图打包在IMvxListItemView中.

解决此问题的一种方法是覆盖MvxViewGroupExtensions中的方法,并在添加视图后更新MvxListItemViews的布局属性(例如,从基础视图复制它们).例如:

private static void Refill(this ViewGroup viewGroup, IAdapter adapter) {
    .... // rest of code
    Invalidate();
    for (int j = 0; j < viewGroup.ChildCount; j++)
    {
        var child = GetChildAt(j) as MvxListItemView;
        var param = new LinearLayout.LayoutParams(
                     0, ViewGroup.LayoutParams.WrapContent, 1.0f);
        child.LayoutParameters = param;
    }
}

标签:xamarin-android,mvvmcross,android
来源: https://codeday.me/bug/20191123/2063987.html