Android “Top Sheet” equivalent of “Bottom Sheet”?

前端 未结 2 1969
终归单人心
终归单人心 2020-12-16 13:19

I am wanting to implement a \"Bottom Sheet\" type of layout, but with a twist where the \"bottom\" sheet will be a MapFragment, which won\'t work very well as an up/down dra

相关标签:
2条回答
  • 2020-12-16 13:47

    This TopSheetBehavior implementation ( https://github.com/MedveDomg/AndroidTopSheet/blob/master/library/src/main/java/com/github/techisfun/android/topsheet/TopSheetBehavior.java ) has proved to work pretty well in my case. I found many other TopSheetBehavior that were incomplete or that crashed, but this one doesn't crash and works out of the box by only replacing the behavior parameter:

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:behavior_hideable="true"
            app:behavior_peekHeight="56dp"
            app:layout_behavior="your.package.components.TopSheetBehavior">
    
            <!-- Your content goes here -->
    
        </LinearLayout>
    
    0 讨论(0)
  • 2020-12-16 14:04

    Here is the basis of my solution that I commented about above. I will come back and flesh it out later.

    @Override
    protected void onCreate(
            @Nullable
                    Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        if (isFinishing())
        {
            return;
        }
    
    
        setContentView(R.layout.activity_home);
    
        ...
    
        mGroupBottomSheetFiller = (ViewGroup) findViewById(R.id.groupBottomSheetFiller);
    
        final NestedScrollView bottomSheetMap = (NestedScrollView) findViewById(R.id.bottomSheetMap);
        mBottomSheetMapBehavior = BottomSheetBehavior.from(bottomSheetMap);
        mBottomSheetMapBehavior.setBottomSheetCallback(new BottomSheetCallback()
        {
            @Override
            public void onStateChanged(
                    @NonNull
                            View bottomSheet,
                    int newState)
            {
                //Log.e(TAG, "mBottomSheetMapBehavior.onStateChanged(bottomSheet, newState=" +
                //             bottomSheetBehaviorStateToString(newState) + ')');
                int visibility = isBottomSheetExpanded(mBottomSheetMapBehavior) ? View.VISIBLE : View.GONE;
                mImageBottomSheetMapClose.setVisibility(visibility);
            }
    
            @Override
            public void onSlide(
                    @NonNull
                            View bottomSheet,
                    float slideOffset)
            {
                //Log.e(TAG, "mBottomSheetMapBehavior.onStateChanged(bottomSheet, slideOffset=" + slideOffset + ')');
                resizeMap();
            }
        });
        bottomSheetMap.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener()
        {
            @Override
            public void onGlobalLayout()
            {
                //Log.e(TAG, "onGlobalLayout()");
                bottomSheetMap.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                resizeMap();
            }
        });
    
        ...
    }
    
    private void resizeMap()
    {
        int screenHeightPixels = PbPlatformUtils.getScreenHeightPixels();
        //Log.e(TAG, "resizeMap: screenHeightPixels=" + screenHeightPixels);
    
        int[] location = new int[2];
        mGroupMap.getLocationInWindow(location);
        //Log.e(TAG, "resizeMap: getLocationInWindow=" + Arrays.toString(location));
    
        LayoutParams groupMapLayoutParams = mGroupMap.getLayoutParams();
        groupMapLayoutParams.height = screenHeightPixels - location[1];
        mGroupMap.requestLayout();
    }
    
    public static String bottomSheetBehaviorStateToString(int state)
    {
        String s;
        switch (state)
        {
            case BottomSheetBehavior.STATE_COLLAPSED:
                s = "STATE_COLLAPSED";
                break;
            case BottomSheetBehavior.STATE_DRAGGING:
                s = "STATE_DRAGGING";
                break;
            case BottomSheetBehavior.STATE_EXPANDED:
                s = "STATE_EXPANDED";
                break;
            case BottomSheetBehavior.STATE_HIDDEN:
                s = "STATE_HIDDEN";
                break;
            case BottomSheetBehavior.STATE_SETTLING:
                s = "STATE_SETTLING";
                break;
            default:
                s = "UNKNOWN";
                break;
        }
        return s + '(' + state + ')';
    }
    
    private static boolean isBottomSheetExpanded(
            @NonNull
                    BottomSheetBehavior bottomSheetBehavior)
    {
        return bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED;
    }
    
    private void bottomSheetMapExpand()
    {
        mGroupBottomSheetFiller.setVisibility(View.VISIBLE);
        int peekHeightPx = getResources().getDimensionPixelSize(R.dimen.home_bottom_sheet_map_peek_height);
        mBottomSheetMapBehavior.setPeekHeight(peekHeightPx);
        mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
        mBottomSheetMapBehavior.setHideable(false);
    }
    
    private void bottomSheetMapCollapse()
    {
        mGroupBottomSheetFiller.setVisibility(View.VISIBLE);
        int peekHeightPx = getResources().getDimensionPixelSize(R.dimen.home_bottom_sheet_map_peek_height);
        mBottomSheetMapBehavior.setPeekHeight(peekHeightPx);
        mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
        mBottomSheetMapBehavior.setHideable(false);
    }
    
    private void bottomSheetMapHide()
    {
        mBottomSheetMapBehavior.setHideable(true);
        mBottomSheetMapBehavior.setPeekHeight(0);
        mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
        mGroupBottomSheetFiller.setVisibility(View.GONE);
    }
    
    0 讨论(0)
提交回复
热议问题