gpt4 book ai didi

即使明确要求,Android 键盘也不会出现

转载 作者:行者123 更新时间:2023-11-29 14:51:25 32 4
gpt4 key购买 nike

我有一个包含两个 Activity 的应用程序,有时,我需要切换 Activity,同时在刚刚恢复的 Activity 的操作栏中打开搜索输入。一切正常,只是我无法启动键盘。我的代码的相关部分如下(注意:如果需要搜索输入,则 bool 值 startsearch 设置为 true 作为切换 Activity 的结果):

public class MyActivity extends Activity {

private InputMethodManager imm;
public boolean startsearch;
private MenuItem DestinationTxt;
private SearchView mySearchView;

@Override
protected void onCreate(Bundle savedInstanceState) {
// various initialisation, and then:
startsearch = false;
imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.action_menu, menu);
DestinationTxt = menu.findItem(R.id.actionbar_search);
mySearchView = (SearchView)DestinationTxt.getActionView();
// more menu create stuff appears here
}

@Override
public void onResume() {
super.onResume();
if (startsearch) {
DestinationTxt.expandActionView();
imm.showSoftInput(mySearchView, 0);
}
}
}

action_menu.xml 的相关部分是

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:id="@+id/actionbar_search"
android:orderInCategory="1"
android:showAsAction="always|withText|collapseActionView"
android:actionViewClass="android.widget.SearchView"
android:icon="@drawable/earth_2508858_search_en"
android:inputType="textPostalAddress"
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"></item>
</menu>

正如我所说,这主要是有效的,因为当 Activity 恢复时,操作栏搜索确实获得了焦点。但是键盘没有出现,即使(正如您从代码中看到的那样),我已经明确要求它。谁能告诉我哪里做错了,我需要做什么才能让键盘出现?

最佳答案

我现在已经能够解决这个问题了。通过查看 InputMethodManager.showSoftInput(View, int) 的代码,我发现我提出键盘的请求被忽略了,因为我传递的 View 不是 InputMethodManager 的 Activity View 。

为了解决我的问题,我在MyActivity 类中添加了两个新字段,即:

private EditText search_edit_text;
private boolean mySearchView_editflag;

search_edit_text 变量将是 SearchView mySearchView 中的 View ,它是实际获得焦点并从键盘接收输入的 View 。 mySearchView_editflag 通常为 false,但当应用等待正确的时间调出键盘时它将为 true

为了获取 search_edit_text EditText 对象,我使用了以下函数

public static EditText GetEditText(ViewGroup vg) {
for(int i=0; i< vg.getChildCount(); i++) {
View v = vg.getChildAt(i);
if (v instanceof EditText) {
return (EditText)v;
} else if (v instanceof ViewGroup) {
EditText et = GetEditText((ViewGroup)v);
if (et != null) return et;
}
}
return null;
}

并修改了我的 onCreateOptionsMenu(Menu) 函数以包含以下内容

DestinationTxt = menu.findItem(R.id.actionbar_search);
mySearchView = (SearchView)DestinationTxt.getActionView();
search_edit_text = GetEditText(mySearchView);
mySearchView_editflag = false;

这会初始化 search_edit_textmySearchView_editflag 变量。我的 onResume() 方法更改为

@Override
public void onResume() {
super.onResume();
if (startsearch) {
DestinationTxt.expandActionView();
mySearchView_editflag = true;
}
}

并且我包含了以高频率调用以下方法的代码:

public void CheckStatus() {
if (mySearchView_editflag && imm.isActive(search_edit_text)) {
imm.showSoftInput(search_edit_text, 0);
mySearchView_editflag=false;
}
}

这个应用程序现在可以按我想要的方式运行,因为当需要在操作栏中输入搜索时,在 Activity 切换之后,应用程序现在会等待,直到 imm.isActive(search_edit_text) 为真(这意味着EditText 对象正在接收输入),然后调用 imm.showSoftInput(search_edit_text, 0) 以确保键盘可见。

为了帮助我解决所有这些问题,我使用了 InputMethodManager.showSoftInput(View, int, ResultReceiver) 而不是 InputMethodManager.showSoftInput(View, int),所以改为的

imm.showSoftInput(search_edit_text, 0);

我有

ImmResultsReceiver irr = new ImmResultsReceiver();
imm.showSoftInput(search_edit_text, 0, irr);

ImmResultsReceiver 是类

public class ImmResultsReceiver extends ResultReceiver {        
public ImmResultsReceiver() { super(null); }
@Override
protected void onReceiveResult (int resultCode, Bundle resultData) {
String descrip;
switch(resultCode) {
case InputMethodManager.RESULT_UNCHANGED_SHOWN: descrip = "RESULT_UNCHANGED_SHOWN"; break;
case InputMethodManager.RESULT_UNCHANGED_HIDDEN: descrip = "RESULT_UNCHANGED_HIDDEN"; break;
case InputMethodManager.RESULT_SHOWN: descrip = "RESULT_SHOWN"; break;
case InputMethodManager.RESULT_HIDDEN: descrip = "RESULT_HIDDEN"; break;
default:descrip="InputMethodManager("+resultCode+")"; break;
}
Log.d("MyLog", "ImmResultsReceiver,"+descrip+","+(resultData == null?"":"resultData.size()="+resultData.size()));
}
}

如果 ImmResultsReceiver.onReceiveResult(...) 方法从未被调用,则意味着对 InputMethodManager.showSoftInput(...) 的调用已被忽略,因为传递给 InputMethodManager.showSoftInput(...) 的 View 不是 InputMethodManager 的 Activity View 。

关于即使明确要求,Android 键盘也不会出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16873517/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com