Android-从类调用DialogFragment方法以关闭DialogFragment的软键盘
你好。对不起,标题太长了,我必须描述一下 我有一个Android应用程序,其中有一个自定义的ListView,上面有一个EditText和一个DialogFragment。用户仍然可以看到EditText,因为DialogFragment没有覆盖整个屏幕,并且用户仍然可以在ListView中选择EditText。自定义ListView中的EditText有一个。我的对话框片段包含使用默认Android软键盘的编辑文本 我遇到的主要问题是,当用户在我的对话框片段中单击EditText时,android软键盘显示并在自定义列表视图中单击EditText,我的自定义键盘显示在android软键盘后面,android软键盘不会折叠/隐藏 我所做的一项工作是: 我将对话框片段的根视图设置为EditText的父视图,如下所示:Android-从类调用DialogFragment方法以关闭DialogFragment的软键盘,android,android-fragments,keyboard,Android,Android Fragments,Keyboard,你好。对不起,标题太长了,我必须描述一下 我有一个Android应用程序,其中有一个自定义的ListView,上面有一个EditText和一个DialogFragment。用户仍然可以看到EditText,因为DialogFragment没有覆盖整个屏幕,并且用户仍然可以在ListView中选择EditText。自定义ListView中的EditText有一个。我的对话框片段包含使用默认Android软键盘的编辑文本 我遇到的主要问题是,当用户在我的对话框片段中单击EditText时,andro
android:clickable="true"
android:focusableInTouchMode="true"
这样焦点就不会被EditText锁定或独占。我还在DialogFragment类中创建了一个隐藏软键盘的函数。我有两个,它们都工作:
public void hideKB(){
InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(instructionInput.getWindowToken(), 0);
//instructionInput is my EditText
}
public void hideKeyboard(View view) {
InputMethodManager imm =(InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
我这样称呼他们中的任何一个:
instructionInput.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
hideKB();
//hideKeyboard(v);
}
}
});
而且效果很好。当用户单击对话框片段时,软键盘关闭
现在,我想调用这个函数,或者在用户单击自定义ListView中的EditText时实现相同的效果。my EditText中的自定义键盘类具有以下功能:
public void registerEditText(int resid, final SearchResult context, final ItemDialog itemDialog) {
EditText edittext= (EditText)mHostActivity.findViewById(resid);
edittext.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override public void onFocusChange(View v, boolean hasFocus) {
if( hasFocus ) {
Log.d("hello","edittext focused");
itemDialog.hideKB();
showCustomKeyboard(v);
}
else {
hideCustomKeyboard();
}
}
});
//removed extra lines of code
}
请注意,SearchResult不是DialogFragment的基本活动,ItemDialog是我的对话框片段
我所做的是,当用户关注ListView中的EditText时,onFocusChange函数触发,我尝试调用对话框片段的hideKB函数。但是,我被抛出一个nullPointerException:
FATAL EXCEPTION: main
Process: com.agict.marswin, PID: 14038
java.lang.NullPointerException
at UtilityClasses.CustomKeyboard$2.onFocusChange(CustomKeyboard.java:187)
自定义键盘上的第187行是从对话框片段调用函数的代码:
itemDialog.hideKB();
我不明白为什么我在那一行得到一个空指针,因为我在初始化itemDialog之后调用了registerEditText。我认为我的问题归结为从类中调用DialogFragment的函数
有人能帮我吗?在过去的6个多小时里,我一直在做这个,我被卡住了。非常感谢您的帮助。谢谢 好的,对不起,我已经开始工作了。问题是itemDialog为空。我所做的是: 在我的SearchResult活动中,我创建了一个公共项对话框,如下所示:
public ItemDialog itemDialog;
然后我正常地实例化它,创建并显示它。现在我有了一个正确实例化的DialogFragment,它可以被任何类访问,因为它是公共的
转到registerEditText函数,下面是我所做的:
public void registerEditText(int resid, final SearchResult searchResult, final ItemDialog itemDialog) {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if( hasFocus ) {
Log.d("hello","edittext focused");
searchResult.itemDialog.hideKB();
showCustomKeyboard(v);
}
else {
hideCustomKeyboard();
}
}
//extra code here
}
由于我在SearchResult活动中将活动传递给registerEditText函数,因此:
mCustomKeyboard.registerEditText(R.id.qtyInputSearchResult, SearchResult.this, itemDialog);
mCustomKeyboard.registerEditText(R.id.discInputSearchResult, SearchResult.this, itemDialog);
实际上,最后一个参数不再需要了
我可以使用第二个参数SearchResult来访问itemDialog变量,该变量不是空的,并且是完全实例化的,从那里,我可以正确地调用我的函数
我知道这不是最好的解决方法,但到目前为止,它是有效的