點擊按鈕從右側滑出半透明覆蓋層,包含篩選選項,確定後更新主頁數據,不完全遮蓋主 Activity。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| SlidingMenu (Library) | 成熟、手勢滑動、邊緣觸發、Activity 級切換 | 庫已停維、侵入性強、需繼承特定基類 | 老項目快速接入 |
| PopupWindow | 輕量、API 原生、可任意錨點、動畫可控 | 需手動處理遮罩、返回鍵、軟鍵盤遮擋 | 簡單彈出面板 |
| BottomSheetDialogFragment (推薦) | Material Design 風格、自帶拖拽手柄、狀態管理、生命週期安全 | 需 Support Library 23.2+、佈局需符合規範 | 現代 App 篩選/分享/操作表 |
| Navigation Drawer (DrawerLayout) | 系統級導航模式、手勢/圖標雙觸發、多頁面切換 | 佔據整個側邊、不適合臨時篩選 | 主導航菜單 |
public class FilterBottomSheet extends BottomSheetDialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.filter_sheet, container, false);
// 設置 RecyclerView、確定按鈕點擊
view.findViewById(R.id.btnConfirm).setOnClickListener(v -> {
// 通過接口回調傳遞篩選條件
((FilterListener)getActivity()).onFilterConfirmed(collectConditions());
dismiss();
});
return view;
}
@Override
public void onStart() {
super.onStart();
// 設置彈出高度為屏幕 70%
Dialog dialog = getDialog();
if (dialog != null) {
FrameLayout bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet);
BottomSheetBehavior.from(bottomSheet).setPeekHeight((int)(Resources.getSystem().getDisplayMetrics().heightPixels * 0.7));
}
}
}
new FilterBottomSheet().show(getSupportFragmentManager(), "FilterBottomSheet");