我想为具有数字小键盘的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保管箱应用程序启动屏幕的图像:
答案 0 :(得分:4)
您是否尝试添加此内容:
android:maxLength="4"
android:password="true"
这样会产生更多密码。
更新:我实现了四个EditText,并使每个maxLength =“1”。 如果你将它们水平对齐,这应该有效:)
答案 1 :(得分:4)
我是Android的初学者。 当我坚持编码时,我总是用来引用stackoverflow。我从stackoverflow中学到了很多东西。 这是我第一次敢于回答这个问题。 请原谅我,如果我错了,任何关于编码或在stackoverflow中编写代码的方式的建议都非常受欢迎。 谢谢..
我在片段中做过类似的事情.. 取4 EditText并将maxLength属性设置为xml中的所有4个EditTexts。您可以根据需要修改EditText。
注意:可以或不可以在Stock Android KeyBoard中为DEL(BackSpace)调用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;
}
此方法用于查看视图。
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();
}
此方法是为每个EditTexts设置侦听器。
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);
}
这些是接口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;
}
}
此方法将用作删除(BackSpace)键 在这个覆盖方法中,我正在检查EditText是否为空并且DEL(按下键盘中的退格键)。 如果为true,则前一个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;
}
}
示例图片。
答案 2 :(得分:0)
我想为具有数字小键盘的Android应用创建布局 并取四位数来确定它是否与预设的密码匹配 值。
搜索电话客户端数字小键盘(例如SipDroid(dialpad link),IMSDroid),根据需要重新构建布局(例如,删除#,*和其他不需要的键)。
使用@Tim Messerschmidt建议的属性
考虑一种安全的方式来存储和检索该4位数的密码。
答案 3 :(得分:0)
最后我创建了多个自定义小部件。
有一个键盘小部件。它继承自TableLayout
并有四行三个按钮。每个按钮都会修改一个字符串 - 添加数字或删除它们。
我添加的另一个小部件叫做PINEntry。它需要一个int来指定输入的位数,并相应地显示该信息。
我在另一个视图中一起使用这两个小部件来重新创建密码屏幕。