【Android】自定义风格的各种dialog

项目里用到了很多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的方法是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值