活动访问onAttachFragment中的片段的onCreateView小部件:NullPointerException

时间:2019-03-10 20:26:09

标签: android android-fragments

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

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

  1. 我创建了一个包含方法clickOnBurgerMenu

  2. 的接口
  3. 在我的活动中,我已经通过打开抽屉的方法实现了此接口

  4. 在我的活动中,我实现了方法onAttachFragment,在这里我将该片段的方法称为setUpMaterialSearchBar

  5. 在我的片段中:在方法setUpMaterialSearchBar(final ClickOnBurgerMenu activity)中:我叫activity.clickOnBurgerMenu();

但是问题在于,在片段的方法setUpMaterialSearchBar中,对activity.clickOnBurgerMenu();的调用是在搜索栏上设置的侦听器中执行的。后者在此片段的方法onCreateView中定义。

因此,当附加了片段时,活动将执行其setUpMaterialSearchBar方法以使用活动的抽屉设置侦听器,但是此时物料搜索栏不存在:侦听器设置在引用null,并抛出NullPointerException。换句话说,更确切地说:material_search_bar仅在onCreateView中定义,在活动的onAttachFragment之后调用-这就是问题所在。

我该如何解决这个问题?


来源

界面

public interface ClickOnMaterialSearchBarBurgerMenu {
    void clickOnMaterialSearchBarBurgerMenu();
}

活动(实现此接口)

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

片段(例如,{material_search_bar仅在onCreateView中定义,在活动的onAttachFragment之后调用-这就是问题所在)

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.

1 个答案:

答案 0 :(得分:1)

为了阐明您的逻辑,您可以引入

private SimpleOnSearchActionListener sosActionListener; in HomeFragment

如下更改setUpMaterialSearchBar()

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

后添加以下行来修改onCreateView()
material_search_bar.setOnSearchActionListener(sosActionListener);