Я читал вокруг вопросов о том, как установить объект для фокусировки, но я не могу найти ответа на то, что я пытаюсь сделать.
Используя прослушиватель On Focus, я сделал следующее:
  Ehour.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View arg0, boolean arg1) {
            // TODO Auto-generated method stub
            if (!arg1) {
                if (Ehour.getText().length()<=0) {
                    Toast.makeText(getApplicationContext(), "No Hour Entered", Toast.LENGTH_LONG).show();
                    Calendar nohour = Calendar.getInstance();
                    Ehour.setText(numberformatter(nohour.get(Calendar.HOUR_OF_DAY)));
Ehour.setFocusable(true);
Ehour.requestFocus();
                }
            }
        }});
Я пробовал предложения из следующих сообщений:
Я прочитал этот пост, но использование этих предложений также не работает: Как настроить фокус на просмотр при создании и отображении макета?
Моя цель состоит в том, что, когда фокус редактирования текста теряется, мне нужно вернуться к нему, если указанная запись недействительна.
Кроме того, согласно предложению Билла Мота, я также попытался:
 Ehour.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View arg0, boolean arg1) {
            // TODO Auto-generated method stub
            if (!arg1) {
                if (Ehour.getText().length()<=0) {
                    Toast.makeText(getApplicationContext(), "No Hour Entered", Toast.LENGTH_LONG).show();
                    Calendar nohour = Calendar.getInstance();
                    Ehour.setText(numberformatter(nohour.get(Calendar.HOUR_OF_DAY)));
                    ((EditText)arg0).requestFocus();
                }
            }
        }});
** РЕДАКТИРОВАТЬ ** Я даже добавил нижнюю строку перед requestFocus():
((EditText)arg0).setFocusable(true);
*** ИЗМЕНИТЬ ****
Пробовал из этого сообщения: Остановить EditText от получения фокуса при запуске Activity
Следующие изменения: В макете в первом заголовке макета я добавил:
android:id="@+id/enterdata"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
Тогда в OnChangeFocusListener я сделал это:
Ehour.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View arg0, boolean arg1) {
            // TODO Auto-generated method stub
            if (!arg1) {
                if (((EditText)arg0).getText().length()<=0) {
                    Toast.makeText(getApplicationContext(), "No Hour Entered", Toast.LENGTH_LONG).show();
                    Calendar nohour = Calendar.getInstance();
                    ((EditText)arg0).setText(numberformatter(nohour.get(Calendar.HOUR_OF_DAY)));
                    findViewById(R.id.enterdata).requestFocus();
                    ((EditText)arg0).setFocusable(true);
                    ((EditText)arg0).setFocusableInTouchMode(true);
                    ((EditText)arg0).requestFocus();
                }
            }
        }});
Тем не менее, я по-прежнему получаю то же поведение, что и раньше, текст редактирования, который сосредоточен на этом, остается таким, но текст редактирования, который я хочу, чтобы фокус был направлен на внешний вид, но он не может использоваться, как будто он по-прежнему ожидая фокусировки.
*** ИЗМЕНИТЬ ****
Код ниже в соответствии с недавним сообщением, найденным в stackoverflow, где пользователь, задающий вопрос, испытывает ту же проблему, что и я:
 Ehour.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View arg0, boolean arg1) {
            // TODO Auto-generated method stub
            if (!arg1) {
                if (((EditText)arg0).getText().length()<=0) {
                    Calendar nohour = Calendar.getInstance();
                    ((EditText)arg0).setText(numberformatter(nohour.get(Calendar.HOUR_OF_DAY)));
                    if (((EditText)arg0).requestFocus()) {
                         getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                         Emin.clearFocus();   
                         Toast.makeText(getApplicationContext(), "No Hour Entered", Toast.LENGTH_LONG).show();  
                    }
                }
            }
        }});
