有没有办法让Mvx.MvxLinearLayout尊重android:layout\u weight?
我有一个水平列表的项目,我希望分享可用的屏幕宽度平等 以前我对每个项目使用了索引绑定和静态线性布局,每个项目都具有相同的布局权重 当我用Mvx.MvxLinearLayout和ItemsSource绑定替换静态线性布局,并将项目的标记移动到Itemtemplate中时,MvxLinearLayout不再考虑布局权重 我尝试了各种方法来重新构造项目模板,但似乎没有办法让该控件在安排项目时遵守布局权重 有没有什么方法可以让Mvx.MvxLinearLayout尊重android:layout\u weight,或者有没有其他方法可以给我一个动态的项目列表,在给定固定尺寸的边界时,这些项目可以平均排列 编辑 假设一个包含3项的列表,带有字符串属性“Name” 此标记按预期工作,提供3个宽度相等的文本项:有没有办法让Mvx.MvxLinearLayout尊重android:layout\u weight?,android,xamarin.android,mvvmcross,Android,Xamarin.android,Mvvmcross,我有一个水平列表的项目,我希望分享可用的屏幕宽度平等 以前我对每个项目使用了索引绑定和静态线性布局,每个项目都具有相同的布局权重 当我用Mvx.MvxLinearLayout和ItemsSource绑定替换静态线性布局,并将项目的标记移动到Itemtemplate中时,MvxLinearLayout不再考虑布局权重 我尝试了各种方法来重新构造项目模板,但似乎没有办法让该控件在安排项目时遵守布局权重 有没有什么方法可以让Mvx.MvxLinearLayout尊重android:layout\u w
<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>
此方法不起作用,布局权重未正确应用于文本视图:
<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的方法都要尊重android:layout\u weight
据我所知,没有一个是这样的——但听起来您正处于调试和实验的完美位置
为了调试布局问题,一个非常有用的工具是层次结构查看器——在两个布局上使用它可以向您显示它们在设备上实际运行时的区别
MvxLinearLayout
只是一个LinearLayout
-它继承自它,并简单地添加一个数据绑定的适配器
,允许您动态添加/删除子项-请参阅
基于此,一个假设是,LinearLayout
本身可能不支持这种动态子项的layou-weight
。要对此进行调查:
- 您可以尝试在不使用Mvx的情况下创建UI原型-添加/删除子级时,纯线性布局是否“尊重布局重量”?如果答案是肯定的,那么您的原型和原型之间的区别是什么。如果答案是否定的,那么您就知道问题出在
的某个地方LinearLayout
- 您可以尝试查看LinearLayout源-例如-此调查可能会发现一些前进的方向-例如,它可能会找到一些方法,您可以强制LinearLayout重新测量,然后您可以从
和ChildViewAdded
事件调用该“force remeasure”方法ChildViewRemoved
如果内置布局不适合您,那么创建您自己的自定义布局是非常简单的-例如,请参见-一旦您完成了这项工作,那么添加绑定就像从中复制和粘贴
视图组绑定代码一样简单问题是,mvvmcross在将MvxLinearLayout与ItemTemplate一起使用时插入附加视图。因此,不要获取视图层次结构:
MvxLinearLayout->TextView
你最终会得到:
MvxLinearLayout->MvxListItemView->TextView
因此,应用于TextView的布局特性(尤其是权重)对LinearLayout不可见。MvxListItemView使用默认布局属性(包裹内容)进行初始化,并且看不到任何权重效果
操作发生的位置在MvxViewGroupExtensions(例如,重新填充)中,子视图添加到LinearLayout中,而在MVXAAdapter中的CreateBindableView方法中,子视图打包在IMvxListItemView中
解决此问题的一种方法是重写MvxViewGroupExtensions中的方法,并在添加视图后更新MVXListItemView的布局属性(例如,从基础视图复制它们)。例如:
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;
}
}
private static void reflection(此视图组视图组,IAdapter适配器){
..//代码的其余部分
使无效();
对于(int j=0;j
请包含一些以前有效的代码和您尝试过的代码。另外,层次结构查看器显示了什么不同?我已经添加了请求的信息,有人可以帮忙吗?有解决此问题的方法吗?我现在也面临同样的问题。有一个MvxLinearLayout,它不考虑其中项目的布局重量。是否可以获取线性布局项目的单击事件,以便对单击的项目进行操作(如删除它)?