我有片段A和片段B,在片段A上我有一个输入搜索框,当我打开片段时,它显示了预期的软键盘。切换片段时有时会发生NullPointerException。我无法重现错误,但日志文件表明onResume()
函数发生错误。下面是我在onResume()上使用的代码,我得到java.lang.NullPointerException
的原因是什么?
@Override
public void onResume() {
super.onResume();
getActivity().setTitle(R.string.app_name);
if (getActivity().getWindow().getCurrentFocus() == searchbox) {
searchbox.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.showSoftInput(searchbox, InputMethodManager.SHOW_IMPLICIT);
}
}
}, 300);
}
}
编辑: 这是logcat:
java.lang.NullPointerException:
at com.myapp.fragments.MyMain$7.run (MyMain.java:258)
at android.os.Handler.handleCallback (Handler.java:815)
at android.os.Handler.dispatchMessage (Handler.java:104)
at android.os.Looper.loop (Looper.java:207)
at android.app.ActivityThread.main (ActivityThread.java:5811)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:907)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:768)
答案 0 :(得分:2)
在run方法中你有:
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
如果片段在getActivity()
毫秒后未附加到活动,则 null
可能为300
。
答案 1 :(得分:1)
空指针异常意味着您正在尝试使用尚未初始化的变量。所以在你的onResume方法中,检查所有变量。确保他们在活动破坏中幸存下来。因为许多变量不会在onResume中恢复。 您需要找出哪个变量给出了空指针异常,然后在onResume方法中初始化该变量。
您可以在onResume方法的每个代码行上使用try catch方法来确定哪个代码行有错误。在catch方法中,您可以将错误打印到控制台,如下所示
try{
//1st code line
}catch{ System.out.println("1st line gives the error")
}
答案 2 :(得分:1)
是的我同意磁铁。这应该可以解决你的问题。
try{
//code line 1
}catch(Exception e){
Log.i(TAG, "method: "+e.getMessage());
}
在每一行上尝试这一点 另一种方法是调试项目并在onResume方法中添加断点。这可能会更有帮助。