有什么办法让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