setLayoutParams从活动片段内的布局

setLayoutParams从活动片段内的布局

问题描述:

我有一个活动,其中有很多片段。当在一个特定的片段上,我膨胀了一个菜单,当点击膨胀的MenuItem时,我应该调用Fragment类的一个方法,它改变片段内的约束布局的布局参数。问题是我正在尝试更改约束布局上的NPE。setLayoutParams从活动片段内的布局

这些都是我想调用的方法:

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); 
} 

这些是调用方法的菜单项:

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"); 

这是错误:

当你想调用 searcherOpen()的堆栈跟踪
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) 

首先,显然,这行代码是没有找到任何片段:

patientFragment = (PatientFragment)getFragmentManager().findFragmentByTag("patientFragment"); 

其次,当你试图找到findFragmentByTag片段你应该总是核实该片段存在,即不为空

if(patientFragment != null) { patientFragment.myMethod(); } 

第三,你也应该验证您的片段添加到活动中,或你可能会在一些其他类型的NPE

if(patientFragment != null && patientFragment.isAdded()){ patientFragment.myMethod(); } 

的结束了最后,也许就是为什么你收到此错误就在于,你创建的片段,或在这种情况下,如何创建它的原因。我假设你在Activity里面创建了它,它扩展了FragmentActivity,因此你应该使用getSupportFragmentManager()来创建它。换句话说,要检索片段,您还应该拨打getSupportFragmentManager,如@CODER指出的那样:

patientFragment = (PatientFragment)getSupportFragmentManager().findFragmentByTag("patientFragment"); 
if(patientFragment != null && patientFragment.isAdded()){ 
    patientFragment.myMethod(); 
} 

基地,您为看起来像你的PatientFragmentnull。 所以你需要首先实例化它,然后调用该方法。 这个调用:

patientFragment = (PatientFragment)getFragmentManager().findFragmentByTag("patientFragment"); 

是不对的,你应该创建throught newInstance()呼叫并将其添加到使用FragmentManager活动,请阅读this arcticle相关问题

尝试getSuportFragmentManager()而不是getFragmentManager()