自定义对话框:带有下拉选择控件

效果图:

1.添加依赖:

因为对话框使用了android.support.v7.widget.CardView

 compile 'com.android.support:cardview-v7:26.+'

2.对话框xml布局:

为了给spinner添加样式,所以在其外层添加了一层样式。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"
    app:cardCornerRadius="10dp">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:gravity="center"
            android:background="@color/app_white">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="80dp"
                android:text="编辑信息"
                android:gravity="center"
                android:textColor="#5c7599" />
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="@color/app_gray"/>

            <LinearLayout
                android:gravity="center_vertical"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:padding="10dp"
                android:layout_marginTop="26dp"
                android:layout_marginBottom="15dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp">
                <TextView
                    android:layout_width="70dp"
                    android:layout_height="wrap_content"
                    android:text="科目"
                    android:gravity="right"
                    android:textColor="#5c7599" />
                <RelativeLayout
                    android:background="@drawable/bg_edit_blue"
                    android:layout_marginLeft="10dp"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content">
                    <Spinner
                        android:id="@+id/spinner_subject_type"
                        android:spinnerMode="dropdown"
                        android:gravity="right"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"/>
                </RelativeLayout>
            </LinearLayout>
            <LinearLayout
                android:gravity="center_vertical"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:padding="10dp"
                android:layout_marginTop="15dp"
                android:layout_marginBottom="15dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp">
                <TextView
                    android:layout_width="70dp"
                    android:layout_height="wrap_content"
                    android:text="人数"
                    android:gravity="right"
                    android:textColor="#5c7599" />
                <EditText
                    android:id="@+id/ed_quantity"
                    android:layout_marginLeft="10dp"
                    android:layout_width="match_parent"
                    android:layout_height="40dp"
                    android:paddingLeft="5dp"
                    android:textColor="@color/app_black"
                    android:background="@drawable/bg_edit_blue"/>
            </LinearLayout>
            <View
                android:layout_width="match_parent"
                android:layout_height="0.5dp"
                android:background="@color/app_gray"/>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
                <TextView
                    android:background="@color/app_white"
                    android:id="@+id/btn_cancel"
                    android:textSize="16sp"
                    android:textColor="@color/app_main"
                    android:gravity="center"
                    android:padding="10dp"
                    android:layout_width="0dp"
                    android:layout_height="50dp"
                    android:layout_weight="1"
                    android:text="取消"/>
                <View
                    android:layout_width="0.2dp"
                    android:layout_height="match_parent"
                    android:background="@color/app_line"/>
                <TextView
                    android:background="@color/app_main"
                    android:id="@+id/btn_sure"
                    android:textSize="16sp"
                    android:textColor="@color/app_white"
                    android:gravity="center"
                    android:padding="10dp"
                    android:layout_width="0dp"
                    android:layout_height="50dp"
                    android:layout_weight="1"
                    android:text="确定"/>
            </LinearLayout>
        </LinearLayout>
    </ScrollView>

</android.support.v7.widget.CardView>

3.对话框样式:

这个地方特别要注意,样式的选择会影响spinner的样式,我就在这个地方中了坑。
特别注意“android:Theme.DeviceDefault.Light.Dialog”的选择,如果使用“android:Theme.Dialog”,则spinner的样式就是这样滴:

 <style name="edit_dialog" parent="android:Theme.DeviceDefault.Light.Dialog">
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">false</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:backgroundDimAmount">0.4</item>
    </style>

4.对话框代码:

因为使用的是onCreate,则对话框必须show后才能进行操作;如果在构造函数里就直接Initview的话,则不需要区分先后顺序。

public class EditInfoDialog extends Dialog {


    @BindView(R.id.spinner_subject_type)
    Spinner spinnerSubjectType;
    @BindView(R.id.ed_quantity)
    EditText edQuantity;
    @BindView(R.id.btn_cancel)
    TextView btnCancel;
    @BindView(R.id.btn_sure)
    TextView btnSure;

    public EditInfoDialog(Context context) {
        super(context, R.style.edit_dialog);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_editinfo);
        setCanceledOnTouchOutside(false);
        ButterKnife.bind(this);
    }

    public void setBtnSure(View.OnClickListener listener) {
        btnSure.setOnClickListener(listener);
    }

    public void setBtnCancel(View.OnClickListener listener) {
        btnCancel.setOnClickListener(listener);
    }

    public Spinner getSpinnerSubjectType() {
        return spinnerSubjectType;
    }

    public EditText getEdQuantity() {
        return edQuantity;
    }

    public void setEdQuantity(String text) {
        this.edQuantity.setText(text);
    }

}

5.主界面使用方法和spinner数据源设置:

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.tv_show_dialog)
    TextView tvShowDialog;

    private EditInfoDialog editInfoDialog;
    private String subjectType = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    /**
     * 编辑此样品信息
     *
     */
    public void editInfo() {
        if (editInfoDialog == null) {
            editInfoDialog = new EditInfoDialog(MainActivity.this);
        }
        editInfoDialog.show();
        //科目选择下拉框
        initSubjectTypeSpinner();
        //数量
        editInfoDialog.setEdQuantity("9");
        editInfoDialog.setBtnSure(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                editInfoDialog.dismiss();
            }
        });
        editInfoDialog.setBtnCancel(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                editInfoDialog.dismiss();
            }
        });
    }

    /**
     * 初始化下拉框
     *
     */
    private void initSubjectTypeSpinner() {
        final ArrayList<String> subjectTypeList = new ArrayList<>();//数据源数组
        for (int i = 0; i < 9; i++) {
            subjectTypeList.add( i +"科目");
        }
        ArrayAdapter<String> sp_adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1);
        sp_adapter.addAll(subjectTypeList);
        sp_adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
        editInfoDialog.getSpinnerSubjectType().setAdapter(sp_adapter);
        editInfoDialog.getSpinnerSubjectType().setSelection(2);//默认显示第三个数据,从0开始
        editInfoDialog.getSpinnerSubjectType().setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                subjectType = subjectTypeList.get(position);//获取选择的数据
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
    }

    @OnClick(R.id.tv_show_dialog)
    public void onViewClicked() {
        editInfo();
    }
}

补充:

1.按屏幕比例缩放对话框的宽高

// 将对话框的大小按屏幕大小的百分比设置
        WindowManager m = getWindow().getWindowManager();
        Display d = m.getDefaultDisplay();
        final WindowManager.LayoutParams p = getWindow().getAttributes();
        p.height = (int) (d.getHeight() * 0.8);
        p.width = (int) (d.getHeight() * 0.8);
        getWindow().setAttributes(p);

此时的布局文件xml中的最外层父控件宽高则:

android:layout_height="match_parent"
    android:layout_width="match_parent"

2.设置spinner未展开时的文字样式:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                        @Override
                        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                            TextView tv = (TextView) view;                            tv.setTextColor(Color.parseColor("#317eeb"));
                            tv.setTextSize(16);                            
                        }

                        @Override
                        public void onNothingSelected(AdapterView<?> parent) {

                        }
                    });
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值