项目里用到了很多dialog,一开始没有确定UI风格的时候查资料用了一个很方便的AlertDialog,参考这篇文章http://blog.csdn.net/chenlei1889/article/details/6267406 非常简单好用
然后前天美工给了份新的UI,本来想通过该theme修改对话框的模式,但是查到的资料自己写了就是没用,而且基本都是复制粘贴都一样的。title和button都改不了,后面看了下源码发现好像AlertDialog把能有的几项写死了改不了,可以看这里:http://blog.csdn.net/lilu_leo/article/details/8221423 写的比较……反正自己看就是,昨晚看的时候很晕,也不是很明白。
其实AlertDialog应该可以通过setView的方法改,参考这篇:http://www.cnblogs.com/511mr/archive/2011/10/21/2220253.html
不过这些在Dialog中就可以实现,我觉得AlertDialog比较强大的地方就是它提供了很多很简单就能实现的方法,比如setSingleChoiceItems,如果用setView的方式的话直接用Dialog就行了,而且Dialog可以修改自己的theme,修改起来更加自由。
项目里改写的主要是简单弹出框,输入框和一个单选框。思路很简单,先在一个xml文件里定义一个希望dialog显示的view,然后在弹出的dialog里加载这个view,获取上面的button加onClickListen事件。
一、dialog的theme修改
<style name="mydialog" parent="@android:style/Theme.Dialog">
<span style="white-space:pre"> </span><item name="android:windowNoTitle">true</item>
</style>
去掉了默认的title,因为这个title在view里设计了,这样可以自由一点
二、view设计
写个单选框好了,简单的提示框和输入框就不写了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/dialogtitle">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请选择**"
android:textColor="@color/white"
android:textSize="17sp"
android:paddingLeft="15sp"
android:paddingTop="10sp"
/>
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="180sp" >
<RadioGroup
android:id="@+id/withScrollselectradio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/dialogback"
android:orientation="vertical">
</RadioGroup>
</ScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/dialogbottom"
android:gravity="center|center_vertical">
<Button
android:id="@+id/withScrollpositive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确 定"
android:textColor="@color/white"
android:background="@drawable/positivebutton" />
<View
android:layout_width="10sp"
android:layout_height="20sp"
android:background="@null" />
<Button
android:id="@+id/withScrollnegative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取 消"
android:textColor="@color/white"
android:background="@drawable/negativebutton" />
</LinearLayout>
</LinearLayout>
这是带ScrollView的单选框,这里定死了ScrollView的高度,否则RadioButton多的话会看不到最下面确认和取消的两个Button,而且太长了界面会很难看。但是如果定死的话中间RadioGroup的高度不到ScrollView的高度就会空着一块很难看,我懒得研究ScrollView的方法直接写了一个不带ScrollView的View在Activity里判断加载不同的View
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/dialogtitle">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请选择**"
android:textColor="@color/white"
android:textSize="17sp"
android:paddingLeft="15sp"
android:paddingTop="10sp"
/>
</LinearLayout>
<RadioGroup
android:id="@+id/selectradio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/dialogback"
android:orientation="vertical">
</RadioGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/dialogbottom"
android:gravity="center|center_vertical">
<Button
android:id="@+id/positive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确 定"
android:textColor="@color/white"
android:background="@drawable/positivebutton" />
<View
android:layout_width="10sp"
android:layout_height="20sp"
android:background="@null" />
<Button
android:id="@+id/negative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取 消"
android:textColor="@color/white"
android:background="@drawable/negativebutton" />
</LinearLayout>
</LinearLayout>
这是不带ScrollView的View
在Activity里要根据具体情况在RadioGroup里添加数量不定的RadioButton,所以还要定一个RadioButton的View
<?xml version="1.0" encoding="utf-8"?>
<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/radiobutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/dialogcontext"
android:button="@null"
android:textColor="@color/white" />
background什么的都可以自定义,实现自己想要的样子
三、dialog显示
1、弹出框
// 退出程序前的确认窗口
private void finishDialog() {
// 获取Dialog
final Dialog exitDialog = new Dialog(self,R.style.mydialog);
// 给Dialog设定View,这里和AlertDialog的方法不同
exitDialog.setContentView(R.layout.exitdialog);
// 获取Button并设定点击事件
Button positiveButton = (Button)exitDialog.findViewById(R.id.exitpositive);
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "system close");
exitDialog.dismiss();
self.finish();
}
});
Button negativeButton = (Button)exitDialog.findViewById(R.id.exitnegative);
negativeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
exitDialog.dismiss();
}
});
// 显示
exitDialog.show();
}
方法和AlertDialog的有些不同,另外Button的获取要用当前Dialog的findViewById
2、输入框
private void ipDialog() {
final Dialog ipinputDialog = new Dialog(self,R.style.mydialog);
ipinputDialog.setContentView(R.layout.ipdialog);
final EditText editText = (EditText)ipinputDialog.findViewById(R.id.ipdialog);
editText.setText("我咋知道输入啥");
Button button1 = (Button)ipinputDialog.findViewById(R.id.ippositive);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 实现方法
ipinputDialog.dismiss();
});
Button button2 = (Button)ipinputDialog.findViewById(R.id.ipnegative);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ipinputDialog.dismiss();
}
});
ipinputDialog.show();
}
很简单……
3、单选框
private void targetSelect() {
targetNum = preferences.getInt("targetnum", 5);
final Dialog targetSelectDialog = new Dialog(self,R.style.mydialog);
Button positiveButton;
Button negativeButton;
RadioGroup radioGroup;
// 当插入的目标条目多余6时用滑动条
if(targetNum >= 6){
targetSelectDialog.setContentView(R.layout.targetselectwithscroll);
positiveButton = (Button)targetSelectDialog.findViewById(R.id.targetwithScrollpositive);
negativeButton = (Button)targetSelectDialog.findViewById(R.id.targetwithScrollnegative);
radioGroup = (RadioGroup)targetSelectDialog.findViewById(R.id.targetwithScrollselectradio);
}
else{
targetSelectDialog.setContentView(R.layout.targetselect);
positiveButton = (Button)targetSelectDialog.findViewById(R.id.targetpositive);
negativeButton = (Button)targetSelectDialog.findViewById(R.id.targetnegative);
radioGroup = (RadioGroup)targetSelectDialog.findViewById(R.id.targetselectradio);
}
// 用一个tmpTarget实现点击取消Button时nowTarget不会被修改
tmpTarget = nowTarget;
for (Integer i = 1; i <= targetNum; i++) {
//通过inflater找到
RadioButton tempButton = (RadioButton)LayoutInflater.from(this).inflate(R.layout.targetradio, null);
tempButton.setText(i.toString());
// 这里设id是为了等下找起来方便,在onCheckedChanged里
tempButton.setId(i);
// 设定初始选定值
if(nowTarget == i){
tempButton.setChecked(true);
}
radioGroup.addView(tempButton);
}
// 这里的checkedId和AlertDialog的单选框里的不一样,那个id是0到n-1,这里直接就是刚刚设定的id,像刚刚设定的就是1到n
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId > 0) {
tmpTarget = checkedId;
}
}
});
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 点击确认的时候更新nowTarget,如果是点击取消则不点击
Integer oldTarget = nowTarget;
nowTarget = tmpTarget;
Log.i(TAG, "set target from " + oldTarget.toString() + " to " + nowTarget.toString());
// 自定义需要做的
targetSelectDialog.dismiss();
}
});
negativeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
targetSelectDialog.dismiss();
}
});
targetSelectDialog.show();
}
这个复杂一点,加入了一个ScrollView,当条目超过一定量的时候就开始滑动,我觉得应该有更好的实现方法而不是通过判断加载不同的View,不过我懒得查了,而且这样写起来也很简单,就是可读性差了点
单选框用RadioGroup实现,如果是多选框的话可能逻辑要变下,加载View的方法是一样的