studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android custom-component attr

android - programacion - Utilice declarar styleable para establecer el tipo de entrada de componente personalizado



manual de programacion android pdf (4)

Tengo un CompositeComponent (EditText + ImageButton) Al hacer clic en el botón, se borrará el contenido del texto de edición. Está funcionando bien. Mi problema es establecer atributos en mi componente. Estoy usando declare-styleable para establecer atributos en mi componente.

Tengo éxito en establecer minLines, maxLines y textColor.

¿Cómo puedo configurar el tipo de entrada en mi componente a través de xml?

mis atributos.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>

Y el uso de mycomponent en main_layout.xml:

<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>

Uso ordinario de 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--------> >

No puedo usar ENUM en mi attribute.xml. Cómo referir a android:inputType="numberSigned" en mi cet:InputType ?

EDITAR:

Así es como asigno propiedades en mi 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);

Puede ver que no hay problema con la asignación de la propiedad inputType a editText.


De acuerdo, entonces sé que esta pregunta es bastante antigua, pero encontré la VERDADERA respuesta correcta.

Encontré el archivo attrs.xml here que usa Android y cada declare_styleable está allí, así que a partir de los atributos estándar puedes encontrar el atributo inputType que se define a continuación.

<!-- The type of data being placed in a text field used to help an input method decide how to let the user enter text. The constants here correspond to those defined by {@link android.text.InputType}. Generally you can select a single value, though some can be combined together as indicated. Setting this attribute to anything besides <var>none</var> also implies that the text is editable. --> <attr name="inputType"> <!-- 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}. --> <flag name="textCapCharacters" value="0x00001001" /> <!-- Can be combined with <var>text</var> and its variations to request capitalization of the first character of every word. Corresponds to {@link android.text.InputType#TYPE_TEXT_FLAG_CAP_WORDS}. --> <flag name="textCapWords" value="0x00002001" /> <!-- Can be combined with <var>text</var> and its variations to request capitalization of the first character of every sentence. Corresponds to {@link android.text.InputType#TYPE_TEXT_FLAG_CAP_SENTENCES}. --> <flag name="textCapSentences" value="0x00004001" /> <!-- Can be combined with <var>text</var> and its variations to request auto-correction of text being input. Corresponds to {@link android.text.InputType#TYPE_TEXT_FLAG_AUTO_CORRECT}. --> <flag name="textAutoCorrect" value="0x00008001" /> <!-- Can be combined with <var>text</var> and its variations to specify that this field will be doing its own auto-completion and talking with the input method appropriately. Corresponds to {@link android.text.InputType#TYPE_TEXT_FLAG_AUTO_COMPLETE}. --> <flag name="textAutoComplete" value="0x00010001" /> <!-- Can be combined with <var>text</var> and its variations to allow multiple lines of text in the field. If this flag is not set, the text field will be constrained to a single line. Corresponds to {@link android.text.InputType#TYPE_TEXT_FLAG_MULTI_LINE}. --> <flag name="textMultiLine" value="0x00020001" /> <!-- Can be combined with <var>text</var> and its variations to indicate that though the regular text view should not be multiple lines, the IME should provide multiple lines if it can. Corresponds to {@link android.text.InputType#TYPE_TEXT_FLAG_IME_MULTI_LINE}. --> <flag name="textImeMultiLine" value="0x00040001" /> <!-- Can be combined with <var>text</var> and its variations to indicate that the IME should not show any dictionary-based word suggestions. Corresponds to {@link android.text.InputType#TYPE_TEXT_FLAG_NO_SUGGESTIONS}. --> <flag name="textNoSuggestions" value="0x00080001" /> <!-- Text that will be used as a URI. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_URI}. --> <flag name="textUri" value="0x00000011" /> <!-- Text that will be used as an e-mail address. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_EMAIL_ADDRESS}. --> <flag name="textEmailAddress" value="0x00000021" /> <!-- Text that is being supplied as the subject of an e-mail. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_EMAIL_SUBJECT}. --> <flag name="textEmailSubject" value="0x00000031" /> <!-- Text that is the content of a short message. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_SHORT_MESSAGE}. --> <flag name="textShortMessage" value="0x00000041" /> <!-- Text that is the content of a long message. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_LONG_MESSAGE}. --> <flag name="textLongMessage" value="0x00000051" /> <!-- Text that is the name of a person. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_PERSON_NAME}. --> <flag name="textPersonName" value="0x00000061" /> <!-- Text that is being supplied as a postal mailing address. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_POSTAL_ADDRESS}. --> <flag name="textPostalAddress" value="0x00000071" /> <!-- Text that is a password. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_PASSWORD}. --> <flag name="textPassword" value="0x00000081" /> <!-- Text that is a password that should be visible. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_VISIBLE_PASSWORD}. --> <flag name="textVisiblePassword" value="0x00000091" /> <!-- Text that is being supplied as text in a web form. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_WEB_EDIT_TEXT}. --> <flag name="textWebEditText" value="0x000000a1" /> <!-- Text that is filtering some other data. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_FILTER}. --> <flag name="textFilter" value="0x000000b1" /> <!-- Text that is for phonetic pronunciation, such as a phonetic name field in a contact entry. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_PHONETIC}. --> <flag name="textPhonetic" value="0x000000c1" /> <!-- Text that will be used as an e-mail address on a web form. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS}. --> <flag name="textWebEmailAddress" value="0x000000d1" /> <!-- Text that will be used as a password on a web form. Corresponds to {@link android.text.InputType#TYPE_CLASS_TEXT} | {@link android.text.InputType#TYPE_TEXT_VARIATION_WEB_PASSWORD}. --> <flag name="textWebPassword" value="0x000000e1" /> <!-- A numeric only field. Corresponds to {@link android.text.InputType#TYPE_CLASS_NUMBER} | {@link android.text.InputType#TYPE_NUMBER_VARIATION_NORMAL}. --> <flag name="number" value="0x00000002" /> <!-- Can be combined with <var>number</var> and its other options to allow a signed number. Corresponds to {@link android.text.InputType#TYPE_CLASS_NUMBER} | {@link android.text.InputType#TYPE_NUMBER_FLAG_SIGNED}. --> <flag name="numberSigned" value="0x00001002" /> <!-- Can be combined with <var>number</var> and its other options to allow a decimal (fractional) number. Corresponds to {@link android.text.InputType#TYPE_CLASS_NUMBER} | {@link android.text.InputType#TYPE_NUMBER_FLAG_DECIMAL}. --> <flag name="numberDecimal" value="0x00002002" /> <!-- A numeric password field. Corresponds to {@link android.text.InputType#TYPE_CLASS_NUMBER} | {@link android.text.InputType#TYPE_NUMBER_VARIATION_PASSWORD}. --> <flag name="numberPassword" value="0x00000012" /> <!-- For entering a phone number. Corresponds to {@link android.text.InputType#TYPE_CLASS_PHONE}. --> <flag name="phone" value="0x00000003" /> <!-- For entering a date and time. Corresponds to {@link android.text.InputType#TYPE_CLASS_DATETIME} | {@link android.text.InputType#TYPE_DATETIME_VARIATION_NORMAL}. --> <flag name="datetime" value="0x00000004" /> <!-- For entering a date. Corresponds to {@link android.text.InputType#TYPE_CLASS_DATETIME} | {@link android.text.InputType#TYPE_DATETIME_VARIATION_DATE}. --> <flag name="date" value="0x00000014" /> <!-- For entering a time. Corresponds to {@link android.text.InputType#TYPE_CLASS_DATETIME} | {@link android.text.InputType#TYPE_DATETIME_VARIATION_TIME}. --> <flag name="time" value="0x00000024" /> </attr>

Así que tienes 2 opciones, si necesitas cambiar el nombre de inputType por otro nombre (es decir, title_inputType), entonces debes copiar todo esto, pero si necesitas mantener el mismo nombre, entonces usa la respuesta de Alexey


Digamos que tiene una vista personalizada llamada InputView, que no es un TextView (digamos que es un RelativeLayout).

En su 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>

En un diseño xml donde quiera incluir InputView:

<!-- 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>

Dentro de tu clase personalizada puedes extraer atributos como de costumbre:

... 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(); ...



usa esto en tu attr.xml para las sugerencias. el uso de banderas da las sugerencias en xml al usar edittext. la costumbre: inputType = "text" y le sugerirá los tipos de adición. para agregar más banderas use este enlace Visite 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>