7

テンキーがあり、4 桁の数字を使用して事前設定されたパスコード値と一致するかどうかを判断する 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の初心者です。コーディングに行き詰まったときは、いつもスタックオーバーフローを参照していました。私はスタックオーバーフローから多くのことを学びました。この質問にあえて答えたのはこれが初めてです。私が間違っている場合はご容赦ください。スタックオーバーフローでのコーディングまたはコードの記述方法に関する提案は大歓迎です。ありがとうございました..

私はフラグメントでこのようなことをしました.4つのEditTextを取り、4つのEditTextすべてに対してxmlでmaxLength属性を1に設定します。必要に応じて EditText を変更できます。

注: ストック Android キーボードの 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();
  }

このメソッドは、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);
     }

これらはインターフェイス OnFocusChangeListner のオーバーライド メソッドであり、afterTextChnged メソッド (TextWatcher のオーバーライド メソッド) でそれぞれの EditText ボックスから番号を取得すると便利な場所から現在どの 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;
}
}

このメソッドは、delete(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;
}
}

サンプル画像。

[1]: https://i.stack.imgur.com/DAc9y.jpg

于 2017-06-06T16:35:23.150 に答える
4

これを追加してみましたか:

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

これにより、よりパスワードのような方法になります。

更新:4つのEditTextを実装し、それぞれをmaxLength="1"にします。それらを水平に揃えると、これは機能するはずです:)

于 2012-06-18T07:51:28.657 に答える
0

テンキーがあり、4 桁の数字を使用して事前設定されたパスコード値と一致するかどうかを判断する Android アプリのレイアウトを作成したいと考えています。

電話クライアントの数字キーパッド (SipDroid (ダイヤルパッド リンク)、IMSDroid など) を検索し、必要に応じてレイアウトを再構築します (たとえば、#、* などの不要なキーを削除します)。

@Tim Messerschmidt から提案された属性を使用します

その 4 桁の PIN コードを安全に保管および取得する方法を考えてください。

于 2012-06-18T07:56:15.540 に答える
0

最後に、複数のカスタム ウィジェットを作成しました。

キーパッドウィジェットがあります。を継承しTableLayout、3 つのボタンが 4 行に並んでいます。各ボタンは文字列を変更します - 数字を追加したり削除したりします。

私が追加した別のウィジェットは、PINEntry と呼ばれていました。入力された桁数を指定するために 1 つの int を取り、それに応じてその情報を表示します。

これら 2 つのウィジェットを別のビューで一緒に使用して、パスコード画面を再作成します。

于 2012-07-05T02:02:20.887 に答える