Активность, обращающаяся к виджету фрагмента onCreateView в onAttachFragment: NullPointerException - PullRequest
0 голосов
/ 10 марта 2019

В моем фрагменте у меня есть строка поиска с меню бургера.Когда последний щелкается, ящик навигации должен быть открыт.Но это определено в упражнении.

Чтобы получить доступ к ящику занятия из моего фрагмента:

  1. Я создал интерфейс, содержащий метод clickOnBurgerMenu

  2. В моей деятельности я реализовал этот интерфейс с помощью метода, который открывает его ящик

  3. В моей деятельности я реализовал метод onAttachFragment издесь я называю метод фрагмента setUpMaterialSearchBar

  4. В моем фрагменте: в методе 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 Ответ

1 голос
/ 11 марта 2019

Чтобы распутать вашу логику, вы можете ввести

private SimpleOnSearchActionListener sosActionListener; в 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);
    }
}

И измените onCreateView(), добавив следующую строку после инициализации material_search_bar

material_search_bar.setOnSearchActionListener(sosActionListener);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...