1

我正在尝试实现单击溢出菜单时打开底部工作表的行为。例如:预期行为

我可以按照这里onMenuOpened的建议在活动上执行此操作,但我想在片段上执行此操作。

如何在片段上实现这种行为?

我正在使用单一活动模式和导航架构组件。

4

3 回答 3

1

创建一个将由您的 Fragment 实现的接口

前任:

public interface OnMenuOpenListener(){
  boolean onMenuOpened(); 
}

public class MyFragment extends Fragment implements OnMenuOpenListener{
   @Override
   public boolean onMenuOpened(){
    //open bottom sheet here
   }
}

public class MyActivity extends Activity{
   @Override
   public boolean onMenuOpened(int featureId, Menu menu) {
      if(featureId == AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR && menu != null){
        //overflow menu clicked, put code here...
        // As you are using navigation component
        Fragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host);
        //MyFragment
        Fragment fragment=navHostFragment.getChildFragmentManager().getFragments().get(0);
        if(fragment instanceof OnMenuOpenListener){
           ((OnMenuOpenListener)fragment).onMenuOpened()
          return false;
        }
      }
       return super.onMenuOpened(featureId, menu);
   }
}

由于支持操作栏附加到活动所有事件都由活动捕获所有您需要做的就是获取需要事件的片段并使用回调触发调用。如果您返回falseonMenuOpened 将不会打开溢出菜单并会触发片段中的底部工作表菜单。

PS-我没有在编辑器中编写代码,所以可能会有一些错误,但你一定明白了。

参考: https ://stackoverflow.com/a/51732378/7972699

于 2019-07-26T06:45:11.267 回答
1

正如这里所讨论的,当点击溢出菜单时打开底页是糟糕的用户体验。

为什么?

帖子中引用

因为用户必须到达屏幕顶部才能单击 oveflow 菜单,然后返回底部单击底部工作表上的所需操作。

-

根据菲特定律 - 获取目标的时间是目标距离和大小的函数。我同意我认为菜单和底页之间的距离很大。该解决方案允许在一个地方放置很多选项。

-

它也不符合用户的期望,因为人们习惯了以不同方式打开溢出菜单。

如果您有顶部操作栏,请使用通常的上下文菜单。如果您有底部操作栏,则可以使用底部工作表。

于 2019-09-20T11:19:13.407 回答
0
 **You can try the following steps to open bottom sheet dialog:** 

1. Just make a function inside Activity where the fragment is replace


public Fragment getCurrentFragment() {
      return getSupportFragmentManager().findFragmentById(R.id.frameContainer);
     }

     Fragment fragment = getCurrentFragment();
     if (fragment != null) {
      if (fragment instanceof RequiredFragment) {
       RequiredFragment.openBottumSheetDialog();

      }
     }



2. In Side RequiredFragment get your function from activity:



 private BottomSheetDialog mBottomSheetDialogFragment;

 private void showBottomSheetFilter() {
   if (mBottomSheetDialogFragment == null) {
    mBottomSheetDialogFragment = mBottomSheetDialogFragment.newInstance(feedSection);
    mBottomSheetDialogFragment.setCallBackListener(new OnFeedsTypeSelectedListener() {
      @Override
      public void onFeedsTypeSelected(int contentType) {
       filterByContentTypeId(contentType);
      }

     }
     mBottomSheetDialogFragment.show(getChildFragmentManager(),
      mBottomSheetDialogFragment.getTag());
    }

3. Create a BottomSheetDialog Dialog fragment.



public class BottomSheetDialog extends BottomSheetDialogFragment {

     private String[] feedsFilter;
     private ListView listView;


     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      feedsFilter = getResources().getStringArray(R.array.ideas_filter);
     }

     @Override
     public void setupDialog(final Dialog dialog, int style) {
      super.setupDialog(dialog, style);
      View contentView = View.inflate(getContext(), R.layout.dialog_idea_filter_bottom_sheet, null);
      dialog.setContentView(contentView);

      listView = (ListView) contentView.findViewById(R.id.listView);
      ArrayAdapter < String > adapter = new ArrayAdapter < String > (getActivity(),
       android.R.layout.simple_list_item_1, feedsFilter);
      listView.setAdapter(adapter);

      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
       @Override
       public void onItemClick(AdapterView < ? > parent, View view,
        int position, long id) {
        if (onFeedsTypeSelected != null) {
         onIdeaTypeSelectedListenonFeedsTypeSelecteder.onFeedsTypeSelected(feedsFilter[position]);
        }
        dismiss();
       }
      });
     }


     public void setCallBackListener(onFeedsTypeSelected SelectedListener onFeedsTypeSelected) {
      this.onIdeaTypeSelectedLionFeedsTypeSelectedstener = onFeedsTypeSelected;
     }
    }
于 2019-07-26T06:28:49.047 回答