我想为一个 Android 应用程序创建一个布局,该应用程序具有数字小键盘并需要四位数字来确定它是否与预设密码值匹配。
我看到一些应用程序使用它,所以我认为它是某种描述的高级小部件。
我唯一能找到的与我想要的相差甚远的是:
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="numberPassword" >
<requestFocus />
</EditText>
但这并不是我真正想要的。
任何输入都很棒,在此先感谢。
编辑:这是我想要的 iOS Dropbox 应用程序启动屏幕的图像:
最佳答案
I'm beginner in Android. when I stuck in coding I always use to refer stackoverflow. I have learnt lot of things from stackoverflow. This is the first time i have dared to answer this question. Pardon me if I'm wrong and any suggestion regarding coding or the way of writing code in stackoverflow is highly appreciated. Thank You..
我在 Fragments 中做过类似的事情.. 取 4 个 EditText 并在 xml 中将所有 4 个 EditText 的 maxLength 属性设置为 1。您可以根据需要修改 EditText。
注意:对于 Stock Android KeyBoard 中的 DEL(退格键),可能会或可能不会调用 OnKey 方法。
public class VerifyCodeFrag extends Fragment implements TextWatcher,View.OnKeyListener,View.OnFocusChangeListener
{
private EditText et_digit1, et_digit2, et_digit3, et_digit4;//In this et_digit1 is Most significant digit and et_digit4 is least significant digit
private int whoHasFocus;
char[] code = new char[4];//Store the digits in charArray.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view=inflater.inflate(R.layout.fragment_verify_code, container, false);
initializeView(view);
et_digit1.requestFocus();//Left digit gets focus after adding of fragment in Container
return view;
}
此方法用于初始化 View 。
private void initializeView(View view)
{
et_digit1 = (EditText) view.findViewById(R.id.et_vfcode_digit1);
et_digit2 = (EditText) view.findViewById(R.id.et_vfcode_digit2);
et_digit3 = (EditText) view.findViewById(R.id.et_vfcode_digit3);
et_digit4 = (EditText) view.findViewById(R.id.et_vfcode_digit4);
setListners();
}
该方法是为每个EditText设置监听器。
private void setListners()
{
et_digit1.addTextChangedListener(this);
et_digit2.addTextChangedListener(this);
et_digit3.addTextChangedListener(this);
et_digit4.addTextChangedListener(this);
et_digit1.setOnKeyListener(this);
et_digit2.setOnKeyListener(this);
et_digit3.setOnKeyListener(this);
et_digit4.setOnKeyListener(this);
et_digit1.setOnFocusChangeListener(this);
et_digit2.setOnFocusChangeListener(this);
et_digit3.setOnFocusChangeListener(this);
et_digit4.setOnFocusChangeListener(this);
}
这些是接口(interface) OnFocusChangeListner 的覆盖方法,我通过它检查哪个 EditText 当前具有焦点,从哪里可以在 afterTextChnged 方法(TextWatcher 的覆盖方法)中从相应的 EditText 框获取数字是有用的。
@Override
public void onFocusChange(View v, boolean hasFocus)
{
switch(v.getId())
{
case R.id.et_vfcode_digit1:
whoHasFocus=1;
break;
case R.id.et_vfcode_digit2:
whoHasFocus=2;
break;
case R.id.et_vfcode_digit3:
whoHasFocus=3;
break;
case R.id.et_vfcode_digit4:
whoHasFocus=4;
break;
default:
break;
}
}
这些是 TextWatcher 接口(interface)的覆盖方法。 在此 afterTextChanged(覆盖方法)中 我正在从 EdiTexts 中获取数字,将它们存储在 charArray 的相应索引中。 一旦用户在 EditText 中输入数字,下一个 EditText 将通过 requestfocus 方法(示例:et_digit2.requestFocus())获得焦点。
@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)
{
switch (whoHasFocus)
{
case 1:
if(!et_digit1.getText().toString().isEmpty())
{
code[0]= et_digit1.getText().toString().charAt(0);
et_digit2.requestFocus();
}
break;
case 2:
if(!et_digit2.getText().toString().isEmpty())
{
code[1]= et_digit2.getText().toString().charAt(0);
et_digit3.requestFocus();
}
break;
case 3:
if(!et_digit3.getText().toString().isEmpty())
{
code[2]= et_digit3.getText().toString().charAt(0);
et_digit4.requestFocus();
}
break;
case 4:
if(!et_digit4.getText().toString().isEmpty())
{
code[3]= et_digit4.getText().toString().charAt(0);
}
break;
default:
break;
}
}
此方法将用作 delete(BackSpace) 键。
在此覆盖方法中,我正在检查 EditText 是否为空和 DEL(按下键盘中的退格键)。
如果为真,前一个 EditText 将获得焦点。
@Override
public boolean onKey(View v, int keyCode, KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_DOWN)
{
if (keyCode == KeyEvent.KEYCODE_DEL)
{
switch(v.getId())
{
case R.id.et_vfcode_digit2:
if (et_digit2.getText().toString().isEmpty())
et_digit1.requestFocus();
break;
case R.id.et_vfcode_digit3:
if (et_digit3.getText().toString().isEmpty())
et_digit2.requestFocus();
break;
case R.id.et_vfcode_digit4:
if (et_digit4.getText().toString().isEmpty())
et_digit3.requestFocus();
break;
default:
break;
}
}
}
return false;
}
}
示例图片。
[1]: /image/DAc9y.jpg
关于java - 如何创建一个四位数的密码 Android 布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11078781/