片段内的 CollapsingToolbarLayout 菜单

CollapsingToolbarLayout Menu inside a fragment

如果有一种方法可以在片段内制作 CollapsingToolbarLayout 菜单,而无需我们在其中定义自定义布局,我很想知道。 在 phone 布局上,我制作了其中包含菜单的 DetailActivity。

在平板布局上,我把细节做成了右边的片段。 CollapsingToolbarLayout 实际上工作正常,但我无法直接向其添加任何菜单。

我知道 Fragment.setHasOptionsMenu(true);,但我不想将我的详细菜单与 activity 菜单合并。

PS: 我在这里使用的图像是从TMDb中检索到的,它是免费的。

我已经深入了解 CollapsingToolbarLayout 并在谷歌上搜索它,但我认为这不可能。因此,为了解决方法,我制作了一个带有菜单溢出图标的 ImageView,并在其下方弹出显示列表以模仿操作菜单行为。 这是我的 CollapsingToolbarLayout 在 XML

中的样子
<android.support.design.widget.CollapsingToolbarLayout
    android:fitsSystemWindows="false"
    android:id="@+id/collapsing_toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    app:contentInsetStartWithNavigation="0dp"
    app:contentScrim="?attr/colorPrimary"
    app:expandedTitleMarginEnd="64dp"
    app:expandedTitleMarginStart="48dp"
    app:layout_scrollFlags="exitUntilCollapsed|scroll">

    <your.app.AutoFitImageView
        android:fitsSystemWindows="false"
        android:id="@+id/iv_backdrop_image"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:scaleType="fitCenter"
        android:transitionName="image"
        app:layout_collapseMode="parallax"
        tools:targetApi="lollipop"/>

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_height="?attr/actionBarSize"
        android:layout_width="match_parent"
        app:layout_collapseMode="pin"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

        <ImageView
            android:id="@+id/button_menu"
            android:layout_gravity="right"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:minHeight="48dp"
            android:minWidth="48dp"
            android:scaleType="centerInside"
            android:src="@drawable/ic_action_overflow"/>
    </android.support.v7.widget.Toolbar>

</android.support.design.widget.CollapsingToolbarLayout>

然后我将 clickListener 设置为具有 R.id.button_menu id 的 ImageView 以调用此方法:

private void showListMenu(View anchor) {
    final ListPopupWindow popupWindow = new ListPopupWindow(getActivity());

    List<HashMap<String, String>> data = new ArrayList<>();

    HashMap<String, String> map1 = new HashMap<>();
    map1.put("menu", "Share Detail");

    HashMap<String, String> map2 = new HashMap<>();
    map2.put("menu", "Share First Trailer");

    data.add(map1);
    data.add(map2);

    final Movie movieData = getMovieData();
    HashMap<String, String> map3 = new HashMap<>();
    if (DbHelper.movieInDb(movieData)) {
        map3.put("menu", getString(R.string.unfavorite));
    } else {
        map3.put("menu", getString(R.string.favorite));
    }
    data.add(map3);

    ListAdapter adapter = new SimpleAdapter(
            getActivity(),
            data,
            android.R.layout.simple_list_item_1, // You may want to use your own cool layout
            new String[]{"menu"}, // These are just the keys that the data uses
            new int[]{android.R.id.text1}); // The view ids to map the data to

    popupWindow.setAnchorView(anchor);
    popupWindow.setAdapter(adapter);

    DisplayMetrics displaymetrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    popupWindow.setWidth(displaymetrics.widthPixels / 3); // note: don't use pixels, use a dimen resource

    popupWindow.setOnItemClickListener(yourListener); // the callback for when a list item is selected
    popupWindow.show();
}

该方法将在单击时显示与溢出操作菜单具有相同样式的ListPopUpWindow。 这是最终布局的样子