android - 在 BottomSheet fragment 中选择项目时刷新 Activity

标签 android material-design bottom-sheet android-bottomappbar

我已经设置了一个带有 NavigationDrawerBottomAppBar 但我无法恢复在这个 Drawer 中选择的项目,它是一个 fragment 。

我按照许多教程来设置这个 BottomAppBar,但我从来没有看到如何从抽屉中获取选择。

我的抽屉是这样创建的:

public class MaintainerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maintainer);

        setUpBottomAppBar();
    }

    private void loadFragment(Fragment fragment) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.main_container, fragment);
        transaction.commit();
    }

    private void setUpBottomAppBar() {
        BottomAppBar bottomAppBar = findViewById(R.id.bottom_app_bar);
        setSupportActionBar(bottomAppBar);

        bottomAppBar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BottomSheetDialogFragment bottomSheetDialogFragment = BottomSheetNavigationMaintainerFragment.newInstance();
                bottomSheetDialogFragment.show(getSupportFragmentManager(), "Bottom Sheet Dialog Fragment");
                Bundle args = bottomSheetDialogFragment.getArguments();
            }
        });

        bottomAppBar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
    }
}

最后,这是我的 fragment 的代码:

public class BottomSheetNavigationMaintainerFragment extends BottomSheetDialogFragment {

    public BottomSheetNavigationMaintainerFragment() {
        // Required empty public constructor
    }

    public static BottomSheetNavigationMaintainerFragment newInstance() {
        Bundle args = new Bundle();
        BottomSheetNavigationMaintainerFragment fragment = new BottomSheetNavigationMaintainerFragment();
        fragment.setArguments(args);
        return fragment;
    }

    private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {

        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                dismiss();
            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) { }
    };

    @SuppressLint("RestrictedApi")
    @Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        //Get the content View
        View contentView = View.inflate(getContext(), R.layout.fragment_bottom_navigation_maintainer, null);
        dialog.setContentView(contentView);

        NavigationView navigationView = contentView.findViewById(R.id.navigation_view);

        //implement navigation menu item click event
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.app_bar_assets:
                        break;
                    case R.id.app_bar_items:
                        break;
                }
                return false;
            }
        });
        ImageView closeButton = contentView.findViewById(R.id.close_image_view);
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //dismiss bottom sheet
                dismiss();
            }
        });

        //Set the coordinator layout behavior
        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
        CoordinatorLayout.Behavior behavior = params.getBehavior();

        //Set callback
        if (behavior instanceof BottomSheetBehavior) {
            ((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
        }
    }
}

因此,我想在 onNavigationItemSelected 方法中返回所选项目,但我找不到将此 fragment 链接到创建它的 Activity 的方法

最佳答案

如何引入这样的接口(interface):

public interface OnItemSelectedListener {
   void onItemSelected(int ItemId);
}

让 MaintainerActivity 像这样实现这个接口(interface):

public class MaintainerActivity extends AppCompatActivity implements OnItemSelectedListener {

   @Override
   public void onItemSelected(int ItemId) {
      //TODO - do something with this selected item...
   }
}

然后在您的 BottomSheetNavigationMaintainerFragment 中执行此操作:

private OnItemSelectedListener onItemSelectedListener;

@Override
public void onAttach(Context context) {
   super.onAttach(context);
   if(context instanceof OnItemSelectedListener){
        onItemSelectedListener = (OnItemSelectedListener)context;
   }
}

然后,当一个项目被选中时:

//implement navigation menu item click event 
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
      @Override
      public boolean onNavigationItemSelected(@NonNull MenuItem item) {
          if(onItemSelectedListener != null){
              onItemSelectedListener.onItemSelected(item.getItemId());
          }
          return false;
       }
    });

关于android - 在 BottomSheet fragment 中选择项目时刷新 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55952169/

相关文章:

Android Jetpack Compose - 浅色主题更改后 Bottom Sheet 不会展开

android - 不兼容类型 : Mainactivity cannot be converted to OnClickListener

java - 无法选中复选框

android - 任务 ':app:dexDebug'的执行失败。用非零退出值1完成的java.exe

javascript - 在 Polymer 中获取文本字段的值

node.js - "Cannot read property ' MDCSwitch ' of undefined"导入MDC Switch组件时出错

android - Jetpack 撰写文本字段 OnFocusChangeListener

android - 如何在单击的 Material 抽屉导航菜单项上启动 Activity

android - Bottom Sheet 错误 : The view is not a child of CoordinatorLayout

android - 找不到脚手架小部件 : Getting exception while opening Bottom Dialog sheet