7

我想为具有数字键盘并采用四位数字来确定它是否与预设密码值匹配的 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 iOS 密码屏幕

4

4 回答 4

6

我是Android的初学者。当我坚持编码时,我总是用来引用stackoverflow。我从 stackoverflow 学到了很多东西。这是我第一次敢于回答这个问题。如果我错了,请原谅我,并且非常感谢有关编码或在 stackoverflow 中编写代码的方式的任何建议。谢谢你..

我在 Fragments 中做过类似的事情。在 xml 中为所有 4 个 EditText 取 4 个 EditText 并将 maxLength 属性设置为 1。您可以根据需要修改 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;
                            }

此方法用于 intilize 视图。

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 接口的覆盖方法。在此 afterTextChanged(override method) 中,我从 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(按下键盘中的退格键)。如果为真,则先前的 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]:https ://i.stack.imgur.com/DAc9y.jpg

于 2017-06-06T16:35:23.150 回答
4

您是否尝试添加以下内容:

android:maxLength="4"
android:password="true"

这导致更像密码的方式。

更新:我会实现四个 EditText 并使它们每个 maxLength="1"。如果您将它们水平对齐,这应该可以工作:)

于 2012-06-18T07:51:28.657 回答
0

我想为具有数字键盘并采用四位数字来确定它是否与预设密码值匹配的 Android 应用程序创建一个布局。

搜索电话客户端数字键盘(例如 SipDroid(拨号盘链接)、IMSDroid),根据您的需要重建布局(例如删除#、* 和其他您不需要的键)。

使用来自@Tim Messerschmidt 的建议属性

想出一种安全的方式来存储和检索该 4 位密码。

于 2012-06-18T07:56:15.540 回答
0

最后,我创建了多个自定义小部件。

有一个键盘小部件。它继承自TableLayout并具有四行三个按钮。每个按钮修改一个字符串 - 添加数字或删除它们。

我添加的另一个小部件称为 PINEntry。它需要一个 int 来指定输入了多少位并相应地显示该信息。

我在另一个视图中同时使用这两个小部件来重新创建密码屏幕。

于 2012-07-05T02:02:20.887 回答