将焦点设置在EditText上

erd*_*inz 161 android focus android-edittext

我有一个EditText-Field并为它设置一个OnFocusChangeListener.当它失去焦点时,会调用一个方法,该方法使用数据库中的一个方法检查EditText的值.如果方法的返回值为true,则显示toast,焦点应再次返回EditText.焦点应始终返回EditText并且键盘应该显示,直到方法的返回值为false.

编辑:我想,我还没有完全清楚我的真正问题:屏幕上没有其他项目应该能够编辑,直到EditText的值被编辑为一个值,这使得方法"checkLiganame(liganame) "回归虚假.只有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();
                }
            }
Run Code Online (Sandbox Code Playgroud)

和方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

此代码导致以下结果:在EditText失去焦点后,焦点跳回EditText,但我无法再编辑文本.

EDIT2:更改了我的代码.场景:

我点击第一个EditText并在其中放入一个String,它已经存在于数据库中.吐司正在展示.现在我不能再编辑我的字符串了.我点击键盘上的"下一步",焦点停留在第一个EditText上.我尝试编辑我的字符串,但没有任何反应.而是我的新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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ral*_*abb 252

把这一行放在你的 onCreate()

editText.requestFocus();
Run Code Online (Sandbox Code Playgroud)

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

  • 它没有打开我的机箱上的键盘。 (9认同)
  • 这个简单的解决方案适合我 (6认同)
  • 感谢您为我提供的帮助. (2认同)

Dar*_*ind 155

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

要获得焦点并显示键盘,您可以编写如下内容:

if(myEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Run Code Online (Sandbox Code Playgroud)

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

在checkLiganame方法中,检查游标是否为null.游标将始终返回一个对象,因此检查null不会执行任何操作.然而问题就在于此db.close();

当您关闭数据库连接时,Cursor它将变为无效,并且很可能已为空.

在获取值后关闭数据库.

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

EDIT2:所以这里有一些如何使它工作的代码.编辑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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

if(liganame.length() == 0)用您自己的支票替换第一张支票,然后它应该有效.请注意,所有EditText视图都应该onFocusChangeListener像我在示例中所做的那样将它们设置为相同的侦听器.


Gro*_*oco 56

Darwind代码没有显示键盘.

这对我有用:

        _searchText.requestFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);
Run Code Online (Sandbox Code Playgroud)

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

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);
Run Code Online (Sandbox Code Playgroud)


小智 19

单击按钮时,这会更改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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


Gur*_*raj 13

这对我有用:

public void showKeyboard(final EditText ettext){
    ettext.requestFocus();
    ettext.postDelayed(new Runnable(){
            @Override public void run(){
                InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(ettext,0);
            }
        }
        ,200);
}
Run Code Online (Sandbox Code Playgroud)

隐藏:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么需要等待 200 毫秒?有必要还是我可以立即展示? (2认同)

小智 10

这对我有用,设置焦点并显示键盘

EditText userNameText = (EditText) findViewById(R.id.textViewUserNameText);
userNameText.setFocusable(true);
userNameText.setFocusableInTouchMode(true);
userNameText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(userNameText, InputMethodManager.SHOW_IMPLICIT);
Run Code Online (Sandbox Code Playgroud)


Sud*_*kar 8

如果我们动态创建EditText,那么我们必须设置requestFocus(),如下所示.

    EditText editText = new EditText(this);
    editText.setWidth(600);
    editText.requestFocus();
Run Code Online (Sandbox Code Playgroud)

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

EditText e1=(EditText) findViewById(R.id.editText1);
e1.requestFocus();
Run Code Online (Sandbox Code Playgroud)

它仅将焦点设置为相应的EditText组件.


Bar*_*zai 6

    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
Run Code Online (Sandbox Code Playgroud)


Müc*_*nol 5

requestFocus()如果您尝试在布局膨胀之前调用,它将返回 false。此代码在布局膨胀后运行。您不需要如上所述的 200 毫秒延迟

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})
Run Code Online (Sandbox Code Playgroud)