我正在尝试为 android 创建一个自定义 pin 代码小部件,作为仅使用EditText
带有密码 inputType 属性的替代方法。我想显示的是一排框,并在用户键入他的 pin 时填充每个框。
其他人做了类似的事情,但结果是固定数量的EditText
视图,并且有很多丑陋的代码用于在输入或删除字符时交换焦点。这不是我想要采取的方法;相反,我将我的设计设计为具有可定制的长度(容易)并表现为单个可聚焦的视图(不太容易)。
LinearLayout
到目前为止,我的概念是 a (保存“盒子”)和 an 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)应该返回一个新InputConnection
对象以与 InputMethod (键盘)进行交互,但这就是我所知道的。
有谁知道我是否走在正确的轨道上?有没有人InputConnection
以前做过工作或使他们自己的可编辑视图能够提供指导?
(编辑 1)在看了这个之后,似乎我应该继承 BaseInputConnection 并提供一个TextView
orEditText
作为它的目标:
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
if (!onCheckIsTextEditor()) {
return null;
}
return new BaseInputConnection(mText, true);
}
假设这确实存储了键入的文本,我仍然需要一些方法来更新视图以反映内容更改......
(编辑 2)所以我将此自定义视图添加到屏幕进行测试。它显示框的数量,并且整个视图是可聚焦的,但键盘永远不会弹出。我知道它获得/失去焦点,因为这些框适当地显示突出显示,并且我设置了一个OnFocusChangedListener
写入 logcat。
当可编辑视图获得焦点时,是什么让实际的键盘出现?