0

如果有一种方法可以让CollapsingToolbarLayout菜单在一个片段中,而我们不需要在其中定义自定义布局,那我就非常有趣。 在手机布局上,我制作了具有菜单的DetailActivity。 enter image description hereCollapsingToolbarLayout片段内的菜单

在平板电脑布局上,我在右侧制作了细节片段。 CollapsingToolbarLayout实际上工作正常,但我无法直接向它添加任何菜单。 enter image description here

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

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

回答

1

我已经潜入CollapsingToolbarLayout并使用Google搜索,但我认为这是不可能的。因此,为了解决方法,我使用菜单溢出图标创建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到的ImageView与R.id.button_menu id来调用这个方法:

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点击时。 这里是最终的布局看起来像 enter image description here

+0

非常聪明,而且非常有用的解决方案。 –