4

我有一个可以读取 13 位条形码的 EditText。我想要做的是保持屏幕上显示的虚拟键盘和 EditText 始终具有焦点。以下代码让我在按下回车键时编写条形码并搜索产品,效果很好。但是,如果我输入的条形码少于 13 位,或者输入的条形码在我的数据库中不存在,我想向用户展示一个 Toast,并通知他。显示 Toast 后,我​​希望 EditText 再次自动获得焦点,让用户再次键入条形码。在展示了 Toast 之后,我尝试了 requestFocus() 方法,但它不起作用。始终显示软键盘,但在 Toast 之后,除非我触摸 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>

提前致谢。

编辑:搞砸了,我发现了问题。这是解决方案:

return true;

现在它工作...

4

2 回答 2

3

将此代码放在该 Toast 消息旁边:

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

于 2012-08-06T12:27:27.110 回答
2

在调用该方法之前,我只能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;
    }       
});
于 2013-06-10T19:41:54.550 回答