【问题标题】:Refresh Activity when item select in BottomSheet Fragment在 BottomSheet 片段中选择项目时刷新 Activity
【发布时间】:2019-05-02 12:10:38
【问题描述】:

我已经设置了BottomAppBarNavigationDrawer,但我无法恢复此抽屉中选择的项目,这是一个片段。

我按照许多教程来设置这个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) {

            }
        });
    }
}

最后,这是我的片段的代码:

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 方法中返回所选项目,但我找不到将此片段链接到创建它的活动的方法

【问题讨论】:

  • 你为什么不通过从底部的工作表调用活动上的方法来做到这一点?像这样的东西:((MaintainerActivity)getActivity()).doSomethingInTheActivity().

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


【解决方案1】:

介绍一个接口怎么样:

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

让MaintainerActivity像这样实现这个接口:

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;
       }
    });

【讨论】:

    【解决方案2】:

    我在活动中添加一个片段。在哪个片段中,我在按钮单击时调用底部片段打开底部工作表,然后单击底部栏文本,吐司打印在片段中。 创建带有点击事件接口的Dialog类

      public class AutoAppSelectrDialogFragment extends BottomSheetDialogFragment {
    
            OnAutoAppSelectPickerListener mListener;
    
            /**
             * Factory method.
             *
             * @return A new instance of fragment ImagePickerDialogFragment.
             */
            public static AutoAppSelectrDialogFragment newInstance(boolean showRemove) {
                AutoAppSelectrDialogFragment fragment = new AutoAppSelectrDialogFragment();
                Bundle bundle = new Bundle();
                bundle.putBoolean("showRemove", showRemove);
                fragment.setArguments(bundle);
                return fragment;
            }
    
            @SuppressLint("RestrictedApi")
            @Override
            public void setupDialog(final Dialog dialog, int style) {
                super.setupDialog(dialog, style);
                View contentView = View.inflate(getContext(), R.layout.bottom_sheet_auto_run, null);
                ButterKnife.bind(this, contentView);
                dialog.setCanceledOnTouchOutside(false);
                dialog.setContentView(contentView);
            }
    
            public void setListener(OnAutoAppSelectPickerListener listener) {
                mListener = listener;
            }
    
    
            @OnClick(R.id.txt_1)
            public void Click1() {
                if (mListener != null)
                    mListener.onClick1();
                dismiss();
            }
    
            @OnClick(R.id.txt_2)
            public void Click2() {
                if (mListener != null)
                    mListener.onClick2();
                dismiss();
            }
    
    
    
    
            public interface OnAutoAppSelectPickerListener {
                void onClick1();
                void onClick2();
            }
    
        }
    

    对话片段布局的XML bottom_sheet_auto_run

    <TextView
                    android:id="@+id/txt_1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:background="?actionBarItemBackground"
                    android:gravity="center"
                    android:padding="@dimen/dp_12"
                    android:textColor="@color/content_text_color"
                    android:textSize="@dimen/font_16_sp" />
    
    <TextView
                    android:id="@+id/txt_2"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:background="?actionBarItemBackground"
                    android:gravity="center"
                    android:padding="@dimen/dp_12"
                    android:textColor="@color/content_text_color"
                    android:textSize="@dimen/font_16_sp" />
    

    在这样的片段或活动中单击按钮时打开底部工作表对话框,并使用接口来实现 DialogeFragment 布局的单击事件

        public class AutoSartInformation extends Fragment implements AutoAppSelectrDialogFragment.OnAutoAppSelectPickerListener {
          @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                // Inflate the layout for this fragment
        imgAutoStartApp = view.findViewById(R.id.img_auto_start_app);
         imgAutoStartApp.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        AutoAppSelectrDialogFragment imagePickerDialogFragment = AutoAppSelectrDialogFragment.newInstance(true);
                        imagePickerDialogFragment.setCancelable(false);
                        imagePickerDialogFragment.setListener(AutoSartInformation.this);
                        imagePickerDialogFragment.show(getActivity().getSupportFragmentManager(), imagePickerDialogFragment.getTag());
                    }
                });
           }
    
    
        @Override
        public void onClick1() {
          Log.d("Click","1");
    open Fragment on click of dialouge first text click
        }
    
        @Override
        public void onClick2() {
            Log.d("Click","2");
        }
    

    【讨论】:

    • 我不明白你在做什么我想在我的活动中加载一个片段,这取决于抽屉中选择的项目检查我的代码我编辑了我的帖子
    • 嗯,但我认为mListener在进程死亡后会为空,所以用户按下按钮1/按钮2,什么都不会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多