Android 活动访问片段';s onCreateView';在片段中的s小部件:NullPointerException

Android 活动访问片段';s onCreateView';在片段中的s小部件:NullPointerException,android,android-fragments,Android,Android Fragments,在我的片段中,我有一个带有汉堡菜单的搜索栏。单击后者时,必须打开导航抽屉。但它是在活动中定义的 要从我的片段访问活动的抽屉,请执行以下操作: 我已经创建了一个包含方法clickOnBurgerMenu 在我的活动中,我用一个打开抽屉的方法实现了这个接口 在我的活动中,我实现了方法onAttachFragment,这里我调用了片段的方法setUpMaterialSearchBar 在我的片段中:在方法setUpMaterialSearchBar(final ClickOnBurgerMenu活动)

在我的片段中,我有一个带有汉堡菜单的搜索栏。单击后者时,必须打开导航抽屉。但它是在活动中定义的

要从我的片段访问活动的抽屉,请执行以下操作:

  • 我已经创建了一个包含方法
    clickOnBurgerMenu

  • 在我的活动中,我用一个打开抽屉的方法实现了这个接口

  • 在我的活动中,我实现了方法
    onAttachFragment
    ,这里我调用了片段的方法
    setUpMaterialSearchBar

  • 在我的片段中:在方法
    setUpMaterialSearchBar(final ClickOnBurgerMenu活动)
    中:我调用
    activity.ClickOnBurgerMenu()

  • 但问题是,在片段的方法
    setUpMaterialSearchBar
    中,调用
    activity.clickOnBurgerMenu()在搜索栏上的侦听器集中执行。后者在该片段的方法
    onCreateView
    中定义

    因此,当附加片段时,活动执行其
    setUpMaterialSearchBar
    方法,以便使用活动的抽屉设置侦听器,但此时不存在材质搜索栏:侦听器设置在
    null
    引用上,并引发
    NullPointerException
    。换句话说,更具体地说:
    material\u search\u bar
    仅在
    onCreateView
    中定义,在活动的
    片段之后调用-这就是问题所在

    我怎样才能解决这个问题


    来源

    接口 活动(实现此接口) 片段(
    material\u search\u bar
    仅在
    onCreateView
    中定义,在活动的
    片段之后调用-这就是问题所在)
    
    为了解开你的逻辑,你可以引入

    私有SimpleOnSearchActionListener sosActionListener
    HomeFragment

    更改
    设置材料搜索栏()
    ,如下所示:

    public void setUpMaterialSearchBar(final ClickOnMaterialSearchBarBurgerMenu activity) {
        sosActionListener = new SimpleOnSearchActionListener() {
            @Override
            public void onButtonClicked(int buttonCode) {
                switch (buttonCode){
                    case MaterialSearchBar.BUTTON_NAVIGATION:
                        activity.clickOnMaterialSearchBarBurgerMenu();
                        break;
                    case MaterialSearchBar.BUTTON_BACK:
                    // etc. etc. etc.
                }
            }
        };
        if (material_search_bar != null){
            material_search_bar.setOnSearchActionListener(sosActionListener);
        }
    }
    
    并通过在初始化物料搜索栏后添加以下行来修改
    onCreateView()


    “if(material_search_bar!=null){material_search_bar.setOnSearchActionListener(sosActionListener);}”行是否真的有用且必要?@JarsOfJam-这取决于您希望在何种情况下调用该方法。在你的问题所涉及的情况下,你可以省略这些行,但保留它们不会有什么坏处。如果以后(在onCreateView()运行之后)要使用相同的方法,它们很重要
    @Override
    public void onAttachFragment(Fragment fragment) {
        if (fragment instanceof HomeFragment) {
            HomeFragment home_fragment = (HomeFragment) fragment;
            home_fragment.setUpMaterialSearchBar(this);
        }
    }
    
    @Override
    public void clickOnMaterialSearchBarBurgerMenu() {
        drawer_layout.openDrawer(Gravity.START);
    }
    
    public void setUpMaterialSearchBar(final ClickOnMaterialSearchBarBurgerMenu activity) {
        material_search_bar.setOnSearchActionListener(new SimpleOnSearchActionListener() {
            @Override
            public void onButtonClicked(int buttonCode) {
                switch (buttonCode){
                    case MaterialSearchBar.BUTTON_NAVIGATION:
                        activity.clickOnMaterialSearchBarBurgerMenu();
                        break;
                    case MaterialSearchBar.BUTTON_BACK:
                    etc. etc. etc.
    
    public void setUpMaterialSearchBar(final ClickOnMaterialSearchBarBurgerMenu activity) {
        sosActionListener = new SimpleOnSearchActionListener() {
            @Override
            public void onButtonClicked(int buttonCode) {
                switch (buttonCode){
                    case MaterialSearchBar.BUTTON_NAVIGATION:
                        activity.clickOnMaterialSearchBarBurgerMenu();
                        break;
                    case MaterialSearchBar.BUTTON_BACK:
                    // etc. etc. etc.
                }
            }
        };
        if (material_search_bar != null){
            material_search_bar.setOnSearchActionListener(sosActionListener);
        }
    }
    
    material_search_bar.setOnSearchActionListener(sosActionListener);