android – 设置焦点在EditText

我有一个EditText字段,并为它设置一个OnFocusChangeListener。当它失去焦点时,调用一个方法,该方法检查数据库中EditText的值。如果方法的返回值为true,则显示一个toast,焦点应该再次返回EditText。焦点应该总是回到EditText,键盘应该显示,直到方法的返回值为false。

编辑:我想,我还没有使我的真正的问题完全清楚:屏幕上没有其他项目应该能够编辑,直到EditText的值被编辑为一个值,这使得方法“checkLiganame(liganame) “return false。只有EditText字段应该是可编辑的。

这里是我的代码(这不适合我):

final EditText Liganame = (EditText) findViewById(R.id.liganame);

    Liganame.setOnFocusChangeListener(new OnFocusChangeListener() {

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

                String liganame = Liganame.getText().toString();


                if (checkLiganame(liganame)) {
                    Toast toast = Toast.makeText(CreateTableActivity.this,
                            "Dieser Liganame ist bereits vergeben",
                            Toast.LENGTH_SHORT);
                    toast.show();
                    Liganame.requestFocus();
                }
            }

和方法:

public boolean checkLiganame(String liganame) {
    boolean found = false;

    DatabaseHelper databaseHelper = new DatabaseHelper(this);
    SQLiteDatabase db = databaseHelper.getReadableDatabase();

    Cursor cursor = db.query("liga", new String[] { "liganame" },
            "liganame = '" + liganame + "'", null, null, null, null);
    Log.i("Liganame: ", String.valueOf(cursor));

    db.close();
    if (cursor != null) {
        found = true;
    }

    return found;
}

此代码导致以下结果:EditText失去焦点后,焦点跳回到EditText,但我不能再编辑文本。

EDIT2:更改了我的代码。情况:

我点击第一个EditText并把一个字符串,它已经在数据库中。祝贺并感谢您的交易。现在我不能编辑我的字符串了。我点击键盘上的“下一步”,焦点停留在第一个EditText。我试图编辑我的字符串,但什么也没有发生。相反,我的新字符串显示在第二个EditText。我点击我的设备的后退箭头,并重新点击第一和第二个EditText – >没有键盘显示。

这里是我的新代码:

public class CreateTableActivity extends Activity implements
    OnFocusChangeListener {

private EditText Liganame, Mannschaftsanzahl;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.create_league);

    Liganame = (EditText) findViewById(R.id.liganame);
    Liganame.setOnFocusChangeListener(this);
    Mannschaftsanzahl = (EditText) findViewById(R.id.mannschaftsanzahl);
    Mannschaftsanzahl.setOnFocusChangeListener(this);

    final Button save_button = (Button) findViewById(R.id.create_tabelle_speichern_button);

    OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
            ButtonClick();
        }
    };
    save_button.setOnClickListener(mCorkyListener);



}

@Override
public void onFocusChange(View v, boolean hasFocus) {
    String liganame = Liganame.getText().toString();

    if (checkLiganame(liganame)) {
        if (Liganame.requestFocus()) {
            getWindow()
                    .setSoftInputMode(
                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            Mannschaftsanzahl.clearFocus();
            Toast.makeText(CreateTableActivity.this,
                    "Dieser Liganame ist bereits vergeben",
                    Toast.LENGTH_SHORT).show();
        }
    }
}
最佳答案
请求焦点不足以显示键盘。

要获得焦点和显示键盘,你会这样写:

if(myEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

编辑:添加checkLiganame方法后,在答案中添加额外的信息。

在checkLiganame方法中,检查游标是否为空。游标总是返回一个对象,所以检查null不做任何事情。然而问题是在行db.close();

当关闭数据库连接时,游标变为无效,并且很可能为null。

因此,在获取值后关闭数据库。

而不是检查游标为null,应该检查返回的行数是否大于0:if(cursor.getCount()> 0),然后将布尔值设置为true如果是这样。

编辑2:所以这里是一些代码如何使它的工作。
EDIT3:对不起,我添加了错误代码…; S

首先,如果另一个EditText获得焦点,您需要清除焦点。这可以通过myEditText.clearFocus()来完成。然后在你的onFocusChangeListener你不应该真的关心,如果第一个EditText有焦点或没有,所以onFocusChangeListener可能看起来像这样:

public class MainActivity extends Activity implements OnFocusChangeListener {
    private EditText editText1, editText2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText1 = (EditText) findViewById(R.id.editText1);
        editText1.setOnFocusChangeListener(this);
        editText2 = (EditText) findViewById(R.id.editText2);
        editText2.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        String liganame = editText1.getText().toString();

        if(liganame.length() == 0) {
            if(editText1.requestFocus()) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                editText2.clearFocus();
                Toast.makeText(MainActivity.this, "Dieser Liganame ist bereits vergeben", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

替换第一个检查if(liganame.length()== 0)与你自己的检查,那么它应该工作。
注意,所有的EditText视图应该设置他们的onFocusChangeListener到同一个监听器,就像我在示例中做的。

转载注明原文:android – 设置焦点在EditText - 代码日志