zoukankan      html  css  js  c++  java
  • Android 上滑上拉菜单SlidingDrawer 不全屏显示的方法

    这里来说一个已经被废弃的SlidingDrawer.. 他可以实现上拉,下拉的菜单。 但是有个问题就是上拉以后,是全屏显示的。

    首先 写一个布局:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#eeeeee"
        tools:context="com.wingsofts.slidingdrawer.MainActivity">
    <SlidingDrawer
        android:content="@+id/content"
        android:handle="@+id/handle"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/handle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <View
            android:id="@+id/content"
            android:background="#ac2d9a"
            android:layout_width="match_parent"
            android:layout_height="300dp"/>
    </SlidingDrawer>
    </RelativeLayout>
    

    然后运行效果是这样的:
    这里写图片描述

    诶。。怎么不对!!! 我菜单写的高度是300啊。。
    然后试试wrap_content,还是不行。。
    那么该怎么办呢。。。 stackoverflow上面有大神给出了答案。
    即:重写SlidingDrawer的onMeasure方法,让他支持wrap_content;

    新建类如下:

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.SlidingDrawer;
    
    
    public class WrappingSlidingDrawer extends SlidingDrawer {
    
        public WrappingSlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
    
            int orientation = attrs.getAttributeIntValue("android", "orientation", ORIENTATION_VERTICAL);
            mTopOffset = attrs.getAttributeIntValue("android", "topOffset", 0);
            mVertical = (orientation == SlidingDrawer.ORIENTATION_VERTICAL);
        }
    
        public WrappingSlidingDrawer(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            int orientation = attrs.getAttributeIntValue("android", "orientation", ORIENTATION_VERTICAL);
            mTopOffset = attrs.getAttributeIntValue("android", "topOffset", 0);
            mVertical = (orientation == SlidingDrawer.ORIENTATION_VERTICAL);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    
            int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
            int widthSpecSize =  MeasureSpec.getSize(widthMeasureSpec);
    
            int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
            int heightSpecSize =  MeasureSpec.getSize(heightMeasureSpec);
    
            if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) {
                throw new RuntimeException("SlidingDrawer cannot have UNSPECIFIED dimensions");
            }
    
            final View handle = getHandle();
            final View content = getContent();
            measureChild(handle, widthMeasureSpec, heightMeasureSpec);
    
            if (mVertical) {
                int height = heightSpecSize - handle.getMeasuredHeight() - mTopOffset;
                content.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, heightSpecMode));
                heightSpecSize = handle.getMeasuredHeight() + mTopOffset + content.getMeasuredHeight();
                widthSpecSize = content.getMeasuredWidth();
                if (handle.getMeasuredWidth() > widthSpecSize) widthSpecSize = handle.getMeasuredWidth();
            }
            else {
                int width = widthSpecSize - handle.getMeasuredWidth() - mTopOffset;
                getContent().measure(MeasureSpec.makeMeasureSpec(width, widthSpecMode), heightMeasureSpec);
                widthSpecSize = handle.getMeasuredWidth() + mTopOffset + content.getMeasuredWidth();
                heightSpecSize = content.getMeasuredHeight();
                if (handle.getMeasuredHeight() > heightSpecSize) heightSpecSize = handle.getMeasuredHeight();
            }
    
            setMeasuredDimension(widthSpecSize, heightSpecSize);
        }
    
        private boolean mVertical;
        private int mTopOffset;
    }

    这里,再把Slidingdrawer外面包裹一个LinearLayout,再把其高度设置为wrap_content即可,注意android:gravity=”bottom”。

    修改后的布局文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#eeeeee"
        tools:context="com.wingsofts.slidingdrawer.MainActivity">
        <LinearLayout
            android:gravity="bottom"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <com.wingsofts.slidingdrawer.WrappingSlidingDrawer
                android:content="@+id/content"
                android:handle="@+id/handle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                <Button
                    android:id="@+id/handle"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <LinearLayout
    
                    android:id="@+id/content"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
                    <View
                        android:background="#ac2d9a"
                        android:layout_width="match_parent"
                        android:layout_height="300dp"/>
                </LinearLayout>
    
            </com.wingsofts.slidingdrawer.WrappingSlidingDrawer>
        </LinearLayout>
    
    </RelativeLayout>
    

    大功告成!! 看效果:
    这里写图片描述

    stackoverflow链接:http://stackoverflow.com/questions/3654492/android-can-height-of-slidingdrawer-be-set-with-wrap-content/4265553#4265553

  • 相关阅读:
    ie的bug及兼容性
    解决多次include后全局变量global失效的问题
    针对MYISAM表锁的解决方案(转)
    解决二进制文件冲突
    linux基本命令(1) 开关机操作
    子网掩码(NETMASK),ip地址,默认网关
    linux中常见设备对照表
    解决base64通过http传输后+变空格的问题
    mysql 查询某值是否存在于某结果集或表中
    laravel 报错 No query results for model
  • 原文地址:https://www.cnblogs.com/muyuge/p/6333540.html
Copyright © 2011-2022 走看看