質問

I have a EditText that reads a 13 digit barcode. What I want to do is to keep the virtual keyboard shown on the screen and the EditText to always have focus. The following code let me write the barcode and search for a product when enter key is pressed, and it works well. But if I type a barcode with less then 13 digits or the barcode typed does not exist in my database, I want to show the user a Toast, informing him of it. After displaying the Toast, I want the EditText to gain focus again automatically, letting the user just type the barcode again. After showing the Toast, I tried the requestFocus() method, but it didn't work. The soft keyboard is always shown, but after the Toast, I can't type in the EditText again unless I touch on the EditText. How can I do this?

    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;
        }
    });

And here is the 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>

Thanks in advance.

EDIT: Messing with this, I found the problem. Heres the solution:

return true;

Now it works...

役に立ちましたか?

解決

Put this code right next to that Toast Message:

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());

This worked for me. Also you need to remove the *procura_codbar.requestFocus();* at the bottom of the code.

他のヒント

I've only been able to get the focus back to the EditText by delaying momentarily before calling the requestFocus() method:

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;
    }       
});
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top