2012-05-10 6 views
5

パスワード入力タイプの属性を持つEditTextを使用する代わりに、Android用のカスタムピンコードウィジェットを作成しようとしています。私が表示したいのは、1列のボックスで、ユーザーがピンを入力するごとに各ボックスを塗りつぶします。他カスタムAndroidコードコードウィジェット

誰かがこのような何かをしましたが、それはEditTextビューの固定数であることが判明し、文字が入力または削除されたとして焦点を入れ替えるための醜いコードの多くがありました。これは私が取るべきアプローチではありません。むしろ、私はのカスタマイズ可能な長さ(簡単)を持つように設計しており、単一のフォーカス可能なビュー(それほど簡単ではありません)として動作します。

ここまでの概念は、LinearLayout(ボックスを保持する)とEditText(ユーザーの入力を格納する)の間の何らかのハイブリッドです。

これは、これまでのコードである...それらのオーバーライドについて

public class PinCodeView extends LinearLayout { 
    protected static final int MAX_PIN_LENGTH = 10; 
    protected static final int MIN_PIN_LENGTH = 1; 

    protected int pinLength; 
    protected EditText mText; 

    public PinCodeView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PinCodeView); 
     try { 
      pinLength = a.getInt(R.styleable.PinCodeView_pinLength, 0); 
     } finally { 
      a.recycle(); 
     } 

     pinLength = Math.min(pinLength, MAX_PIN_LENGTH); 
     pinLength = Math.max(pinLength, MIN_PIN_LENGTH); 

     setupViews(); 

     Log.d(TAG, "PinCodeView initialized with pinLength = " + pinLength); 
    } 

    private void setupViews() { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
       Context.LAYOUT_INFLATER_SERVICE); 
     for (int i = 0; i < pinLength; i++) { 
      // inflate an ImageView and add it 
      View child = inflater.inflate(R.layout.pin_box, null, false); 
      addView(child); 
     } 
    } 

    public CharSequence getText() { 
     // TODO return pin code text instead 
     return null; 
    } 

    public int length() { 
     // TODO return length of typed pin instead 
     return pinLength; 
    } 

    @Override 
    public boolean onCheckIsTextEditor() { 
     return true; 
    } 

    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
     // TODO return an InputConnection 
     return null; 
    } 
} 

onCheckIsTextEditor()はtrueを返すとonCreateInputConnection(EditorInfo outAttrs)はInputMethod(キーボード)と対話するための新しいInputConnectionオブジェクトを返す必要がありますが、それはすべて私です知っている。

私は正しい道にいるかどうか誰にも分かりますか?前にInputConnectionで作業した人はいますか、または自分の編集可能なビューでガイダンスを行うことができましたか?

(編集1) もう少しこれを見た後、私がBaseInputConnectionをサブクラス化し、そのターゲットとしてTextViewまたはEditTextを提供する必要がありそうです:

@Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
     if (!onCheckIsTextEditor()) { 
      return null; 
     } 
     return new BaseInputConnection(mText, true); 
    } 

、それが入力されると、これはテキストを格納んと仮定すると、コンテンツの変更を反映するためにビューを更新する方法がまだ必要です。

(編集2) このカスタムビューをテスト用の画面に追加しました。それはボックスの数を示し、全体のビューはフォーカス可能ですが、キーボードは決してポップアップしません。ボックスが適切にハイライト表示され、logcatに書き込むようにOnFocusChangedListenerを設定しているので、フォーカスが失われることがわかります。

編集可能なビューにフォーカスが当たったときに実際のキーボードが表示されるのはなぜですか?

答えて

0

私はこれについてかなりの進歩を遂げ、InputConnectionのヘルプは必要なくなりました。つまり、BaseInputConnectionを拡張し、getEditable()を上書きして編集可能に戻します。この場合、PinCodeViewで内部で使用されているプラ​​イベートTextViewを返します。 PinCodeViewonKey[foo]()のようないくつかのメソッドをオーバーライドし、内部コールTextViewに転送します。残りの部分は、TextWatcherを使用して、テキストが変更されるたびに子の1つをImageViewに更新しています。

本当にうまく機能します。それを磨くために残っているマイナーな問題がいくつか残っていますが、私はそれらを個別の質問として扱い、ここでこれを閉じます。

+5

もしこのコードが作られたならあなたが寛大であると感じたらgithubで利用可能です。投稿ありがとう! – saranicole

+0

私は本当にしたいですが、それは私の会社のアプリで使用されているので、私はそれのためのソースコードをリリースすることはできません。私のマネージャーとチェックアウトしましょう。 – Karakuri

+0

githubでこれをリリースした場合、または他の誰かがまだこのような進歩を遂げた場合は、ここに示されているコードは本当に有望で、他の人にとっては良い出発点に見えますが、私は本当にトータルパッケージに感謝します。おそらくAndroidは別のフィールドタイプとして実装するでしょう:) –

1

私によく見えます。あなたがしたいかもしれない何かは、ユーザーが1つの文字を1つのEditTextボックスに入力し、次のEditTextボックスへの参照を見つけて、requestFocus()を実行するときです。これにより、テキスト入力が次のボックスに移動します。非常に簡単です。

+0

してみてください。個々のボックスではなく、ウィジェット全体がフォーカス可能でなければなりません。 – Karakuri

+0

個々のボックスは、入力するために焦点を合わせる必要があります。さらに、フォーカスされているEditTextには青い線が表示され、入力が可能であることをユーザーに示します。その視覚的な手がかりがなければ、ユーザーは入力された文字がどこに行くのか分からないでしょう。 –

+0

これは明らかではないかもしれませんが、私はEditTextの行を使用していないので、個々のボックスに個別にフォーカスする必要はありません。私が言及したように、私はそれのためのコードを見たことがあり、それは厄介で醜いとblechです。 このアプローチは、ボックスのImageViewsを膨らませており、ウィジェットがフォーカスされているときに焦点状態を示すように、それらは背景としてセレクタdrawableを持ち、duplicateParentState = "true"を持ちます。このキーは、個々のボックスではなく、ENTIREウィジェットがフォーカスを取得するということです。 – Karakuri

4

iOSのようなピン入力ビュー/ウィジェットを作成しようとしているようです。

ここには役に立つサンプルコードがあります。しかし、それは修正された長さですが、依然として一部の人にとっては有用かもしれません。

http://madeveloper.blogspot.com/2013/02/android-ios-like-pin-entrychallenge.html

+0

私はあなたの意見を高く評価し、他の人には役立つかもしれませんが、私自身は既に解決策を見つけました。 Mineはボックスの行全体をカプセル化し、Androidキーボードとやりとりし、ロジック全体を管理するカスタムの 'View'です。ボタンやテキストビューのレイアウト全体では、全体のアクティビティは必要ありません。 – Karakuri

+2

@Karakuriソースコードや詳細な説明を入力していないので、ピンコード入力に関するこの回答は私にとってより適切です。 –

2

https://github.com/chinloong/Android-PinView

私は、これはすでに回答されている知っているが、その実装が共有されていないので、私は同様のオープンソースのライブラリを見つけました。それはよさそうだと放浪を与えることができますすべての人々のためには、これは私は避けるようにしようとしているものの一種である

https://github.com/Philio/PinEntryView