Android-从类调用DialogFragment方法以关闭DialogFragment的软键盘

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应用程序,其中有一个自定义的ListView,上面有一个EditText和一个DialogFragment。用户仍然可以看到EditText,因为DialogFragment没有覆盖整个屏幕,并且用户仍然可以在ListView中选择EditText。自定义ListView中的EditText有一个。我的对话框片段包含使用默认Android软键盘的编辑文本

我遇到的主要问题是,当用户在我的对话框片段中单击EditText时,android软键盘显示并在自定义列表视图中单击EditText,我的自定义键盘显示在android软键盘后面,android软键盘不会折叠/隐藏

我所做的一项工作是:

我将对话框片段的根视图设置为EditText的父视图,如下所示:

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变量,该变量不是空的,并且是完全实例化的,从那里,我可以正确地调用我的函数

我知道这不是最好的解决方法,但到目前为止,它是有效的