2014-12-04 168 views
0

美好的一天。对不起,长名称,我必须是描述性的。Android - 从类中调用DialogFragment方法关闭DialogFragment的软键盘

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

我遇到的主要问题是当用户单击我的对话框片段(android软键盘显示)中的EditText并单击自定义ListView中的EditText时,我的自定义键盘显示在Android软件后面键盘和Android软键盘不会折叠/隐藏。

一个解决我确实是这样的:

我提出的对话片段的根视图(的EditText的父视图)是可选择的为这样:

android:clickable="true" 
android:focusableInTouchMode="true" 

使得聚焦ISN 't“锁定”或被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。在我的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函数会触发,并尝试调用我的Dialog Fragment的hideKB()函数。不过,我抛出一个NullPointerException:

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

和187线在我CustomKeyboard是调用从对话片段的功能代码:

itemDialog.hideKB(); 

而且我不明白为什么我收到因为我在初始化我的itemDialog之后调用了registerEditText,因此该行为空指针。我认为我的问题归结为从一个类调用DialogFragment的函数。

任何人都可以帮助我吗?过去6个多小时我一直在为此工作,并且我被卡住了。很感谢任何形式的帮助。谢谢。

回答

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 
} 

因为我传递活动的registerEditText功能,例如在我的信息搜索结果的活动:

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

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

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

我知道这不是最好的方式去做,但到目前为止,它的工作原理。