Java 活动片段内布局的setLayoutParams

Java 活动片段内布局的setLayoutParams,java,android,android-layout,android-fragments,android-activity,Java,Android,Android Layout,Android Fragments,Android Activity,我有一个活动,里面有很多片段。当我在一个特定的片段上展开菜单时,当单击展开的菜单项时,我应该调用片段类的一个方法,该方法更改片段内部约束布局的布局参数。问题是我试图改变的约束布局上有一个NPE 以下是我尝试调用的方法: public void searcherOpen() { searchLayout.setLayoutParams(new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT,

我有一个活动,里面有很多片段。当我在一个特定的片段上展开菜单时,当单击展开的菜单项时,我应该调用片段类的一个方法,该方法更改片段内部约束布局的布局参数。问题是我试图改变的约束布局上有一个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);
}
以下是调用方法的菜单项:

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)

在调用
searcherOpen()
时,您提供的Base-on-stackTrace看起来像是
PatientFragment
null
。 所以您需要先实例化它,然后调用该方法。 此电话:

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

如果是错误的,您应该通过调用
newInstance()
来创建它,并使用
FragmentManager
将其添加到活动中,请阅读相关问题的文章首先尝试getSuportFragmentManager()而不是getFragmentManager()

,显然,此行代码没有找到任何片段:

patientFragment = (PatientFragment)getFragmentManager().findFragmentByTag("patientFragment");
其次,当您试图查找带有
findfracentbytag
的片段时,您应该始终验证该片段是否存在,即不为null

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