这里我在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
而不是原生的?
答案 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;
}
⋮
}