在我的片段中,我有一个带有汉堡菜单的搜索栏。单击后者时,必须打开导航抽屉。但这是在活动中定义的。
要从我的片段访问活动的抽屉,请执行以下操作:
我创建了一个包含方法clickOnBurgerMenu
在我的活动中,我已经通过打开抽屉的方法实现了此接口
在我的活动中,我实现了方法onAttachFragment
,在这里我将该片段的方法称为setUpMaterialSearchBar
在我的片段中:在方法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.
答案 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);