美好的一天。对于长标题我很抱歉,我必须是描述性的。
我有一个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个多小时我一直在研究这个问题而且我被困住了。很感谢任何形式的帮助。谢谢。
答案 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并且完全实例化),从那里,我可以正确地调用我的函数。
我知道这不是最好的方法,但到目前为止,它确实有效。