gpt4 book ai didi

android - 多个(动态)EditText 和 onFocusChange 问题

转载 作者:行者123 更新时间:2023-11-29 01:50:05 26 4
gpt4 key购买 nike

我生成多个 EditText在 for 循环中,并希望在焦点从 EditText 之一丢失时更新“分数”秒。我还想检查输入是否有效,如果无效,清空 EditText 并将焦点重新设置到它。

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

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

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

如何将焦点设置回之前的 EditText 并准备好接收新的输入到该 View ?

    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)

最佳答案

您可以尝试跟踪点击了哪个 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;

在每个 EditText 上设置一个 OnTouchlistener:

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

移除 OnClickListeneronFocusChangeListeneretHasFocus

您不需要初始化 etCurrent,因为 if (etCurrent != null) { } else { } 会处理这件事。

关于android - 多个(动态)EditText 和 onFocusChange 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18726316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com