效果图:
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) {
}
});