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

时间:2014-12-04 02:15:58

标签: android android-fragments keyboard

美好的一天。对于长标题我很抱歉,我必须是描述性的。

我有一个Android应用程序,我有一个带有EditText和DialogFragment的Custom ListView。用户仍然可以看到EditText,因为DialogFragment没有覆盖整个屏幕,用户仍然可以在ListView中选择EditText。我的自定义ListView中的EditText有一个custom Keyboard from this tutorial。我的对话框片段包含使用默认Android软键盘的编辑文本。

我遇到的主要问题是,当用户点击我的Dialog Fragment中的EditText(android软键盘显示)并点击Custom ListView中的EditText时,我的自定义键盘出现在Android软键盘后面并且Android软键盘不会折叠/隐藏。

我做的一件事就是:

我可以选择Dialog Fragment的根视图(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);
        }
    }
});

它工作正常。当用户单击Dialog Fragment时,软键盘将关闭。

现在,我想调用此函数或在用户单击Custom ListView中的EditText时实现相同的效果。我的EditText中的Custom Keyboard类具有以下功能:

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是我的Dialog Fragment。

我所做的是当用户关注ListView中的EditText时,onFocusChange函数触发,我尝试调用Dialog Fragment的hideKB()函数。但是,我抛出了一个nullPointerException:

FATAL EXCEPTION: main
Process: com.agict.marswin, PID: 14038
java.lang.NullPointerException
     at UtilityClasses.CustomKeyboard$2.onFocusChange(CustomKeyboard.java:187)

和我CustomKeyboard处的第187行是从Dialog Fragment调用该函数的代码:

itemDialog.hideKB();

我不知道为什么我在该行获得空指针,因为我在初始化registerEditText后调用了itemDialog。我认为我的问题归结为从类中调用DialogFragment的函数。

任何人都可以帮助我吗?过去6个多小时我一直在研究这个问题而且我被困住了。很感谢任何形式的帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

好对不起,我让它上班了。问题是itemDialog为空。我做的是这个:

在我的SearchResult活动中,我创建了一个公共的ItemDialog:

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 Activity中将活动传递给registerEditText函数:

mCustomKeyboard.registerEditText(R.id.qtyInputSearchResult, SearchResult.this, itemDialog); 
mCustomKeyboard.registerEditText(R.id.discInputSearchResult, SearchResult.this, itemDialog); 

(实际上不再需要最后一个参数)

我可以使用第二个参数SearchResult来访问itemDialog变量(它不是null并且完全实例化),从那里,我可以正确地调用我的函数。

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