Как сделать автофокус edittext после показа тоста?


У меня есть EditText, который читает 13-значный штрих-код. Что я хочу сделать, так это сохранить виртуальную клавиатуру, отображаемую на экране, и EditText, чтобы всегда иметь фокус. Следующий код позволяет мне написать штрих-код и искать продукт, когда нажата клавиша enter, и это хорошо работает. Но если я ввожу штрих-код с менее чем 13 цифрами или набранный штрих-код не существует в моей базе данных, я хочу показать пользователю тост, сообщив ему об этом. После показа тоста я хочу, чтобы редактируемый текст получил фокус снова автоматически, позволяя пользователю просто ввести штрих-код снова. После показа тоста я попробовал метод requestFocus (), но он не сработал. Мягкая клавиатура всегда отображается, но после тоста я не могу снова ввести EditText, если я не коснусь EditText. Как я могу это сделать?

    final EditText procura_codbar = (EditText)
                findViewById(R.id.procurar_produto_codbar);
    procura_codbar.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if ((event.getAction() == KeyEvent.ACTION_DOWN)
                    && (keyCode == KeyEvent.KEYCODE_ENTER)) {

                String codbar = procura_codbar.getText().toString();
                if (codbar.length()<13){   
                    Toast.makeText(MainActivity.this,
                           "type a 13 digit barcode",
                           Toast.LENGTH_LONG).show();
                }
                else{
                    if (bdh!=null){
                        bdh.closedb(); bdh.close();
                    }
                    bdh = new DBHelper(MainActivity.this);
                    Log.i("CODBAR", codbar);
                    produto prod_ = bdh.getProduto(codbar);
                    if (prod_!=null){
                        showDialogPreco(prod_);
                        procura_codbar.setText("");
                    }else{
                        Toast.makeText(MainActivity.this,
                                                     "Product not found",
                                                     Toast.LENGTH_SHORT).show();
                        procura_codbar.setSelection(codbar.length());
                    }
                }
                procura_codbar.requestFocus();
                procura_codbar.setSelection(codbar.length());
            }

            return false;
        }
    });

А вот XML:

<EditText
    android:id="@+id/procurar_produto_codbar"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:inputType="textNoSuggestions|number"
    android:textSize="22sp"
    android:maxLength="13"
    android:layout_toRightOf="@+id/tv_procura_codbar" >

    <requestFocus />
</EditText>

Заранее благодарю.

EDIT: возясь с этим, я нашел проблему. Вот решение:

return true;

Теперь это работает...

2 4

2 ответа:

Поместите этот код рядом с этим тостовым сообщением:

Toast.makeText(MainActivity.this,
                       "type a 13 digit barcode",
                       Toast.LENGTH_LONG).show();

procura_codbar.setFocusableInTouchMode(true);
procura_codbar.setFocusable(true);
procura_codbar.requestFocus();
procura_codbar.setSelection(codbar.length());
Это сработало для меня. Также необходимо удалить * procura_codbar.requestFocus (); * в нижней части кода.

Я смог только вернуть фокус к EditText, задержавшись на мгновение перед вызовом метода requestFocus():

final Handler handler = new Handler();
final EditText myEditText = (EditText) findViewById(R.id.editText1);

myEditText.setOnKeyListener(new OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {

        // See if user presses enter
        if (event.getAction() == KeyEvent.ACTION_DOWN &&
            keyCode == KeyEvent.KEYCODE_ENTER) {

            Toast.makeText(MainActivity.this, "You pressed enter!",
                        Toast.LENGTH_SHORT).show(); 

            // Put focus back in the EditText after brief delay                  
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {                 
                    myEditText.requestFocus();

                    // Select all text
                    myEditText.setSelection(0, myEditText.getText().length());                  
                }                   
            }, 200);

            return true;                    
        }

        return false;
    }       
});