java - 如何创建一个四位数的密码 Android 布局

标签 java android layout

我想为一个 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 应用程序启动屏幕的图像:

Dropbox iOS passcode screen

最佳答案

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/

相关文章:

java - 使用 File.listfiles() 获取 NullPointer 异常

Java 加载自定义字体文件 (.ttf)

android - 错误 : undefined reference to 'ilInit' Android DeviL

java - 安卓 Java : Automatically send a notification based on a date condition already specified in the application

java - 为什么使用 Jersey 在 JSON 中用 @ 返回名称

php - 如何将 BLOB 与 JSON 和 PHP 一起使用?

java - 无法从 jar 中给出的扩展 Activity 启动 Activity

android - Android 中没有图形布局编辑器

javascript - javascript 在 Rails 布局中的放置

css - 样式表中的响应式媒体查询不起作用