パスワード入力タイプの属性を持つ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
を設定しているので、フォーカスが失われることがわかります。
編集可能なビューにフォーカスが当たったときに実際のキーボードが表示されるのはなぜですか?
もしこのコードが作られたならあなたが寛大であると感じたらgithubで利用可能です。投稿ありがとう! – saranicole
私は本当にしたいですが、それは私の会社のアプリで使用されているので、私はそれのためのソースコードをリリースすることはできません。私のマネージャーとチェックアウトしましょう。 – Karakuri
githubでこれをリリースした場合、または他の誰かがまだこのような進歩を遂げた場合は、ここに示されているコードは本当に有望で、他の人にとっては良い出発点に見えますが、私は本当にトータルパッケージに感謝します。おそらくAndroidは別のフィールドタイプとして実装するでしょう:) –