单视图布局文件:Compiler Autowrap与Layout / ViewGroup?

时间:2013-02-26 15:21:51

标签: c# android android-layout xamarin.android

如果我的布局文件只包含一个TextView,我可以在activity内对其进行充气。

但是,如果我尝试给类似的布局文件充气而不是包含一个自定义视图,那么我会得到通胀异常。 在这种情况下,我可以获得自定义视图以扩充的唯一方法是将其包装在Layout/ViewGroup内(即LinearLayout)。

因此,我想知道编译器是否会在Layout/ViewGroup(即LinearLayout)中自动换行内置视图 视图还没有嵌套在一个?

(当我有时间设置模拟器并提取布局树并发布时,我将测试这个 任何发现。)

感谢您的帮助。


案例1:工作正常

TextViewLayoutFile.axml

<?xml version="1.0" encoding="utf-8"?>
<TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/tv_name"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"/>

LayoutInflater infalInflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
view = infalInflater.Inflate(Resource.Layout.TextViewLayoutFile, null);

案例2:仅在MyTextView包装在布局(LinearLayout)

中时才有效
2a: Produces inflation exception
----------------------------------------------------------------------------
TextViewLayoutFile.axml

<?xml version="1.0" encoding="utf-8"?>
<AppName.Views.MyTextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/tv_name"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"/>

LayoutInflater infalInflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
view = infalInflater.Inflate(Resource.Layout.TextViewLayoutFile, null);

2b: Inflates ok
----------------------------------------------------------------------------
TextViewLayoutFile.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/ll_android_is"
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

  <AppName.Views.MyTextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_name"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>

</LinearLayout>

LayoutInflater infalInflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
view = infalInflater.Inflate(Resource.Layout.TextViewLayoutFile, null);

,其中

namespace AppName.Views 
{
    public class MyTextView : TextView
    {
        public MyTextView(Context context) : base(context) { }

        public MyTextView(Context context, IAttributeSet attributes) : base(context, attributes) { }        
    }
}

1 个答案:

答案 0 :(得分:0)

还有一个我认为你没有提供的构造函数,

TextView(Context context, AttributeSet attrs, int defStyle)

我以前遇到的问题是在没有覆盖所有默认构造函数的情况下膨胀和实例化事物,也可能在这里增加燃料。至于自动包装的神奇之处。至于它为你自动做什么,我无法说出来。