移动焦点从一个的EditText到另一个 [英] Moving focus from one EditText to another

查看:515
本文介绍了移动焦点从一个的EditText到另一个的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我设计了一个布局为创建帐户活动。

当一个的EditText 失去焦点,我做输入一番检查,如果事情是不对的我要夺回重点放在的EditText

我已经看到这个一些问题,但它不是为我工作(或者说我做错了什么)。

当我触摸不同的EditText从而引发requestFocus()方法,重点仍然是当前的的EditText 和另一个焦点图标在的EditText 这requeted的焦点。

帮助,请

这是我的布局文件:

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
的xmlns:定制=htt​​p://schemas.android.com/apk/res/com.cellap.tq
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:方向=垂直
机器人:可聚焦=真
机器人:focusableInTouchMode =真
机器人:背景=@绘制/ create_account_background><的LinearLayout
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =WRAP_CONTENT
    机器人:方向=横向
    机器人:可聚焦=真
    机器人:focusableInTouchMode =真
    机器人:layout_marginTop =70dp
    机器人:layout_marginLeft =5DP
    机器人:layout_marginRight =10dp>    <的TextView
        机器人:ID =@ + ID / userTextView
        机器人:layout_width =100dp
        机器人:layout_height =WRAP_CONTENT
        机器人:文字颜色=#F4DF​​A7
        机器人:layout_marginRight =5DP
        机器人:文字=用户名
        机器人:重力=右
        机器人:layout_gravity =center_vertical/>    <的EditText
        机器人:ID =@ + ID / userEditText
        安卓的inputType =TEXT | textEmailAddress
        机器人:layout_width =FILL_PARENT        机器人:layout_height =30dp
        机器人:paddingLeft =10dp
        机器人:paddingRight =10dp
        机器人:最大长度=64
        机器人:背景=@绘制/ edit_text
        机器人:layout_gravity =center_vertical |权
        机器人:文字颜色=@机器人:彩色/白>    < /&的EditText GT;
< / LinearLayout中>    <的LinearLayout
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:方向=横向
        机器人:可聚焦=真
        机器人:focusableInTouchMode =真
        机器人:layout_marginTop =5DP
        机器人:layout_marginLeft =5DP
        机器人:layout_marginRight =10dp>        <的TextView
            机器人:ID =@ + ID / passTextView
            机器人:layout_width =100dp
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_gravity =center_vertical
            机器人:文字颜色=#F4DF​​A7
            机器人:layout_marginRight =5DP
            机器人:重力=右
            机器人:文字=密码/>        <的EditText
            机器人:ID =@ + ID / passEditText
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =30dp            机器人:paddingLeft =10dp
            机器人:paddingRight =10dp
            机器人:最大长度=30
            机器人:layout_gravity =center_vertical
            安卓的inputType =textPassword
            机器人:文字颜色=@机器人:彩色/白
            机器人:背景=@绘制/ edit_text>
        < /&的EditText GT;
    < / LinearLayout中>    <的LinearLayout
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:方向=横向
        机器人:可聚焦=真
        机器人:focusableInTouchMode =真
        机器人:layout_marginTop =5DP
        机器人:layout_marginLeft =5DP
        机器人:layout_marginRight =10dp>        <的TextView
            机器人:ID =@ + ID / passConfirmTextView
            机器人:layout_width =100dp
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_gravity =center_vertical
            机器人:文字颜色=#F4DF​​A7
            机器人:layout_marginRight =5DP
            机器人:重力=右
            机器人:文字=确认密码/>        <的EditText
            机器人:ID =@ + ID / passConfirmEditText
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =30dp            机器人:layout_gravity =center_vertical
            机器人:paddingLeft =10dp
            机器人:paddingRight =10dp
            机器人:最大长度=30
            安卓的inputType =textPassword
            机器人:背景=@绘制/ edit_text
            机器人:文字颜色=@机器人:彩色/白>
        < /&的EditText GT;
    < / LinearLayout中>    <的LinearLayout
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:方向=横向
        机器人:可聚焦=真
        机器人:focusableInTouchMode =真
        机器人:layout_marginTop =5DP
        机器人:layout_marginLeft =5DP
        机器人:layout_marginRight =10dp>        <的TextView
            机器人:ID =@ + ID / emailTextView
            机器人:layout_width =100dp
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_gravity =center_vertical
            机器人:文字颜色=#F4DF​​A7
            机器人:layout_marginRight =5DP
            机器人:重力=右
            机器人:文字=电子邮件/>        <的EditText
            机器人:ID =@ + ID / emailEditText
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =30dp            机器人:layout_gravity =center_vertical
            机器人:paddingLeft =10dp
            机器人:paddingRight =10dp
            机器人:最大长度=255
            机器人:scrollHorizo​​ntally =假
            安卓的inputType =textEmailAddress
            机器人:背景=@绘制/ edit_text
            机器人:文字颜色=@机器人:彩色/白>
        < /&的EditText GT;
    < / LinearLayout中>    <的LinearLayout
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:方向=横向
        机器人:可聚焦=真
        机器人:focusableInTouchMode =真
        机器人:layout_marginTop =5DP
        机器人:layout_marginLeft =5DP
        机器人:layout_marginRight =10dp>        <的TextView
            机器人:ID =@ + ID / confirmEmailTextView
            机器人:layout_width =100dp
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_gravity =center_vertical
            机器人:文字颜色=#F4DF​​A7
            机器人:layout_marginRight =5DP
            机器人:重力=右
            机器人:文字=确认电子邮件/>        <的EditText
            机器人:ID =@ + ID / confirmEmailEditText
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =30dp            机器人:layout_gravity =center_vertical
            机器人:最大长度=255
            机器人:paddingLeft =10dp
            机器人:paddingRight =10dp
            安卓的inputType =textEmailAddress
            机器人:背景=@绘制/ edit_text
            机器人:文字颜色=@机器人:彩色/白>
        < /&的EditText GT;
    < / LinearLayout中>    <的LinearLayout
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:方向=横向
        机器人:可聚焦=真
        机器人:focusableInTouchMode =真
        机器人:layout_marginTop =5DP
        机器人:layout_marginLeft =5DP
        机器人:layout_marginRight =10dp>        <的TextView
            机器人:ID =@ + ID / signupTextView
            机器人:layout_width =100dp
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_gravity =center_vertical
            机器人:文字颜色=#F4DF​​A7
            机器人:layout_marginRight =5DP
            机器人:重力=右
            机器人:文字=注册/>        <的TextView
            机器人:ID =@ + ID / signUpText
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_gravity =center_vertical
            机器人:文字颜色=#FF0000
            机器人:paddingRight =5DP            />    < / LinearLayout中>
    < com.cellap.tq.ButtonView
        机器人:ID =@ + ID / create_btn
         机器人:layout_width =216dp
        机器人:layout_height =49dp
        机器人:layout_gravity =CENTER_HORIZONTAL
        机器人:layout_marginTop =30dp
        机器人:可聚焦=真
        机器人:focusableInTouchMode =真
        定制:按钮=create_btn/>
    <的LinearLayout
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:可聚焦=真
        机器人:focusableInTouchMode =真
        机器人:方向=横向
        机器人:layout_marginTop =15dp
        机器人:layout_marginBottom =5DP
        机器人:layout_marginLeft =30dp
        机器人:layout_marginRight =30dp>        <按钮
            机器人:ID =@ + ID / fbconnect_btn
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =WRAP_CONTENT
            机器人:可聚焦=真
            机器人:focusableInTouchMode =真
            机器人:layout_marginRight =5DP
            机器人:背景=@绘制/ fbconnect_btn/>    < / LinearLayout中>

在code我做这样的:

 最后的EditText userEditText =(EditText上)findViewById(R.id.userEditText);    userEditText.setOnFocusChangeListener(新OnFocusChangeListener(){        @覆盖
        公共无效onFocusChange(视图V,布尔hasFocus){
            如果(!hasFocus){
                Log.i(TAGuserEditText失去焦点);                。m_userName = userEditText.getText()的toString();
                如果(m_userName.length()6;){
                    m_signUpText.setText(用户名应该至少有6个字符);
                    userEditText.requestFocus();
                }
                其他{
                    checkUserNameExists();
                }            }
        }
    });


解决方案

找到了解决办法这里

此解决方案(无需添加机器人:可聚焦=真\\机器人:focusableInTouchMode =真):

 最后的EditText userEditText =(EditText上)findViewById(R.id.userEditText);userEditText.setOnFocusChangeListener(新OnFocusChangeListener(){    @覆盖
    公共无效onFocusChange(视图V,布尔hasFocus){
        如果(!hasFocus){
            Log.i(TAGuserEditText失去焦点);
            如果(空== m_requestFocus){
                。m_userName = userEditText.getText()的toString();
                如果(m_userName.length()6;){
                    m_signUpText.setText(用户名应该至少有6个字符);
                    m_requestFocus = userEditText;
                }
                其他{
                    checkUserNameExists();
                }
            }
        }
        其他{
            如果(空= m_requestFocus&安培;!m_requestFocus = userEditText){
                v.clearFocus();
                m_requestFocus.requestFocus();
                m_requestFocus = NULL;
            }
        }
    }
});

要澄清的问题:

用户编辑的EditText A - >用户触摸的EditText B到编辑 - >的EditText一个onFocusListener.onFocusChanged被称为 - > EditText上一个requestFocus的 - >的EditText乙仍然成为焦点并输入任何文字,写它的编辑文本。唯一的焦点的标志,出现在一个的EditText

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"):

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");
            if(null == m_requestFocus){
                m_userName = userEditText.getText().toString();
                if(m_userName.length() < 6){
                    m_signUpText.setText("Username should have at least 6 characters");
                    m_requestFocus = userEditText;
                }
                else{
                    checkUserNameExists();
                }
            }
        }
        else{
            if(null != m_requestFocus & m_requestFocus != userEditText){
                v.clearFocus();
                m_requestFocus.requestFocus();
                m_requestFocus = null;
            }
        }
    }
});

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.

这篇关于移动焦点从一个的EditText到另一个的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆