Tôi đang cố gắng tạo tiện ích mã pin tùy chỉnh cho android thay thế cho chỉ sử dụng một thuộc tính inputType mật khẩu EditText
. Điều tôi muốn hiển thị là một hàng các hộp và mỗi ô được điền khi người dùng nhập ghim của mình.Tiện ích nhập mã pin tùy chỉnh Android
Một người khác đã làm điều gì đó như thế này nhưng hóa ra là số lượng cố định EditText
lượt xem và có rất nhiều mã xấu xí để hoán đổi trọng tâm làm ký tự được nhập hoặc xóa. Đây không phải là cách tiếp cận tôi muốn thực hiện; thay vào đó, tôi thiết kế mỏ của tôi có chiều dài có thể tùy chỉnh (dễ) và hoạt động như một khung nhìn đơn lẻ có thể lấy nét (không dễ dàng như vậy).
Khái niệm của tôi cho đến nay là một số loại lai giữa một LinearLayout
(để giữ "hộp") và một EditText
(để lưu trữ đầu vào của người dùng).
Đây là mã cho đến nay ...
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;
}
}
Về những ghi đè: onCheckIsTextEditor() nên trở thành sự thật và onCreateInputConnection(EditorInfo outAttrs) nên trả về một đối tượng mới InputConnection
để tương tác với một InputMethod (bàn phím), nhưng đó là tất cả những gì biết.
Có ai biết tôi đang đi đúng hướng không? Có ai đã từng làm việc với InputConnection
trước hoặc thực hiện chế độ xem có thể chỉnh sửa của riêng họ có thể đưa ra hướng dẫn không?
(Sửa 1) Sau khi xem xét này một số chi tiết, có vẻ như tôi nên phân lớp BaseInputConnection và cung cấp một TextView
hoặc EditText
như mục tiêu của nó:
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
if (!onCheckIsTextEditor()) {
return null;
}
return new BaseInputConnection(mText, true);
}
Giả sử điều này không lưu trữ các văn bản khi nó được đánh máy, Tôi vẫn cần một số cách để cập nhật các chế độ xem để phản ánh thay đổi nội dung ...
(Chỉnh sửa 2) Vì vậy, tôi đã thêm chế độ xem tùy chỉnh này vào màn hình để thử nghiệm. Nó cho thấy số lượng hộp, và toàn bộ khung nhìn có thể lấy nét, nhưng bàn phím không bao giờ bật lên. Tôi biết nó tăng/mất tập trung bởi vì các hộp hiển thị nổi bật một cách thích hợp và tôi đặt một OnFocusChangedListener
để ghi vào logcat.
Điều gì khiến bàn phím thực xuất hiện khi chế độ xem có thể chỉnh sửa được lấy nét?
Nếu bạn cảm thấy hào phóng, điều đó sẽ rất tuyệt vời nếu mã này được tạo có sẵn trên github. Cảm ơn vì đăng! – saranicole
Tôi thực sự thích, nhưng nó được sử dụng trong ứng dụng của công ty tôi, vì vậy tôi không biết rằng tôi có thể phát hành mã nguồn cho nó. Hãy để tôi kiểm tra nó với người quản lý của tôi. – Karakuri
Bất kỳ cập nhật nào về việc phát hành điều này trên github hoặc nếu ai đó đã thực hiện những tiến bộ như vậy chưa? Các mã hiển thị ở đây trông thực sự hứa hẹn và một điểm khởi đầu tốt cho những người khác, mặc dù tôi thực sự đánh giá cao tổng số gói. Có lẽ Android cuối cùng sẽ thực hiện nó như một loại trường khác :) –