使用declare styleable来设置自定义组件的inputtypes

我有一个CompositeComponent(EditText + ImageButton)当点击buttonedittext的内容将被清除。 它工作正常。 我的问题是设置属性到我的组件。 我使用declare-styleable来为我的组件设置属性。

我成功地设置了minLines,maxLines和textColor。

我怎样才能通过xml设置inputtype到我的组件。

我的属性.xml

<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CET"> <attr name="MaxLines" format="integer"/> <attr name="MinLines" format="integer"/> <attr name="TextColor" format="color"/> <attr name="InputType" format="integer" /> <attr name="Hint" format="string" /> </declare-styleable> </resources> 

在main_layout.xml中使用mycomponent:

 <com.test.ui.ClearableEditText xmlns:cet="http://schemas.android.com/apk/res/com.test.ui" android:id="@+id/clearableEditText2" android:layout_width="wrap_content" android:layout_height="wrap_content" cet:MaxLines="2" cet:MinLines="1" cet:TextColor="#0000FF" cet:InputType="" <---I cant set this property---------> cet:Hint="Clearable EditText Hint"> </com.test.ui.ClearableEditText> 

普通的Edittext用法:

 <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="numberSigned" <--------I want to use this property--------> > 

我不能在我的attribute.xml中使用ENUM。 如何引用android:inputType="numberSigned"在我的cet:InputType

编辑:

这是我如何在我的ClearableEditText.java中分配属性

 TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.CET,0, 0); int minLines = a.getInt(R.styleable.CET_MinLines, 1); int maxLines = a.getInt(R.styleable.CET_MaxLines, 100); String hint = a.getString(R.styleable.CET_Hint); int textColor = a.getColor(R.styleable.CET_TextColor, Color.BLACK); int inputType = a.getInt(R.styleable.CET_InputType, -108); Log.i(TAG, "ClearableEditText: Min Line "+minLines +" Max Lines: "+maxLines+" Hint "+hint+" Color: "+textColor+" Input Type: "+inputType); edit_text.setMaxLines(maxLines); edit_text.setMinLines(minLines); edit_text.setTextColor(textColor); edit_text.setHint(hint); if(inputType != -108) edit_text.setInputType(inputType); 

你可以看到将inputType属性赋给editText没有问题。

Solutions Collecting From Web of "使用declare styleable来设置自定义组件的inputtypes"

比方说你有一个名为InputView的自定义视图,它不是一个TextView(可以说它是一个RelativeLayout)。

在你的attrs.xml中:

 <declare-styleable name="InputView"> <!-- any custom attributes --> <attr name="title" format="string" /> <!-- standart attributes, note android: prefix and no format attribute --> <attr name="android:imeOptions"/> <attr name="android:inputType"/> </declare-styleable> 

在你想要包含InputView的xml布局中:

 <!-- note xmlns:custom and com.mycompany.myapp --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- note that you will be using android: prefix for standart attributes, and not custom: prefix --> <!-- also note that you can use standart values: actionNext or textEmailAddress --> <com.mycompany.myapp.InputView android:id="@+id/emailField" android:layout_width="fill_parent" android:layout_height="wrap_content" custom:title="@string/my_title" android:imeOptions="actionNext|flagNoExtractUi" android:inputType="textEmailAddress" /> </FrameLayout> 

在您的自定义类中,您可以像往常一样提取属性:

  ... private String title; private int inputType; private int imeOptions; ... TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.InputView); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.InputView_title: title = a.getString(attr); break; //note that you are accessing standart attributes using your attrs identifier case R.styleable.InputView_android_inputType: inputType = a.getInt(attr, EditorInfo.TYPE_TEXT_VARIATION_NORMAL); break; case R.styleable.InputView_android_imeOptions: imeOptions = a.getInt(attr, 0); break; default: Log.d("TAG", "Unknown attribute for " + getClass().toString() + ": " + attr); break; } } a.recycle(); ... 

在你的attr.xml中使用这个build议。 在使用edittext的时候,标志的使用给了xml中的build议。 自定义:inputType =“文本”,它会build议你的添加types。 添加更多的标志使用此链接访问https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/attrs.xml

 <resources> <declare-styleable name="ClearableEditText"> <attr name="hintText" format="string" /> <attr name="inputType" format="integer"> <!-- There is no content type. The text is not editable. --> <flag name="none" value="0x00000000" /> <!-- Just plain old text. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_NORMAL}. --> <flag name="text" value="0x00000001" /> <!-- Can be combined with <var>text</var> and its variations to request capitalization of all characters. Corresponds to {@link android.text.InputType#TYPE_TEXT_FLAG_CAP_CHARACTERS}. --> </attr> </declare-styleable> </resources> 

我设法用原始的int值做到这一点:我认为这不是一个好习惯。 我可以像这样分配原始值: cet:InputType="2"

2为数字(引用的值: http : //developer.android.com/reference/android/text/InputType.html#TYPE_CLASS_NUMBER和http://developer.android.com/reference/android/R.styleable.html TextView_inputType )

我相信<attr name="InputType" format="reference" />可以帮助,但不知道如何使用它。