Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在多个片段中设置SupportActionBar()?_Android_Android Fragments_Appcompatactivity - Fatal编程技术网

Android 如何在多个片段中设置SupportActionBar()?

Android 如何在多个片段中设置SupportActionBar()?,android,android-fragments,appcompatactivity,Android,Android Fragments,Appcompatactivity,我在一个AppCompatActivity中有两个支持片段。根据设计,它们都有独特的工具栏和选项菜单。AppCompatActivity在其布局中没有工具栏,因为它们包含在每个片段中 在每个片段中,Isethaspoptions菜单(true) 在onCreateView()中,我正在调用((AppCompatActivity)getActivity()).setSupportActionBar(工具栏)其中toolbar是绑定到xml toolbar元素的对象 在onCreateOptions

我在一个
AppCompatActivity
中有两个支持片段。根据设计,它们都有独特的工具栏和选项菜单。
AppCompatActivity
在其布局中没有工具栏,因为它们包含在每个片段中

在每个片段中,I
sethaspoptions菜单(true)

在onCreateView()中,我正在调用
((AppCompatActivity)getActivity()).setSupportActionBar(工具栏)其中toolbar是绑定到xml toolbar元素的对象

onCreateOptions菜单()
中,我首先调用super,然后调用menu.clear(),最后使用充气器对菜单充气。充气(R.menu.searchbar\u menu,menu)

失败的地方是调用
((AppCompatActivity)getActivity())。setSupportActionBar(工具栏)在两个片段中。这样,选项将只出现在第二个片段上,而不会出现在第一个片段上。如果我只在一个片段中调用它,那么选项只在这一个片段中出现。当然,如果我两者都不打电话,它们根本就不会出现

这是我的密码。两个片段基本相同,但菜单除外:

public class FeedFragment extends Fragment implements FeedView{

    @BindView(R.id.toolbar)
    Toolbar toolbar;

    FeedPresenter presenter;

    static final String TAG = "FEED_FRAGMENT";

    /*
     * Some boilerplate fragment setup code
     */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_feed, container, false);
        ButterKnife.bind(this, view);
        ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
        setupToolar();
        return view;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);

        menu.clear();
        inflater.inflate(R.menu.searchbar_menu, menu);

    }

    private void setupToolbar(){
        toolbar.setPadding(0,ScreenUtil.getStatusBarHeight(this.getActivity()),0,0);
        toolbar.setTitle("");
    }

    /*
     * Other logic code unique to each fragment
     */
有人知道我可以将两个片段都设置为具有工具栏选项吗


提前感谢。

当您调用
getActivity()
时,它将返回与
活动相同的实例。第二个片段的初始化时间晚于第一个片段,这就是为什么
活动
只能支持第二个片段上的操作栏

你可以试试这个

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        AppCompatActivity baseActivity = (AppCompatActivity) getContext();
        baseActivity.setSupportActionBar(yourToolbar);
    }
}

对我有效的是根据当前可见的片段设置SuppoeActionBar。您可以使用以下代码:

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if(!hidden){
        ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
    }
}

我认为您要做的是让活动设置一个基本工具栏以及任何基本(共享)菜单项,并在
oncreateoptions菜单中添加每个片段特有的项。或者,如果你知道一个片段总是出现在另一个片段之前,你只需在第一个片段中设置工具栏后在第二个片段中添加你需要的内容。添加答案可能会很晚,但我希望这会帮助你…@johnriggs你解决了这个问题吗?我也面临着挑战same@ZayidMohammed可悲的是,我没有。我也面临着同样的问题,这种方法不起作用