android xml中的视图自定义命名空间

时间:2015-02-11 03:03:20

标签: android

这里我在android中制作了自己的自定义小部件,它们都运行良好。但是,我有20个xml文件,我不希望在我拥有的所有xml布局中将xml中的EditText更改为com.example.customwidget.MyEditText。有什么快速的方法吗?

例如: 以下xml不起作用。它会使应用程序崩溃,因为android sdk小部件中没有MyEditText,这是我自己的小部件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <MyEditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:ems="10"
        android:inputType="number" >

        <requestFocus />
    </MyEditText>

</RelativeLayout>

然而, 这个可行:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.example.customwidget.MyEditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:ems="10"
        android:inputType="number" >

        <requestFocus />
    </com.example.customwidget.MyEditText>

</RelativeLayout>

我想要做的是简单地将EditText标记保留在xml中。但是,我想通过我自己的自定义EditText

好的我知道我必须先将类名更改为EditText而不是MyEditText但是如何让所有XML布局文件知道我想要的我的自定义EditText而不是原生的?

1 个答案:

答案 0 :(得分:2)

实施自定义LayoutInflater.Factory并将其设置为your activity's LayoutInflater

以下是此类工厂的示例:

public class MyLayoutInflaterFactory implements LayoutInflater.Factory
{
    public View onCreateView(String name, Context context, AttributeSet attrs)
    {
        if ("EditText".equals(name))
            return new MyEditText(context, attrs);
        return null;
    }
}

然后你需要在你的活动中使用它:

public class MyActivity extends Activity
{
    ⋮

     LayoutInflater layoutInflater;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        layoutInflater = LayoutInflater
            .from(this)
            .cloneInContext(this)
            .setFactory(new MyLayoutInflaterFactory());

         setContentView(layoutInflater.inflate(R.layout.my_activity, null));
    }

    @Override
    public LayoutInflater getLayoutInflater()
    {
        return layoutInflater;
    }

    ⋮
}