正常情况下我们可以直接在dialog里写上我们想要的view,但是有时候view太多的话,我们就需要自定义一个dialog,其实就是将dialog的内容替换为我们写好的layout文件。
因为我用Jetpack开发,所以操作都是在Fragment中完成。
比如我创建了一个layout文件:
<!-- 这个文件名是allclasstime.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<Spinner
android:id="@+id/week"
android:layout_width="135dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:entries="@array/week" />
<!-- 其他布局就不写了 -->
</LinearLayout>
</LinearLayout>
效果如下:
为了最简单化,我只演示星期的选择就好啦。图中星期选择这个spinner的id是week
同时这个spinner的数据来自weekdata这个数组:(记住数组名,待会会经常用到)
<string-array name="weekdata">
<item>一</item>
<item>二</item>
<item>三</item>
<item>四</item>
<item>五</item>
<item>六</item>
<item>日</item>
</string-array>
现在要做的就是初始化dialog框,正常操作就是点击按钮出现dialog:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showInputDialog(); //出现dialog
}
});
然后showInputDialog()的定义如下:
void showInputDialog() {
//读取刚刚定义的allclasstime.xml文件做为view
final View view = LayoutInflater.from(getActivity()).inflate(R.layout.allclasstime, null);
//将view绑定给AlertDialog.Builder对象,并且取个标题,我这里叫“详细课程时间”
AlertDialog.Builder inputDialog = new AlertDialog.Builder(getActivity()).setTitle("详细课时间").setView(view);
//从view里获取我们的spinner
final Spinner weekS = view.findViewById(R.id.week);
//为Spinner:weekS添加适配器,creatAdapter()方法我将写在下面,
//这个方法需要传入你的spinner数据源,也就是R.array.weekdata
weekS.setAdapter(creatAdapter(R.array.weekdata));
//为Spinner:weekS添加元素选择监听事件
weekS.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//获取选择的元素,注意还要传入R.array.weekdata文件
String week = getActivity().getResources().getStringArray(R.array.weekdata)[position]; //获取选择的item内容
//输出看看
Log.d("mylog", "week:" + week);
Toast.makeText(getActivity(),"获取:"+ week,Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
creatAdapter()方法定义如下,复制即可
//参数int yourSpinnerDataXML就是你的spinner数据源如:R.array.weekdata
//如果你是在activity中使用这个方法,请把第二行的getActivity()改为context
public ArrayAdapter<CharSequence> creatAdapter(int yourSpinnerDataXML){
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
yourSpinnerDataXML,android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
return adapter;
}
看一下运行结果: