在EditText上设置焦点

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

编辑:我想,我还没有完全清楚我的真正问题:没有其他项目上的屏幕应该能够编辑,直到EditText的值被编辑为一个值,这使得方法“checkLiganame(liganame) “返回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,但我无法再编辑文本。

编辑2:改变了我的代码。 场景:

我点击第一个EditText,并把一个string,它已经在数据库中。 吐司正在显示。 现在我不能编辑我的string了。 我点击键盘上的“下一步”,焦点停留在第一个EditText上。 我尝试编辑我的string,但没有任何反应。 相反,我的新string显示在第二个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(); } } } 

只要把这一行放在你的onCreate()

 editText.requestFocus(); 

它适用于我,希望它有帮助

请求焦点不足以显示键盘。

为了得到焦点和显示键盘,你会写这样的东西:

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

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

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

当您closures数据库连接时, Cursor变得无效,最可能是空的。

因此,在获取值之后closures数据库。

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

编辑2:所以这里是一些如何使其工作的代码。 编辑3:对不起,我添加了错误的代码…; 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(); } } } } 

用你自己的检查replace第一个检查if(liganame.length() == 0) ,然后它应该工作。 请注意,所有的EditText视图应该已经将onFocusChangeListener设置为相同的侦听器,就像我在示例中所做的那样。

Darwind代码没有显示键盘。

这适用于我:

  _searchText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT); 

如果键盘没有显示,请尝试强制:

  imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED); 

当button被点击时,这改变了EditText的焦点:

 public class MainActivity extends Activity { private EditText e1,e2; private Button b1,b2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); e1=(EditText) findViewById(R.id.editText1); e2=(EditText) findViewById(R.id.editText2); e1.requestFocus(); b1=(Button) findViewById(R.id.one); b2=(Button) findViewById(R.id.two); b1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { e1.requestFocus(); } }); b2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { e2.requestFocus(); } }); } } 
  mEditText.setFocusableInTouchMode(true); mEditText.requestFocus(); if(mEditText.requestFocus()) { getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } 

如果我们dynamic创build一个EditText,那么我们必须设置requestFocus(),如下所示。

  EditText editText = new EditText(this); editText.setWidth(600); editText.requestFocus(); 

如果我们已经在xml视图中声明了组件,那么我们必须find它,我们可以在下面给出焦点。

 EditText e1=(EditText) findViewById(R.id.editText1); e1.requestFocus(); 

它只将焦点设置到相应的EditText组件。

  private void requestFocus(View view) { if (view.requestFocus()) { getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } } //Function Call requestFocus(yourEditetxt); 

我不知道你是否发现了一个解决scheme,但是在你再次请求关注之后为你的编辑问题:

您是否尝试过在edittext1上调用方法selectAll()setSelection(0) (如果是emtpy)?

请让我知道如果这有帮助,所以我会编辑我的答案一个完整的解决scheme。

  Button btnClear = (Button) findViewById(R.id.btnClear); EditText editText1=(EditText) findViewById(R.id.editText2); EditText editText2=(EditText) findViewById(R.id.editText3); btnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { editText1.setText(""); editText2.setText(""); editText1.requestFocus(); } }); 

对于Xamarin.Android我创build了这个扩展。

 public static class ViewExtensions { public static void FocusEditText(this EditText editText, Activity activity) { if (editText.RequestFocus()) { InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService); imm.ShowSoftInput(editText, ShowFlags.Implicit); } } } 
 new OnEditorActionListener(){ @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { editText.requestFocus(); //used ******* return true ****** return **true**; } } 

你可以用一行来做到这一点:

 yourEditText.RequestFocusFromTouch();