У нас есть 17 api, DPAD control и 4 edittexts в одной раскладке для ввода пин-кода. Когда пользователь пытается открыть что-то, что заблокировано в приложении, он сталкивается с фрагментом, где он должен ввести 4-значный пин-код. Когда представление открыто, мы программно устанавливаем просмотр фокуса на первый текстовый штырь edittext и показываем клавиатуру. Когда пользователь вводит первую цифру контакта, мы устанавливаем просмотр фокуса программно на текст редактирования вторых контактов, где пользователь должен ввести значение второго контакта и так далее.
Проблема:
После того, как пользователь введет значение первого пина фокус клавиатуры (выделен), исчезнет, а для второго пина пользователь должен снова перемещаться по клавиатуре с самого начала. На 21 API тот же код работает хорошо, и фокус клавиатуры (выделено) остался на прежнем значении. Как оставить фокус клавиатуры (выделено) , когда он был раньше на 17 api при настройке посмотреть фокус на другом виде?
Вот код:
public class PasswordFragment extends BaseFragment {
private final ArrayList<Disposable> disposables = new ArrayList<>();
@BindViews({R.id.passFirst, R.id.passSecond, R.id.passThird, R.id.passFour})
EditText[] pinEdits;
@BindDrawable(R.drawable.border_light)
Drawable borderLight;
@BindDrawable(R.drawable.border_white)
Drawable borderWhite;
@Inject
PrefsRepo prefsRepo;
@Inject
ToastUtil toastUtil;
@BindView(R.id.passTitle)
TextView passTitle;
@BindString(R.string.insert_pin)
String defDialogMes;
private InputMethodManager inputMethodManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
App.getAppComponent().inject(this);
inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = super.onCreateView(inflater, container, savedInstanceState);
for (EditText pinEdit : pinEdits) {
pinEdit.setOnFocusChangeListener((view, hasFocus) -> {
if (hasFocus) {
view.setBackground(borderLight);
}
});
}
disposables.add(RxTextView.textChanges(pinEdits[0]).subscribe(charSequence -> {
if (charSequence.length() == 1) {
pinEdits[1].requestFocus();
}
}));
disposables.add(RxTextView.textChanges(pinEdits[1]).subscribe(charSequence -> {
if (charSequence.length() == 1) {
pinEdits[2].requestFocus();
}
}));
disposables.add(RxTextView.textChanges(pinEdits[2]).subscribe(charSequence -> {
if (charSequence.length() == 1) {
pinEdits[3].requestFocus();
}
}));
disposables.add(RxTextView.textChanges(pinEdits[3])
.subscribe(charSequence -> {
if (charSequence.length() == 1) {
String pin = pinEdits[0].getText().toString() + pinEdits[1].getText().toString() + pinEdits[2].getText().toString() + pinEdits[3].getText().toString();
if (pin.length() == 4) {
do someting;
} else {
toastUtil.showToast(getString(R.string.pin_incorrect));
}
}
}));
return v;
}
@Override
public void onResume() {
clearEditTexts();
super.onResume();
}
private void clearEditTexts() {
for (EditText pinEdit : pinEdits) {
pinEdit.getText().clear();
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN_MR1){
pinEdit.setOnClickListener(view -> {
showKeyBoard(pinEdit);
});
}
}
setFocusOnFirst();
}
private void setFocusOnFirst() {
pinEdits[0].setBackground(borderLight);
pinEdits[0].requestFocus();
pinEdits[0].postDelayed(() -> {
showKeyBoard(pinEdits[0]);
}, 50);
}
@Override
public void onDestroy() {
super.onDestroy();
for (Disposable disposable : disposables) {
disposable.dispose();
}
}
@Override
protected int getLayoutId() {
return R.layout.fragment_password;
}
private void showKeyBoard(EditText editText){
inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}