Android 4.0冰淇林三明治系统已经推出有一段时间了,这次推出的系统在UI上有了很大的提升,摆脱了以前那种难看的土鳖界面,我做了一个类似Android 4.0效果的弹出框,可以在非4.0系统上有类似4.0效果的风格,有两种风格,拿出来分享 一下。首先看下效果图:

这是选择对话框,一般在退出或做选择操作时用到,另一个是列表选择框,效果如图:

下面就来看下是如何实现这个效果的:
首先在res/values/colors.xml下添加颜色属性:
<color name="grey_black">#2E2E2E</color> //这是对话框后的黑灰色背景
<color name="main_color">#097dad</color> //这是显示的蓝色字体和横条的颜色
然后在drawable下新建dialog_btn_selector.xml并添加代码:
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true"
android:drawable="@drawable/main_color" />
<item android:state_pressed="true"
android:drawable="@drawable/main_color" />
<item android:drawable="@color/grey_black" />
</selector>
这个的主要作用是用来声明当按钮按下时的效果。
接下来就是整个dialog的布局了,我这里做了以上两种效果,用的是一个layout文件,不同的显示布局是根据传入的参数设置了控件的visible属性,具体请参照代码:
alertdialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="23dp"
android:layout_marginRight="23dp"
android:background="@color/grey_black"
android:orientation="vertical" >
<TextView
android:id="@+id/alert_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:singleLine="true"
android:layout_marginTop="8dp"
android:textColor="@color/main_color"
android:textSize="18sp" />
<View
android:layout_width="fill_parent"
android:layout_height="3dp"
android:layout_marginTop="8dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@color/main_color" />
<TextView
android:id="@+id/alert_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="22dp"
android:layout_marginBottom="22dp"
android:visibility="gone"
android:textColor="@android:color/white"
android:textSize="15sp" />
<ListView
android:id="@+id/lv_alert_dialog"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:visibility="gone"
android:cacheColorHint="#00000000" />
<View
android:layout_width="fill_parent"
android:layout_height="0.5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@color/grey" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
>
<TextView
android:id="@+id/btn_confirm"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/dialog_btn_selector"
android:gravity="center"
android:text="YES"
android:layout_weight="1"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:textSize="15sp"
android:textStyle="bold" />
<View
android:id="@+id/line"
android:layout_width="0.5dp"
android:layout_height="fill_parent"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="@color/grey" />
<TextView
android:id="@+id/btn_cancel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/dialog_btn_selector"
android:gravity="center"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:layout_weight="1"
android:layout_marginRight="5dp"
android:layout_marginLeft="5dp"
android:text="NO"
android:textSize="15sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
还有一个布局文件simple_item.xml是当选择使用列表选择时listview的item布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/dialog_btn_selector"
android:orientation="horizontal" >
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/tv_txt"
android:textSize="15sp"
android:layout_margin="13dp"/>
</LinearLayout>
布局完成后实现代码如下:
AlertDialogUtil.java
package com.ericssonlabs.alertdialog;
import android.app.AlertDialog;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.ericssonlabs.R;
/**
* Custom alert dialog
* @author Ryan
*/
public class AlertDialogUtil {
private Context context;
private String title;
private String content;
private AlertDialog alertDialog;
private OnClickListener confrimClickListener;
private OnClickListener cancelClickListener;
private boolean isText = true;
private BaseAdapter baseAdapter;
private OnItemClickListener onItemClickListener;
private TextView btn_confirm;
private TextView btn_cancel;
private String confrimText;
private String cancelText;
private Window window;
/**
* Constructor
* @param context
*/
public AlertDialogUtil(Context context){
this.context = context;
alertDialog = new AlertDialog.Builder(this.context).create();
alertDialog.show();
window = alertDialog.getWindow();
window.setContentView(R.layout.alertdialog);
btn_confirm = (TextView)window.findViewById(R.id.btn_confirm);
btn_cancel = (TextView)window.findViewById(R.id.btn_cancel);
}
/**
* set title for alert dialog
* @param title
*/
public void setTitle(String title){
this.title = title;
}
/**
* set content for alert dialog
* @param content
*/
public void setContent(String text){
this.content = text;
}
/**
* set list view for alert dialog
* @param content
*/
public void setContent(BaseAdapter listAdapter,OnItemClickListener itemClickListener){
isText = false;
this.baseAdapter = listAdapter;
this.onItemClickListener = itemClickListener;
}
/**
* set title for alert dialog
* @param titleId
*/
public void setTitle(int titleId){
this.title = context.getString(titleId);
}
/**
* set content for alert dialog
* @param contentId
*/
public void setContent(int contentId){
this.content = context.getString(contentId);
}
public void show(){
TextView tv_title = (TextView)window.findViewById(R.id.alert_title);
ListView lv_items = (ListView) window.findViewById(R.id.lv_alert_dialog);
TextView tv_content = (TextView)window.findViewById(R.id.alert_content);
tv_title.setText(title);
if (isText) {
tv_content.setVisibility(View.VISIBLE);
tv_content.setText(content);
}else {
View lineView = window.findViewById(R.id.line);
lineView.setVisibility(View.GONE);
btn_cancel.setVisibility(View.GONE);
lv_items.setVisibility(View.VISIBLE);
lv_items.setAdapter(baseAdapter);
lv_items.setOnItemClickListener(onItemClickListener);
}
}
/**
* set listener for the confirm button
* @param cancelClickListener
*/
public void setCancelClickListener(String cancelText,OnClickListener cancelClickListener){
this.cancelText = cancelText;
btn_cancel.setText(this.cancelText);
this.cancelClickListener = cancelClickListener;
btn_cancel.setOnClickListener(this.cancelClickListener);
}
/**
* set listener for the cancel button
* @param confrimClickListener
*/
public void setConfirmClickListener(String confrimText,OnClickListener confrimClickListener){
this.confrimClickListener = confrimClickListener;
this.confrimText = confrimText;
btn_confirm.setText(this.confrimText);
btn_confirm.setOnClickListener(this.confrimClickListener);
}
/**
* dismiss the alert dialog
*/
public void cancel(){
alertDialog.cancel();
}
}
最后是使用该自定义控件的代码:
package com.ericssonlabs.alertdialog;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import com.ericssonlabs.BaseActivity;
import com.ericssonlabs.R;
import com.ericssonlabs.toast.ToastUtil;
public class AlertDialogActivity extends BaseActivity implements OnClickListener{
private Button showButton;
private Button showButton2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alertdialog_layout);
setTopTitle(this,getString(R.string.alertdialog));
showButton = (Button) this.findViewById(R.id.btn_show_alert);
showButton2 = (Button) this.findViewById(R.id.btn_show_alert1);
showButton.setOnClickListener(this);
showButton2.setOnClickListener(this);
setBackButton(this, new OnClickListener() {
@Override
public void onClick(View v) {
AlertDialogActivity.this.finish();
}
});
}
AlertDialogUtil alertDialogUtil;
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_show_alert:
alertDialogUtil = new AlertDialogUtil(AlertDialogActivity.this);
alertDialogUtil.setTitle("Title");
alertDialogUtil.setContent("Do you want to exit?");
alertDialogUtil.setConfirmClickListener("OK",new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ToastUtil.show(AlertDialogActivity.this, "Test alert dialog!");
alertDialogUtil.cancel();
}
});
alertDialogUtil.setCancelClickListener("NO",new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
alertDialogUtil.cancel();
}
});
alertDialogUtil.show();
break;
case R.id.btn_show_alert1:
alertDialogUtil = new AlertDialogUtil(AlertDialogActivity.this);
alertDialogUtil.setTitle("Title");
ArrayList<String> list = new ArrayList<String>();
list.add("Item-1");
list.add("Item-2");
list.add("Item-3");
alertDialogUtil.setContent(new DialogItemAdapter(AlertDialogActivity.this,list),new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
switch (position) {
case 0:
ToastUtil.show(AlertDialogActivity.this, "Alert dialog");
alertDialogUtil.cancel();
break;
case 1:
ToastUtil.show(AlertDialogActivity.this, "Alert dialog");
alertDialogUtil.cancel();
break;
case 2:
ToastUtil.show(AlertDialogActivity.this, "Alert dialog");
alertDialogUtil.cancel();
break;
default:
break;
}
}
});
alertDialogUtil.setConfirmClickListener("Cancel",new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
alertDialogUtil.cancel();
}
});
alertDialogUtil.show();
break;
default:
break;
}
}
class DialogItemAdapter extends BaseAdapter{
private Context context;
private List<String> list;
public DialogItemAdapter(Context context,List<String> list){
this.context = context;
this.list = list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.simple_item, null);
viewHolder.textView = (TextView) convertView.findViewById(R.id.tv_txt);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder)convertView.getTag();
}
viewHolder.textView.setText(list.get(position));
return convertView;
}
}
private class ViewHolder{
private TextView textView;
}
}
以上就实现了类似4.0效果的对话框,代码写的不是很完善,希望大家共同来改进,后续我会陆续制作一套4.0效果的UI库,另外,可以在这些效果的基础上进行定制,比如一下效果是我在另一个项目中用到的样式:

下面这个是经过定制的Dialog。

有不足之处,还望大家一起来帮助改进,欢迎通过新浪微博和我交流:唐韧_Ryan
分享到:
相关推荐
ISC DHCP是Internet Systems Consortium开发的一个开源DHCP服务器,广泛应用于各种网络环境中,包括企业、教育和家庭网络。在本安装包“isc dhcp-4.4.3”中,我们将深入探讨该版本的功能、安装过程以及配置方法。 ...
《深入解析ISC DHCP 4.3.1源代码》 ISC DHCP(Internet Systems Consortium Dynamic Host Configuration Protocol)是一款广泛应用于Linux环境的开源DHCP服务器软件,它为网络中的设备自动分配IP地址、DNS服务器、...
ISC DHCP 4.0 的选项配置是其核心组成部分之一,通过定义特定的选项,可以定制化的向客户端提供必要的网络信息和服务详情。 #### 二、DHCP 选项声明与数据类型 ##### 2.1 选项声明 在 ISC DHCP 配置文件中,选项...
2013年ISC互联网安全大会上,肖梓航先生在安天实验室的演讲中对Android平台的安全问题进行了深入的探讨。他提到了两个主要的技术趋势:一是1DAY问题和设备商代码成为提权漏洞的新来源,二是系统和框架漏洞大量出现,...
【标题】"ISC2019.rar"是一个压缩文件,其中包含了2019年ISC(互联网安全大会)的相关资料。这个大会是中国乃至全球网络安全领域的重要活动,每年都会吸引众多专家、学者和从业人员参与,讨论最新的网络安全趋势、...
【标题】"isc海康平台测试工具,对接API的"涉及到的主要知识点是API接口测试以及与海康平台的集成。 API(Application Programming Interface)接口是软件系统之间进行交互的一种方式,它定义了不同应用程序间数据...
本文将深入探讨标题"Isc.zip_PV and IV_PV curve_isc 光伏_光伏 matlab_光伏板"所涵盖的知识点。 首先,Isc指的是短路电流(Short-Circuit Current),这是光伏电池在没有外部负载时,即电压为0时,能够产生的最大...
支持现已发布且具备 API 网关的 iSC 平台(1.1.0-1.3.0)的 Http-OpenAPI 接口调用; 支持 http/https 协议的接口调用; 依赖.net 4.5 环境; 支持图片相关接口的调用(获取门禁事件的图片、查询车辆抓拍图片、人脸应用...
iSC-OpenAPI接口测试工具是一款专为测试海康接口设计的应用程序,它提供了一种高效、便捷的方式来验证和调试海康设备或系统的API接口功能。接口测试在IT行业中至关重要,因为它确保了不同系统间的通信顺畅,特别是...
《isc-dhcp-server配置详解与应用》 isc-dhcp-server是一款广泛应用的动态主机配置协议(DHCP)服务器软件,主要用于自动分配、管理和回收网络设备的IP地址。它支持IPv4和IPv6,使得网络管理员能够高效地管理网络...
综合安防管理平台通过接入视频监控、一卡通、停车场、报警检测等系统的设备,获取边缘节点数据,实现安防信息化集成与联动。支持视频应用服务开放,一卡通应用服务开放,停车场应用服务开放,资源目录服务开放,事件...
### ISC DHCP 4.0 Configuration File (dhcpd.conf) #### 概述 本文将详细介绍ISC DHCP 4.0服务器配置文件`dhcpd.conf`的主要功能、语法结构以及关键配置项。`dhcpd.conf`文件是ISC DHCP服务器的核心配置文件,...
《海康isc配置手册》是针对Hikvision海康iSecure center综合安防管理平台的一份详细配置指南。这份文档深入浅出地介绍了如何有效管理和配置这个先进的安防系统,旨在帮助用户充分利用其功能,确保区域安全,高效管理...
英飞凌的ISC080N10NM6是一款高性能的N沟道MOSFET,属于OptiMOSTM 6功率晶体管系列,适用于100V的工作电压环境。这款芯片具有诸多突出特点,使其在高频率开关和同步整流应用中表现出色。 首先,该MOSFET拥有极低的导...
【标题】:“国外著名ISC的开源购物车系统” 在IT领域,开源软件是推动技术进步的重要力量,尤其在电子商务行业中,开源购物车系统为商家提供了灵活、可定制且成本效益高的解决方案。标题提及的“国外著名ISC的开源...
海康iSecureCenter平台SDK对接准备工作文档。 对接前需要先部署海康威视综合安防管理平台 iSecure Center V1.1.0或更高版本的平台,并且安装API网关组件确保API服务运行正常。 API网关服务的运行状况可以在运管...
根据提供的文件信息,可以看出这本书是关于CCSP (Certified Cloud Security Professional)官方认证的实践测试指南,由(ISC)²(国际信息系统安全认证协会)官方发布。本书的主要目的是帮助准备参加CCSP考试的专业...
【标题】"ISC2015_闭幕-全球互联网安全精英峰会"指的是2015年举办的国际安全大会(Internet Security Conference,简称ISC)的闭幕式活动,这是一个聚焦全球互联网安全领域的顶级盛会,汇聚了众多业界精英,旨在探讨...
ISC提供了两种功能齐全、开源、符合标准的DHCP服务器发行版:Kea DHCP和ISC DHCP。Kea包含了所有最常请求的功能,它更新得较新,并且专为更现代的网络环境而设计。ISC在2022年宣布了旧的ISC DHCP系统的生命周期结束...
以下是基于所提供的文件内容,针对ISC200电磁式电导率计及其ISC40感应式电导率传感器的详细技术知识点介绍。 1. 电磁式电导率计的工作原理 电磁式电导率计通过测量溶液对交流电流的电导率来评估溶液中离子的浓度。...