Как заставить фокус редактировать текст

Я читал вокруг вопросов о том, как установить объект для фокусировки, но я не могу найти ответа на то, что я пытаюсь сделать.

Используя прослушиватель 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();  
                    }


                }
            }
        }});

Ответ 1

Попробуйте arg0.requestFocus().

Не уверен, что View реализует requestFocus() с верхней части головы, поэтому вам, возможно, придется наложить его... ((EditText) arg0).requestFocus().

Ответ 2

new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 

Ответ 3

У меня была эта же проблема, вот код, который я использовал для решения:

EditText editText = (EditText) findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

С наилучшими пожеланиями,