Edición de Edición personalizada de Android y NextFocusDown
En mi actividad de registro hay algunas vistas personalizadas de EditText definidas en un LinearLayout vertical. De arriba hacia abajo.
Debido a que necesito alguna funcionalidad adicional para cada EditText, he creado una clase EditText personalizada que proporciona esa funcionalidad adicional. Esa clase se basa en algunos atributos personalizados que se agregaron en attrs.xml y se recuperan en la clase y luego se establecen en el editado EditText.
- Errores de procesamiento XML Vista previa de Android N
- Match_parent no funciona para ListView, si ListView está dentro de NestedScrollView
- Android: textColor del botón deshabilitado en el selector no se muestra?
- Doctype Android lint.xml con declaración dtd
- Android: propósito de usoLevel en etiqueta de forma
Todo funciona bien excepto por una cosa que no puedo resolver. Parece que no puedo obtener NextFocusDown para trabajar en mis vistas personalizadas de EditText. Cuando se utiliza vistas estándar de EditText, funciona bien. Cuando cambie a mi EditText personalizado, lo ignora. Todos los demás atributos funcionan normalmente excepto éste.
¿Qué me estoy perdiendo? ¿Alguien ha logrado utilizar ese atributo en una vista de texto de edición personalizada?
¡Gracias!
EDITAR:
Esto es parte de la clase EditText personalizada:
public class CustomEditText extends RelativeLayout { private LayoutInflater mInflater = null; private EditText mEditText; private TextView mHintQuestionMark; private TextView mHintText; private Button mButtonClear; private boolean isExpandView = false; private boolean clearButtonEnabled = false; private boolean hintEnabled = false; public CustomEditText(Context context) { super(context); initViews(); } public CustomEditText(Context context, AttributeSet attrs) { super(context, attrs); initViews(); getCustomAttributes(context, attrs); } public CustomEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initViews(); getCustomAttributes(context, attrs); } private void initViews() { mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); mInflater.inflate(R.layout.custom_edit_text, this, true); mHintText = (TextView) findViewById(R.id.theHint); mEditText = (EditText) findViewById(R.id.theEditText); mEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { if (clearButtonEnabled){ if (charSequence.length() > 0){ mButtonClear.setVisibility(VISIBLE); } else { mButtonClear.setVisibility(INVISIBLE); } } } @Override public void afterTextChanged(Editable editable) { } }); mHintQuestionMark = (TextView) findViewById(R.id.hintQuestionMark); mHintQuestionMark.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (isExpandView) { collapseHeight(mHintText); } else { // Expand the HINT view downwards expandHeight(mHintText); } } }); mButtonClear = (Button) findViewById(R.id.buttonClear); mButtonClear.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { mEditText.setText(""); } }); } private void getCustomAttributes(Context ctx, AttributeSet attrs){ TypedArray typedArray = ctx.getTheme().obtainStyledAttributes(attrs, R.styleable.edittext_attrs, 0, 0); int firstNameId = 0; int lastNameId = 0; try{ mEditText.setInputType(typedArray.getInt(R.styleable.edittext_attrs_android_inputType, EditorInfo.TYPE_TEXT_VARIATION_NORMAL)); mEditText.setHint(typedArray.getString(R.styleable.edittext_attrs_android_hint)); mEditText.setNextFocusDownId(typedArray.getInt(R.styleable.edittext_attrs_android_nextFocusDown, -1)); clearButtonEnabled = typedArray.getBoolean(R.styleable.edittext_attrs_add_clear_button, false); hintEnabled = typedArray.getBoolean(R.styleable.edittext_attrs_add_hint_icon, false); } finally { typedArray.recycle(); } if (hintEnabled){ mHintQuestionMark.setVisibility(VISIBLE); } else { mHintQuestionMark.setVisibility(GONE); } }
Esta es la costumbre editar texto xml Estoy inflando en esa clase:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <LinearLayout android:id="@+id/editTextGroup" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <RelativeLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <EditText android:id="@+id/theEditText" android:layout_width="match_parent" android:layout_height="52dp" android:layout_weight="1" android:background="@drawable/edit_text_rectangle" android:maxLength="53" android:padding="12dp" android:visibility="visible" /> <Button android:id="@+id/buttonClear" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@drawable/remove_text_x" android:layout_marginLeft="5dp" android:visibility="gone" /> </RelativeLayout> <TextView android:id="@+id/hintQuestionMark" android:layout_width="36dp" android:layout_height="52dp" android:text="\?" android:textColor="#eeeeee" android:textSize="30sp" android:gravity="center" android:layout_gravity="right" android:background="#288abf" android:visibility="gone" /> </LinearLayout> <TextView android:id="@+id/theHint" android:layout_width="match_parent" android:layout_height="120dp" android:padding="8dp" android:text="@string/txtEmailHintText" android:textColor="#eeeeee" android:textSize="15sp" android:gravity="left" android:background="#288abf" android:layout_alignLeft="@+id/editTextGroup" android:layout_below="@+id/editTextGroup" android:visibility="gone" /> </RelativeLayout>
Este es el archivo attrs.xml que utilizo para obtener los valores en la clase edittext personalizada:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="edittext_attrs"> <attr name="android:inputType" /> <attr name="android:hint" /> <attr name="android:nextFocusDown" /> <attr name="add_clear_button" format="boolean" /> <attr name="add_hint_icon" format="boolean" /> </declare-styleable> </resources>
Y esta es una pequeña parte de la xml diseño que utilizo para la actividad de registro con sus dos vistas que deben utilizar el NextFocusDown:
<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="16dp"> <com.name.view.customViews.CustomEditText android:id="@+id/registerTxtFirstName" android:layout_width="133dp" android:layout_height="52dp" android:nextFocusDown="@+id/registerTxtLastName" android:layout_alignParentLeft="true" android:inputType="textPersonName" custom:add_clear_button="true" android:hint="@string/first" android:visibility="visible" /> <com.name.view.customViews.CustomEditText android:id="@+id/registerTxtLastName" android:layout_width="133dp" android:layout_height="52dp" android:layout_alignParentRight="true" custom:add_clear_button="true" android:hint="@string/last" android:inputType="textPersonName" android:visibility="visible" /> </RelativeLayout>
Espero que haya suficiente información aquí para ver cuál es el problema.
¡Gracias!
- La actividad con fragmentos no cambia de tamaño cuando se abre el teclado
- Creación de servicio web para aplicaciones de Android
- Cómo rellenar una vista de cuadrícula en XML
- Barra de herramientas superpuesta
- ¿Cómo activar el botón "Compartir" en la aplicación Android?
- Considere la posibilidad de agregar android: paddingStart = "25dp" para soportar mejor layouts de derecha a izquierda Error
- Androide. OnEditorAction nunca llamado
- Hacer texto en negrita y cursiva
Old post, pero estoy presentando esta respuesta en caso de que alguien más se encuentra con el mismo problema.
En mi caso, encontré usando setOnClickListener()
en el CustomEditText en cuestión hace que el android:nextFocusDown=""
propiedad xml no funcione correctamente.
Por ejemplo:
Myxml.xml
<com.view.MyCustomEditText android:id="@+id/username" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:hint="@string/email_username" android:inputType="textEmailAddress" android:nextFocusDown="@+id/password"/> <EditText android:id="@+id/password" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="@string/password_hint" android:inputType="textPassword" android:imeOptions="actionDone"/>
MainActivity.java:
mUserEditText = (EditText) findViewById(R.id.username); mPasswordEditText = (EditText) findViewById(R.id.password); // Instead of using this mEditText.setOnClickListener(this) // Use mEditText.setOnTouchListener(this)
- ACR122U – Leer los datos NFC enviados desde el teléfono Android
- ¿Los archivos temporales se eliminan incluso mientras se está ejecutando la aplicación?