Android:如何对用户名和电话号码使用相同的编辑文本

Android:如何对用户名和电话号码使用相同的编辑文本,android,android-edittext,phone-number,android-textinputlayout,android-textwatcher,Android,Android Edittext,Phone Number,Android Textinputlayout,Android Textwatcher,问题:用户应该能够通过他们的电话号码或用户名(注册时设置的)登录。这两个值都允许用户登录。Edittext字段需要足够智能才能确定输入的内容。因此,当用户输入一个号码作为第一个字符时,它应该自动添加国家代码电话号码前缀,并在前缀后插入键入的字符 这是我的布局: <LinearLayout android:id="@+id/login" android:layout_width="match_parent" android:layout_he

问题:用户应该能够通过他们的电话号码或用户名(注册时设置的)登录。这两个值都允许用户登录。Edittext字段需要足够智能才能确定输入的内容。因此,当用户输入一个号码作为第一个字符时,它应该自动添加国家代码电话号码前缀,并在前缀后插入键入的字符

这是我的布局:

 <LinearLayout
        android:id="@+id/login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:orientation="vertical">


        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.design.widget.TextInputLayout
                android:id="@+id/emaillayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:animateLayoutChanges="true"
                android:background="@drawable/login_field"
                android:padding="2dp"
                android:paddingStart="5dp"
                android:visibility="visible">

                <AutoCompleteTextView
                    android:id="@+id/email"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@android:color/transparent"
                    android:hint="@string/prompt_email"
                    android:inputType="textEmailAddress"
                    android:maxLines="1"
                    android:padding="2dp"
                    android:singleLine="true" />

            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:id="@+id/phlayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:animateLayoutChanges="true"
                android:background="@drawable/login_field"
                android:orientation="horizontal"
                android:padding="2dp"
                android:paddingStart="5dp"
                android:visibility="gone">


                <EditText
                android:id="@+id/et_ph"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:ems="10"
                android:hint="Phone number"
                android:inputType="phone" />

            </android.support.design.widget.TextInputLayout>

        </FrameLayout>



        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.design.widget.TextInputLayout

            android:id="@+id/pwdlayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"

            android:background="@drawable/login_field"
            android:orientation="horizontal"
            android:padding="2dp"
            android:paddingStart="5dp">

                <EditText
                android:id="@+id/password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/transparent"
                android:hint="@string/prompt_password"
                android:imeActionId="6"
                android:imeActionLabel="@string/action_sign_in_short"
                android:imeOptions="actionUnspecified"
                android:inputType="textPassword"
                android:maxLines="1"
                android:padding="2dp"
                android:singleLine="true" />
            </android.support.design.widget.TextInputLayout>

            <TextView
                android:id="@+id/pwdtoggle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end|center_vertical"
                android:text="SHOW"
                android:layout_marginRight="16dp"
                android:paddingTop="10dp"
                />
        </FrameLayout>

        <Button

            android:id="@+id/email_sign_in_button"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginEnd="5dp"
            android:layout_marginStart="5dp"
            android:layout_marginTop="16dp"
            android:background="@drawable/sausage_button"
            android:text="@string/action_sign_in"
            android:textStyle="bold" />


    </LinearLayout>
所以通过这个实现,我能够实现我想要的。以下是截图:


虽然我可以获得结果,但我觉得一直调用文本观察程序可能会有点开销,因为我使用了两个单独的视图并添加了两个文本观察程序实例。用什么方法可以使它更干净、更高效?。此外,我想了解当我按下键盘上的退格键时,如何确保前缀未被擦除,而是将视图更改为用户名字段?

您可以使用一个
编辑文本
来实现中的功能

mPhoneAndEmailView.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s)
        {
          if(isNumberOnly(s.toString()) && !mPhoneAndEmailView.contains("+61")){
             mPhoneAndEmailView.setText("+61" + s);
          }//utlimately when you clear number and start typing text it will ignore if and takes alpha or if it has only numbers first time it will append +61

        }
    });

用这种方法试试,对我来说很管用。我只使用一个
EditText
,并以编程方式更改所有属性

MainActivity.java

public class MainActivity extends AppCompatActivity {
TextInputLayout textInputLayout;
AppCompatEditText edtPhnUsername;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    textInputLayout = findViewById(R.id.textInputLayout);
    edtPhnUsername = findViewById(R.id.edtPhnUsername);


    edtPhnUsername.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            new Thread(new Runnable() {
                @Override
                public void run() {

                    changeEditTextState();
                }
            }).start();


        }

        @Override
        public void afterTextChanged(Editable s) {


        }
    });


}


private void changeEditTextState() {
    String uname = edtPhnUsername.getText().toString().trim();

    if (!TextUtils.isEmpty(uname)) {
        String desiredString = "";

        if (uname.length() >= 3) {
            desiredString = uname.substring(0, 3);
        }

        if (uname.contains("+61") && desiredString.equalsIgnoreCase("+61")) {
            changeToPhoneNumber();
        } else {
            changeToUsername();
        }
    } else {
        //default
        changeToUsername();
    }

}

private void changeToPhoneNumber() {
    textInputLayout.setHint("Phone number");
    edtPhnUsername.setInputType(InputType.TYPE_CLASS_PHONE);

    setEditTextMaxLength(10);



}

private void changeToUsername() {
    textInputLayout.setHint("Username");
    edtPhnUsername.setInputType(InputType.TYPE_CLASS_TEXT);
    setEditTextMaxLength(50);
}

public void setEditTextMaxLength(int length) {
    InputFilter[] filterArray = new InputFilter[1];
    filterArray[0] = new InputFilter.LengthFilter(length);
    edtPhnUsername.setFilters(filterArray);
}



}
活动\u main.xml

 <android.support.design.widget.TextInputLayout
    android:id="@+id/textInputLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:orientation="horizontal"
    android:paddingStart="5dp"
    android:hint="Username"
    android:paddingLeft="5dp">


    <android.support.v7.widget.AppCompatEditText
        android:id="@+id/edtPhnUsername"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:maxLines="1"
        android:layout_weight="1" />

</android.support.design.widget.TextInputLayout>


如果我的用户名是99个红球怎么办?我认为你的逻辑必须更强一点,而不仅仅是测试输入的第一个字符。也许只考虑数字+输入的总长度+格式验证器+有效区域代码表。如果电话和用户名都允许签名,那么它必须在你的数据源/数据库中是唯一的。关于@TooManyEduardos的问题,如果您不允许在用户名开头使用数字文字,那么您已经找到了正确的方法。删除第二个
TextInputLayout
,然后使用一个。而
TextWatcher
的另一种选择就是将其删除。当您在任何方法(例如发送到服务器或其他)中使用
视图的文本时,您只需检查第一个条目是数字还是字符,并确定给定的输入类型。
 <android.support.design.widget.TextInputLayout
    android:id="@+id/textInputLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:orientation="horizontal"
    android:paddingStart="5dp"
    android:hint="Username"
    android:paddingLeft="5dp">


    <android.support.v7.widget.AppCompatEditText
        android:id="@+id/edtPhnUsername"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:maxLines="1"
        android:layout_weight="1" />

</android.support.design.widget.TextInputLayout>