Android:如何对用户名和电话号码使用相同的编辑文本
问题:用户应该能够通过他们的电话号码或用户名(注册时设置的)登录。这两个值都允许用户登录。Edittext字段需要足够智能才能确定输入的内容。因此,当用户输入一个号码作为第一个字符时,它应该自动添加国家代码电话号码前缀,并在前缀后插入键入的字符 这是我的布局: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
<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>