I designed a layout for a create account activity.
when one EditText loses focus, I’m doing some checking on the input and if something is not right I want to regain the focus on that EditText.
I already saw some questions about this, but its not working for me (or I’m doing something wrong).
when I touch on a different EditText which triggers the requestFocus(), the focus remains on the current EditText and another focus icon is shown in the EditText which requeted the focus.
help please
here’s my layout file:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.cellap.tq"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:focusable="true"
android:focusableInTouchMode="true"
android:background="@drawable/create_account_background" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_marginTop="70dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="10dp">
<TextView
android:id="@+id/userTextView"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:textColor="#F4DFA7"
android:layout_marginRight="5dp"
android:text="Username"
android:gravity="right"
android:layout_gravity="center_vertical"/>
<EditText
android:id="@+id/userEditText"
android:inputType="text|textEmailAddress"
android:layout_width="fill_parent"
android:layout_height="30dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:maxLength="64"
android:background="@drawable/edit_text"
android:layout_gravity="center_vertical|right"
android:textColor="@android:color/white">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="10dp">
<TextView
android:id="@+id/passTextView"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="#F4DFA7"
android:layout_marginRight="5dp"
android:gravity="right"
android:text="Password"/>
<EditText
android:id="@+id/passEditText"
android:layout_width="fill_parent"
android:layout_height="30dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:maxLength="30"
android:layout_gravity="center_vertical"
android:inputType="textPassword"
android:textColor="@android:color/white"
android:background="@drawable/edit_text">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="10dp">
<TextView
android:id="@+id/passConfirmTextView"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="#F4DFA7"
android:layout_marginRight="5dp"
android:gravity="right"
android:text="Confirm password"/>
<EditText
android:id="@+id/passConfirmEditText"
android:layout_width="fill_parent"
android:layout_height="30dp"
android:layout_gravity="center_vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:maxLength="30"
android:inputType="textPassword"
android:background="@drawable/edit_text"
android:textColor="@android:color/white">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="10dp">
<TextView
android:id="@+id/emailTextView"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="#F4DFA7"
android:layout_marginRight="5dp"
android:gravity="right"
android:text="Email"/>
<EditText
android:id="@+id/emailEditText"
android:layout_width="fill_parent"
android:layout_height="30dp"
android:layout_gravity="center_vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:maxLength="255"
android:scrollHorizontally="false"
android:inputType="textEmailAddress"
android:background="@drawable/edit_text"
android:textColor="@android:color/white">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="10dp">
<TextView
android:id="@+id/confirmEmailTextView"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="#F4DFA7"
android:layout_marginRight="5dp"
android:gravity="right"
android:text="Confirm email"/>
<EditText
android:id="@+id/confirmEmailEditText"
android:layout_width="fill_parent"
android:layout_height="30dp"
android:layout_gravity="center_vertical"
android:maxLength="255"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:inputType="textEmailAddress"
android:background="@drawable/edit_text"
android:textColor="@android:color/white">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="10dp">
<TextView
android:id="@+id/signupTextView"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="#F4DFA7"
android:layout_marginRight="5dp"
android:gravity="right"
android:text="Sign up:"/>
<TextView
android:id="@+id/signUpText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="#FF0000"
android:paddingRight="5dp"
/>
</LinearLayout>
<com.cellap.tq.ButtonView
android:id="@+id/create_btn"
android:layout_width="216dp"
android:layout_height="49dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:focusable="true"
android:focusableInTouchMode="true"
custom:button="create_btn"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal"
android:layout_marginTop="15dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp">
<Button
android:id="@+id/fbconnect_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_marginRight="5dp"
android:background="@drawable/fbconnect_btn"/>
</LinearLayout>
in the code I do like that:
final EditText userEditText = (EditText)findViewById(R.id.userEditText);
userEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus){
Log.i(TAG, "userEditText lost focus");
m_userName = userEditText.getText().toString();
if(m_userName.length() < 6){
m_signUpText.setText("Username should have at least 6 characters");
userEditText.requestFocus();
}
else{
checkUserNameExists();
}
}
}
});
found a solution here
This solution works (no need to add android:focusable=”true”\android:focusableInTouchMode=”true”):
To clarify the problem:
User edits EditText A -> user touch EditText B to edit it -> EditText A onFocusListener.onFocusChanged is called -> EditText A requestFocus -> EditText B still has the focus and typing any text, writes to its edit text. only a marker of focus, appears on EditText A.