我有一个里面有很多片段的Activity。当在特定片段上我膨胀菜单时,当点击膨胀的MenuItem时,我应该调用Fragment类的方法,该方法更改片段内Constraint Layout的布局参数。问题是我在Constraint Layout上得到了一个NPE试图改变。
这些是我试图打电话的方法:
public void searcherOpen() {
searchLayout.setLayoutParams(new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.WRAP_CONTENT));
searchText.setFocusable(true);
}
public void searcherClose() {
searchLayout.setLayoutParams(new ConstraintLayout.LayoutParams(0, 0));
searchText.setFocusable(false);
}
这些是调用方法的MenuItem:
getMenuInflater().inflate(R.menu.patient_fragment_menu, menu);
final MenuItem search = menu.findItem(R.id.menu_search);
final MenuItem close_search = menu.findItem(R.id.menu_search_close);
search.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
patientFragment.searcherOpen();
search.setVisible(false);
close_search.setVisible(true);
return true;
}
});
close_search.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
patientFragment.searcherClose();
search.setVisible(true);
close_search.setVisible(false);
return true;
}
});
这就是我在onCreate中定义活动内部片段的方法:
patientFragment = (PatientFragment)getFragmentManager().findFragmentByTag("patientFragment");
这就是错误:
06-06 14:52:23.314 3682-3682/com.medishare.zeeromed E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.medishare.zeeromed, PID: 3682
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.medishare.zeeromed.fragments.PatientFragment.searcherOpen()' on a null object reference
at com.medishare.zeeromed.DrawerActivity$3.onMenuItemClick(DrawerActivity.java:255)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:959)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:623)
at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:154)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22393)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:173)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:938)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828)
答案 0 :(得分:0)
如果您要调用PatientFragment
,则基于stackTrace,您提供的null
似乎为searcherOpen()
。
所以你需要先实例化它,然后调用该方法。
这个电话:
patientFragment = (PatientFragment)getFragmentManager().findFragmentByTag("patientFragment");
错误,您应该通过newInstance()
调用创建它并使用FragmentManager
将其添加到活动中,请阅读this arcticle了解相关问题
答案 1 :(得分:0)
尝试使用getSuportFragmentManager()而不是getFragmentManager()
答案 2 :(得分:0)
首先,很明显,这行代码没有找到任何片段:
patientFragment = (PatientFragment)getFragmentManager().findFragmentByTag("patientFragment");
其次,当您尝试使用findFragmentByTag
查找片段时,应始终验证片段是否存在,即不为空
if(patientFragment != null) { patientFragment.myMethod(); }
第三,您还应该验证您的片段是否已添加到活动中,或者您可能最终会使用其他类型的NPE
if(patientFragment != null && patientFragment.isAdded()){ patientFragment.myMethod(); }
最后,也许你得到这个错误的原因在于你创建片段的地方,或者在这种情况下,你是如何创建它的。我假设您在Activity
内部创建了FragmentActivity
,因此您应该使用getSupportFragmentManager()
来创建它。换句话说,要检索片段,您还应该像@CODER指出的那样调用getSupportFragmentManager
:
patientFragment = (PatientFragment)getSupportFragmentManager().findFragmentByTag("patientFragment");
if(patientFragment != null && patientFragment.isAdded()){
patientFragment.myMethod();
}