2

我在 for 循环中生成多个EditText,并希望在其中一个EditTexts 失去焦点时更新“分数”。我还希望检查输入是否有效,如果不是,则清空 EditText 并将焦点重新设置回它。

以下代码添加EditTexts和一个onFocusChangeListener.

问题是,当分数无效(updateScore(id)返回 false)时,我想清空EditText并将焦点设置回此视图。

我的代码中的问题是,如果我在EditText A中输入无效的值,然后单击EditText BA B都有焦点...我只希望A有焦点...

如何将焦点设置回以前的 EditText 并准备好对此视图的新输入?

    for (int player = 0; player < numPlayers; player++)
    {
        EditText valueET = new EditText(this);

         valueET.setOnClickListener(new OnClickListener() {          
         @Override public void onClick(View v) {
               Log.v("Focus", "Lagrer unna den som har blitt klikket, " + String.valueOf(v.getId()));
               etHasFocus = (EditText) v;
           }
         });

        valueET.setOnFocusChangeListener(new OnFocusChangeListener() {          
           public void onFocusChange(View v, boolean hasFocus) {
           if(!hasFocus)
           {
               if(!updateScore(v.getId()))
               {
                 if (etHasFocus != null && v.getId() != etHasFocus.getId()) 
                     etHasFocus.clearFocus();               

                   v.requestFocus();
             }
           });

         valueET.setId(200+player*100+row);
         valueET.setInputType(InputType.TYPE_CLASS_NUMBER);
         valueET.setTextColor(Color.BLACK);
         valueET.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

         tr.addView(valueET);
    }
tl.addView(tr, new TableLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

updateScore(id) 的代码是(简化的):

boolean updateScore(int id)
{
    EditText t = (EditText) findViewById(id);
    String text = t.getText().toString();
    if( !text.equals(""))
    {
        int score = Integer.parseInt(text);
    }
    if(score != 9)
         return false;

        TextView total = (TextView) findViewById(ID_toal);
        t2.setText(String.valueOf(score));
        return true;
}

代码已更新,现在的问题是永远不会调用 onClick ......(所以 etHasFocus = null)

4

1 回答 1

1

您可以尝试跟踪哪些EditText已被点击。为此,创建一个 EditText 变量:

EditText etHasFocus;

除了添加OnFocusChangeListener,还添加一个OnClickListener

valueET.setOnClickListener(new OnClickListener() {          

    @Override
    public void onClick(View v) {
        etHasFocus = (EditText) v;
    }
});

现在,在您的内部OnFocusChangeListener进行以下更改:

valueET.setOnFocusChangeListener(new OnFocusChangeListener() {          

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(!hasFocus) {

            if(!updateScore(v.getId())) {

                // Clear focus from another EditText
                if (etHasFocus != null && v.getId() != etHasFocus.getId()) {
                    etHasFocus.clearFocus();                       
                }

                v.requestFocus();
            }
        }
    }
});

编辑:

你说的对。该onClick(View)方法在第二次点击时被调用。我可以建议你另一种方法。我已经尝试过了,它工作正常:

创建一个 EditText 变量:

EditText etCurrent;

OnTouchlistener在每个 EditText 上设置一个:

valueET.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN) {

            if (etCurrent != null) {
                if (etCurrent.getId() != v.getId()) {

                    if (!check(etCurrent.getId())) {
                        etCurrent.setSelection(0,
                                 etCurrent.getText().toString().length());
                        return true;
                    } else {
                        etCurrent = (EditText) v;
                    }
                }
            } else {
                etCurrent = (EditText) v;
            }
        }

        return false;
    }
});

删除和。OnClickListener_onFocusChangeListeneretHasFocus

你不需要初始化etCurrent,因为if (etCurrent != null) { } else { }它会照顾到这一点。

于 2013-09-10T18:49:28.763 回答