我有一个EditText-Field,并为它设置了一个OnFocusChangeListener。当它失去焦点时,将调用一个方法,该方法用数据库中的值检查EditText的值。如果该方法的返回值为true,则会显示一个toast,并且焦点应该再次回到EditText上。焦点应该始终回到EditText上,并且键盘应该显示,直到该方法的返回值为false。
编辑:我想,我还没有完全清楚我的真正问题:屏幕上的其他项目都不应该能够编辑,直到EditText的值被编辑为一个值,这使得"checkLiganame(liganame)“方法返回false。只有EditText-Field应该是可编辑的。
下面是我的代码(不适用于我):
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();
}
}
}
发布于 2013-11-26 00:09:42
只需将这一行放到您的onCreate()
上
editText.requestFocus();
发布于 2013-01-15 06:26:02
请求焦点不足以显示键盘。
要获得焦点并显示键盘,您可以编写如下代码:
if(myEditText.requestFocus()) {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
编辑:在添加checkLiganame方法后向答案中添加额外信息。
在checkLiganame方法中,检查游标是否为null。游标总是返回一个对象,所以检查null不会做任何事情。然而,问题出在db.close();
这一行
当您关闭数据库连接时,Cursor
将变得无效,并且很可能为空。
因此,在获取了值之后,请关闭数据库。
您应该检查返回的行数是否大于0,而不是检查游标是否为null : if(cursor.getCount() > 0),如果是,则将布尔值设置为true。
EDIT2:这里有一些关于如何使其工作的代码。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();
}
}
}
}
将第一个check if(liganame.length() == 0)
替换为您自己的check,然后它应该可以工作。请注意,所有EditText视图都应该将它们的onFocusChangeListener
设置为相同的侦听器,就像我在示例中所做的那样。
发布于 2015-01-03 08:10:32
Darwind代码没有显示键盘。
这对我来说很有效:
_searchText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);
如果键盘未显示,请尝试强制执行以下操作:
imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);
https://stackoverflow.com/questions/14327412
复制相似问题