设置EditText的焦点
设置EditText的焦点
我有一个EditText字段,并为其设置了一个OnFocusChangeListener。当它失去焦点时,会调用一个方法来检查EditText中的值与数据库中的值是否相同。如果方法的返回值为true,则显示一个toast,并且焦点应该再次回到EditText上。只有当方法的返回值为false时,焦点才应该回到EditText上,并且键盘应该显示出来。\n编辑:我认为我还没有完全清楚地表达我的真正问题:在EditText的值被编辑为使方法“checkLiganame(liganame)”返回false的值之前,屏幕上的其他项目都不能被编辑。只有EditText字段可编辑。\n以下是我的代码(对我来说无效):\n
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, “此联赛名称已被使用”, Toast.LENGTH_SHORT); toast.show(); Liganame.requestFocus(); } } }
\n和方法:\n
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; }
\n这段代码导致以下结果:EditText失去焦点后,焦点跳回EditText,但我无法再编辑文本。\n编辑2:更改了我的代码。场景:\n我点击第一个EditText并在其中输入一个已经存在于数据库中的字符串。toast显示。现在我无法再编辑我的字符串。我点击键盘上的“下一个”按钮,焦点仍停留在第一个EditText上。我尝试编辑我的字符串,但没有任何反应。而是在第二个EditText中显示我的新字符串。我点击设备的返回箭头,然后重新点击第一个和第二个EditText --> 键盘不再显示。\n以下是我的新代码:\n
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(); } } }
问题:Set Focus on EditText的原因及解决方法
原因:Darwind代码无法显示键盘。
解决方法:
以下代码对我有效:
_searchText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);
如果键盘没有显示,尝试强制显示:
imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);
以上是解决Set Focus on EditText问题的方法。
问题:Set Focus on EditText
原因:请求焦点不足以显示键盘。需要在获取焦点的同时显示键盘,可以使用以下代码实现:
if(myEditText.requestFocus()) { getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); }
解决方法:在checkLiganame方法中,检查光标是否为空。光标总是会返回一个对象,所以对空值的检查没有任何作用。然而,问题出在
db.close();
这行代码上。当关闭数据库连接时,光标会变得无效,很可能为空。因此,在获取值后关闭数据库。不要检查光标是否为空,而是检查返回的行数是否大于0,如
if(cursor.getCount() > 0)
,如果是,则设置boolean变量为true。
代码示例:
public class MainActivity extends Activity implements OnFocusChangeListener { private EditText editText1, editText2; 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); } 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(); } } } }
注意:所有的EditText视图都应该将它们的onFocusChangeListener设置为相同的监听器,就像示例中所做的那样。
问题:为什么无法通过调用editText.requestFocus()
来设置焦点到EditText上并打开虚拟键盘?如何解决这个问题?
解决方法:在调用editText.requestFocus()
之后,添加以下代码可以解决问题:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
以上代码中,editText
是指要设置焦点的EditText。
以下是原因和解决方法的英文翻译:
原因:直接调用editText.requestFocus()
方法无法打开虚拟键盘。
解决方法:在调用editText.requestFocus()
之后,添加以下代码可以打开虚拟键盘:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
以上代码中,editText
是指要设置焦点的EditText。