MvxFrameLayout派生类不会绘制子项

时间:2013-11-13 13:09:03

标签: android mvvmcross

我创建了一个测试MvxFrameLayout派生类,我希望在0,0中绘制一个尺寸为24x24的子项:

    public class MyCustomLayout : MvxFrameLayout
    {
        public MyCustomLayout(Context context, IAttributeSet attrs) : base(context, attrs)
        {
        }

        public MyCustomLayout(Context context, IAttributeSet attrs, IMvxAdapterWithChangedEvent adapter) : base(context, attrs)
        {
        }

        protected override void OnLayout(bool changed, int left, int top, int right, int bottom)
        {
            if (!changed)
            {
                return;
            }
            for (int i = 0; i < this.ChildCount; ++i)
            {
                var child = this.GetChildAt(i);
                child.Layout(0, 0, 24, 24);
            }
        }
    }

在活动布局(FirstView.axml)中使用的是这样的:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <hotspotappandroid.droid.views.MyCustomLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        local:MvxBind="ItemsSource Hotspots"
        local:MvxItemTemplate="@layout/hotspot" />
</FrameLayout>

视图模型有一个项目:

public class FirstViewModel : MvxViewModel
{
    public string[] Hotspots { get; private set; }

    public FirstViewModel()
    {
        this.Hotspots = new string[] { "A" };
    }
}

hotspot.xml是一个ImageView,其图像(circle.png)为24x24:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:src="@drawable/circle" />

问题是没有绘制圆形图像。

如果在hotspot.xml中我将android:layout_width="fill_parent"android:layout_height="fill_parent更改为wrap_content,则会绘制图像,但不正确。 图像被画成两半。看起来图像被缩放到它的大小的两倍,它被裁剪了一半(可能是由于'child.Layout(0,0,24,24))。

我不确定发生了什么。我看到child中的OnLayout类型为cirrious.mvvmcross.binding.droid.views.MvxListItemView,而不是'ImageView',因为我原本期望这样。也许这有事可做?

1 个答案:

答案 0 :(得分:0)

MvxFrameLayout通过为每个孩子为孩子MvxListItemView充气来实现。 MvxListItemView本身继承自FrameLayout并具有默认布局参数。

根据文档 - http://developer.android.com/reference/android/widget/FrameLayout.html - 这意味着每个子FrameLayout都应该调整大小:

  

FrameLayout的大小是其最大子级(加填充)的大小,可见或不可见(如果FrameLayout的父级允许)

由于您在这里为fill_parent内孙子指定ImageView,我猜这就是导致您的内部视图为零的原因。

为了让您的子框架具有一定的尺寸,最好直接在内部子XML中提供ImageView尺寸,而不是请求fill_parent


如果您确实希望直接返回ImageView并将其用作Child - 没有中间MvxListItemView,那么在最新的MvvmCross源代码中我相信您可以: