3

如果我有一个仅包含一个 . 的布局文件,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) { }        
    }
}
4

1 回答 1

0

我相信您还没有提供另外一个构造函数,

TextView(Context context, AttributeSet attrs, int defStyle)

我以前在没有涵盖所有默认构造函数的情况下膨胀和实例化事物时遇到过问题,这也可能是火上浇油。至于自动包装的魔力。至于它自动为你做什么,我不能说。

于 2014-03-18T18:44:51.647 回答