将重点放在EditText上


174

我有一个EditText-Field并为其设置了OnFocusChangeListener。当失去焦点时,将调用一个方法,该方法将在数据库中检查EditText的值。如果该方法的返回值是true,则显示一个敬酒,焦点应再次回到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();
                }
            }

和方法:

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并将一个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();
        }
    }
}

如果以下答案有帮助,请接受其中一个答案
Akshatha Srinivas

Answers:


274

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

editText.requestFocus();

它对我有用,希望对您有所帮助


163

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

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

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

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

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

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

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

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

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();
            }
        }
    }
}

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


到目前为止谢谢你。但这并不能解决我的整个问题。我编辑了问题描述。
erdalprinz

那么checkLiganame到底在做什么?为什么不能只检查if(liganame.isEmpty()),如果为true,请再次requestFocus?
达尔文,2013年

1
谢谢:-)现在我的方法可以正常工作了:-)但是我的EditText-Field的主要问题还没有解决。方法找到一行后,我仍然无法编辑...
erdalprinz 2013年

因此,您添加了if(myEditText.requestFocus()){getWindow()。setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 在onFocusChanged侦听器内部?
达尔文,2013年

是的,我做到了。在Liganame.requestFocus();下。我单击键盘上的“下一个”,以跳入下一个EditText-Field。正在显示吐司,并且焦点都在两个EditText-Fields上。但是我只能编辑第二个。第一个,在这种情况下应该是唯一具有焦点的,不再可编辑。
erdalprinz 2013年

59

Darwind代码未显示键盘。

这对我有用:

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

如果键盘未显示,请尝试强制执行以下操作:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);

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();
            }
        });
    }
}

16

这对我有效:

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);
}

隐藏:

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

1
为什么需要等待200毫秒?有必要还是我可以立即显示?
Coder123

11

这就是对我有用的方法,可以设置焦点并显示键盘

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);

1
谢谢。setFocusable需要API26。setFocusableInTouchMode在我的情况下也不需要。
CoolMind

8

如果我们动态创建EditText,则必须如下设置requestFocus()。

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

如果我们已经在xml视图中声明了该组件,那么我们必须找到它,并且可以按照下面的说明进行操作。

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

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


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

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

4
    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();
        }
    });

3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);


2

对于Xamarin.Android,我已经创建了此扩展。

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);
        }
    }
}

2

请在清单上尝试此代码

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>

2

如果您尝试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)
   }
})

1

我不知道您是否确实找到了解决方法,但是在再次请求焦点后遇到了编辑问题:

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

请告诉我是否有帮助,所以我将编辑我的答案以得到完整的解决方案。


1
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 

0

如果使用requestFocus()onCreate()介绍键盘的问题没有出现在自来水,使用BindingAdapter使用SingleLiveEvent,并要求内部的焦点。

方法如下:

绑定适配器

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}

0

我的答案在这里

当我阅读正式文档时,我认为这是最好的答案,只需将View传递给诸如EditText之类的参数,但showSoftKeyboard似乎无法在横向模式下使用

private fun showSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}

private fun closeSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.