android设置输入焦点,Android TextField:以编程方式设置焦点+软输入

本文介绍了如何在Android应用中以编程方式为EditText设置焦点,并在需要时显示软键盘。通过使用`setFocusableInTouchMode(true)`、`requestFocus()`以及`InputMethodManager`的组合,可以实现这一目标。在某些场景下,可能需要在`onResume()`中调用`requestFocus()`,或者在某些设备上延迟显示软键盘的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我看来,我有一个搜索EditText,我想以编程方式触发字段上单击事件的行为,即将焦点放在文本字段上并在必要时显示软键盘(如果没有可用的硬键盘)。

我试过field.requestFocus()。 该字段实际上获得焦点但不显示软键盘。

我试过field.performClick()。 但那只调用该字段的OnClickListener。

任何的想法 ?

好先生,试试这个:

edittext.setFocusableInTouchMode(true);

edittext.requestFocus();

我不确定,但某些手机(某些旧设备)可能需要这样做:

final InputMethodManager inputMethodManager = (InputMethodManager) context

.getSystemService(Context.INPUT_METHOD_SERVICE);

inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);

与requestFocus()相同的结果......字段获得焦点但不触发软键盘。

我终于解决了在活动的onResume()方法中调用field.requestFocus()而不是onCreate()的问题。不知道它为什么有效......

视图在实际布局在屏幕上之前无法获得焦点。当onCreate()保存UI线程时,无法完成此操作,因此视图在onCreate()之后和onResume()之前直接布局。 :)

我很高兴看到这个答案非常感谢!!!!!

@fiddler它在onResume中工作,因为在onCreate之后调用onResume,所以field在onCreate运行之前不存在。请看这里:developer.android.com/reference/android/app/…

thnx man ..将焦点放在onResume方法的编辑文本上,适合我。

优秀的建议,小伙子。我确实声明了;这是值得的一个upvote!

这是适合我的代码。

edittext.post(new Runnable() {

public void run() {

edittext.requestFocusFromTouch();

InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);

lManager.showSoftInput(edittext, 0);

}

});

而已!请享用 ;)

谢谢,这个对我有用。当用户点击按钮时,我以编程方式添加EditText。

我从对话模式中添加了一个EditText。某些标记由Android设置,导致此控件无法接收任何触摸。如果在runnable中添加字段,则不会设置标志。

看起来像EditText的InputType被Android设置为null。如果设置InputType,它应该可以工作。

对我来说唯一可行的解??决方案(如果我使用InputMethodManager来强制显示键盘,那么我无法隐藏它)

其他方法都没有对我有用,但是这个方法没有。我希望有一个框供用户点击以打开编辑对话框视图,而不是有一个编辑行来单击EditText视图。在手机上,编辑线失去了大部分功能,因为编辑对话视图覆盖整个屏幕,因此用户无法看到编辑线,包括输入时输入的字母。

在其他两个答案对我不起作用后,以下代码对我有用:

@Override

public void onResume() {

super.onResume();

SingletonBus.INSTANCE.getBus().register(this);

//passwordInput.requestFocus();

passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

}

其中ShowKeyboard是

private class ShowKeyboard implements Runnable {

@Override

public void run() {

passwordInput.setFocusableInTouchMode(true);

//      passwordInput.requestFocusFromTouch();

passwordInput.requestFocus();

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);

}

}

输入成功后,我也确保隐藏键盘

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))

.hideSoftInputFromWindow(getView().getWindowToken(), 0);

从技术上讲,我只是在运行软键盘显示请求之前添加了300毫秒的延迟。很奇怪,对吗?还将requestFocus()更改为requestFocusFromTouch()。

编辑:不要使用requestFocusFromTouch()它给发射器发出触摸事件。坚持requestFocus()。

EDIT2:在对话框(DialogFragment)中,使用以下内容

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

代替

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

requestFocusFromTouch()似乎触发了启动器上的触摸事件。这很奇怪。

在我的情况下,我想显示虚拟键盘而没有引用特定的文本框,所以我使用了接受的答案的第一部分来集中注意力:

edittext.setFocusableInTouchMode(true);

edittext.requestFocus();

然后我展示了虚拟键盘:

InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);

inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

field.post(new Runnable() {

@Override

public void run() {

field.requestFocus();

field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));

}

});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值