【问题标题】:How do I setSupportActionBar() in multiple fragments?如何在多个片段中 setSupportActionBar()?
【发布时间】:2017-06-13 22:28:05
【问题描述】:

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

在每个片段中,我在 onCreate() 中 setHasOptionsMenu(true);

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

onCreateOptionsMenu() 中,我首先调用super,然后调用menu.clear(),最后使用inflater.inflate(R.menu.searchbar_menu, menu); 膨胀菜单;

失败的地方是在两个片段中调用((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);。这样做时,选项只会出现在第二个片段上,而不是第一个片段上。如果我只在一个片段中调用它,则选项只会在那个片段中按预期显示。当然,如果我都没有调用,它们根本不会出现。

这是我的代码。两个 Fragment 基本上是相同的,只是菜单被夸大了:

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
     */

有谁知道我可以将两个片段都设置为具有它们的工具栏选项吗?

提前致谢。

【问题讨论】:

  • 我认为您想要做的是让活动设置一个基本工具栏以及任何基本(共享)菜单项,并在onCreateOptionsMenu 中添加每个片段唯一的项目。或者,如果您知道一个 Fragment 将始终出现在另一个之前,您只需在第一个 Fragment 中设置工具栏后,在第二个 Fragment 中添加您需要的内容。
  • 添加答案可能为时已晚,但希望对您有所帮助...
  • @johnriggs 你解决了这个问题吗?我也面临同样的情况
  • @ZayidMohammed 遗憾的是我没有

标签: android android-fragments appcompatactivity


【解决方案1】:

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

你可以试试这个

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

【讨论】:

  • 我也遇到了同样的问题,这个方法不行
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2016-06-25
    • 2019-07-08
    相关资源
    最近更新 更多