底部菜单实现(Dialog方案)

项目中经常会要实现在屏幕底部弹出一个窗口,比如一个分享窗口:

下面详解实现步骤:

1.定义布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:background="@color/white"
              android:gravity="center_horizontal"
              android:orientation="vertical">

    <com.piston.usedcar.widget.KiloPiker
        android:id="@+id/kp_car_grad"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"/>

    <TextView
        android:id="@+id/tv_sel_car_grad"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/theme_gray_bg"
        android:gravity="center"
        android:padding="@dimen/common_padding_less"
        android:text="确定"
        android:textColor="@color/theme_gray_text"
        android:textSize="@dimen/text_small"/>
</LinearLayout>

2.定义从底部弹出的动画

  a.弹出动画dialog_enter.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
           android:duration="300"
           android:fromYDelta="100%p">
</translate>

  b.退出动画dialog_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
           android:duration="300"
           android:toYDelta="100%p">
</translate>

 

3.在styles.xml定义动画样式

    <style name="MyDialogAnimationStyle" parent="android:Animation">
        <item name="@android:windowEnterAnimation">@anim/dialog_enter</item>
        <item name="@android:windowExitAnimation">@anim/dialog_exit</item>
    </style>

4.防止dialog有边距,以便dialog填充整个屏幕宽度,定义如下样式:

<style name="common_dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
</style>

5.代码实现:

        View view = LayoutInflater.from(AppContext.getContext()).inflate(R.layout.dialog_bottom_car_grad, null);
        final Dialog dialog = new Dialog(this, R.style.common_dialog);
        dialog.setContentView(view);
        dialog.getWindow().setWindowAnimations(R.style.MyDialogAnimationStyle);
        dialog.show();

        final KiloPiker kpCarGrad = (KiloPiker) view.findViewById(R.id.kp_car_grad);
        TextView mViewPengyou = (TextView) view.findViewById(R.id.tv_sel_car_grad);

        kpCarGrad.setNumberPickerDividerColor(kpCarGrad, R.color.background_split);

        kpCarGrad.setDisplayedValues(CAR_GRAD_ARRAY);
        kpCarGrad.setMaxValue(CAR_GRAD_ARRAY.length - 1);
        kpCarGrad.setMinValue(0);

        kpCarGrad.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
            @Override
            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
                carGradSelPos = newVal;
            }
        });

        mViewPengyou.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (carGradSelPos == 0) {
                    tvSynthCarGrad.setText("优秀车况");
                } else if (carGradSelPos == 1) {
                    tvSynthCarGrad.setText("良好车况");
                }
                dialog.dismiss();
            }
        });


        // 设置相关位置,一定要在 show()之后
        Window window = dialog.getWindow();
        window.getDecorView().setPadding(0, 0, 0, 0);
        WindowManager.LayoutParams params = window.getAttributes();
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.gravity = Gravity.BOTTOM;
        window.setAttributes(params);

 

  

posted @ 2016-11-17 19:32  zhuxian300c  阅读(1226)  评论(0编辑  收藏  举报