仿Android ISC 4.0效果对话框

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

仿Android ISC 4.0效果对话框_第1张图片


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


仿Android ISC 4.0效果对话框_第2张图片


下面就来看下是如何实现这个效果的:

首先在res/values/colors.xml下添加颜色属性:

[html]  view plain copy
  1. <color name="grey_black">#2E2E2E</color> //这是对话框后的黑灰色背景  
  2. <color name="main_color">#097dad</color> //这是显示的蓝色字体和横条的颜色  

然后在drawable下新建dialog_btn_selector.xml并添加代码:

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  3.       
  4.     <item android:state_focused="true"  
  5.         android:drawable="@drawable/main_color" />  
  6.       
  7.     <item android:state_pressed="true"  
  8.         android:drawable="@drawable/main_color" />  
  9.       
  10.     <item android:drawable="@color/grey_black" />  
  11. </selector>  

这个的主要作用是用来声明当按钮按下时的效果。

接下来就是整个dialog的布局了,我这里做了以上两种效果,用的是一个layout文件,不同的显示布局是根据传入的参数设置了控件的visible属性,具体请参照代码:

alertdialog.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_gravity="center"  
  6.     android:layout_marginLeft="23dp"  
  7.     android:layout_marginRight="23dp"  
  8.     android:background="@color/grey_black"  
  9.     android:orientation="vertical" >  
  10.   
  11.     <TextView  
  12.         android:id="@+id/alert_title"  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_marginLeft="8dp"  
  16.         android:layout_marginRight="8dp"  
  17.         android:singleLine="true"  
  18.         android:layout_marginTop="8dp"  
  19.         android:textColor="@color/main_color"  
  20.         android:textSize="18sp" />  
  21.   
  22.     <View  
  23.         android:layout_width="fill_parent"  
  24.         android:layout_height="3dp"  
  25.         android:layout_marginTop="8dp"  
  26.         android:layout_marginLeft="5dp"  
  27.         android:layout_marginRight="5dp"  
  28.         android:background="@color/main_color" />  
  29.   
  30.     <TextView  
  31.         android:id="@+id/alert_content"  
  32.         android:layout_width="fill_parent"  
  33.         android:layout_height="wrap_content"  
  34.         android:layout_marginLeft="8dp"  
  35.         android:layout_marginRight="8dp"  
  36.         android:layout_marginTop="22dp"  
  37.         android:layout_marginBottom="22dp"  
  38.         android:visibility="gone"  
  39.         android:textColor="@android:color/white"  
  40.         android:textSize="15sp" />  
  41.       
  42.     <ListView  
  43.         android:id="@+id/lv_alert_dialog"  
  44.         android:layout_width="fill_parent"  
  45.         android:layout_height="wrap_content"  
  46.         android:layout_marginLeft="8dp"  
  47.         android:layout_marginRight="8dp"  
  48.         android:layout_marginTop="5dp"  
  49.         android:layout_marginBottom="5dp"  
  50.         android:visibility="gone"  
  51.         android:cacheColorHint="#00000000" />  
  52.   
  53.     <View  
  54.         android:layout_width="fill_parent"  
  55.         android:layout_height="0.5dp"  
  56.         android:layout_marginLeft="5dp"  
  57.         android:layout_marginRight="5dp"  
  58.         android:background="@color/grey" />  
  59.   
  60.     <LinearLayout  
  61.         android:layout_width="fill_parent"  
  62.         android:layout_height="wrap_content"  
  63.         android:gravity="center"  
  64.         android:orientation="horizontal"  
  65.          >  
  66.   
  67.         <TextView  
  68.             android:id="@+id/btn_confirm"  
  69.             android:layout_width="fill_parent"  
  70.             android:layout_height="wrap_content"  
  71.             android:background="@drawable/dialog_btn_selector"  
  72.             android:gravity="center"  
  73.             android:text="YES"  
  74.             android:layout_weight="1"  
  75.             android:paddingTop="12dp"  
  76.             android:paddingBottom="12dp"  
  77.             android:layout_marginLeft="5dp"  
  78.             android:layout_marginRight="5dp"  
  79.             android:textSize="15sp"  
  80.             android:textStyle="bold" />  
  81.   
  82.         <View  
  83.             android:id="@+id/line"  
  84.             android:layout_width="0.5dp"  
  85.             android:layout_height="fill_parent"  
  86.             android:layout_marginTop="5dp"  
  87.             android:layout_marginBottom="5dp"  
  88.             android:background="@color/grey" />  
  89.   
  90.         <TextView  
  91.             android:id="@+id/btn_cancel"  
  92.             android:layout_width="fill_parent"  
  93.             android:layout_height="wrap_content"  
  94.             android:background="@drawable/dialog_btn_selector"  
  95.             android:gravity="center"  
  96.             android:paddingTop="12dp"  
  97.             android:paddingBottom="12dp"  
  98.             android:layout_weight="1"  
  99.             android:layout_marginRight="5dp"  
  100.             android:layout_marginLeft="5dp"  
  101.             android:text="NO"  
  102.             android:textSize="15sp"  
  103.             android:textStyle="bold" />  
  104.     </LinearLayout>  
  105.   
  106. </LinearLayout>  


还有一个布局文件simple_item.xml是当选择使用列表选择时listview的item布局文件

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:background="@drawable/dialog_btn_selector"  
  6.     android:orientation="horizontal" >  
  7.   
  8.   
  9.     <TextView   
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="fill_parent"  
  12.         android:id="@+id/tv_txt"  
  13.         android:textSize="15sp"  
  14.         android:layout_margin="13dp"/>  
  15.       
  16. </LinearLayout>  

布局完成后实现代码如下:

AlertDialogUtil.java

[java]  view plain copy
  1. package com.ericssonlabs.alertdialog;  
  2.   
  3. import android.app.AlertDialog;  
  4. import android.content.Context;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.view.Window;  
  8. import android.widget.AdapterView.OnItemClickListener;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.ListView;  
  11. import android.widget.TextView;  
  12.   
  13. import com.ericssonlabs.R;  
  14.   
  15. /** 
  16.  * Custom alert dialog 
  17.  * @author Ryan 
  18.  */  
  19. public class AlertDialogUtil {  
  20.   
  21.     private Context context;  
  22.     private String title;  
  23.     private String content;  
  24.     private AlertDialog alertDialog;  
  25.     private OnClickListener confrimClickListener;  
  26.     private OnClickListener cancelClickListener;  
  27.     private boolean isText = true;  
  28.     private BaseAdapter baseAdapter;  
  29.     private OnItemClickListener onItemClickListener;  
  30.     private TextView btn_confirm;  
  31.     private TextView btn_cancel;  
  32.     private String confrimText;  
  33.     private String cancelText;  
  34.     private Window window;  
  35.       
  36.     /** 
  37.      * Constructor 
  38.      * @param context 
  39.      */  
  40.     public AlertDialogUtil(Context context){  
  41.         this.context = context;  
  42.         alertDialog = new AlertDialog.Builder(this.context).create();  
  43.         alertDialog.show();  
  44.         window = alertDialog.getWindow();  
  45.         window.setContentView(R.layout.alertdialog);  
  46.         btn_confirm = (TextView)window.findViewById(R.id.btn_confirm);  
  47.         btn_cancel = (TextView)window.findViewById(R.id.btn_cancel);  
  48.     }  
  49.       
  50.     /** 
  51.      * set title for alert dialog 
  52.      * @param title 
  53.      */  
  54.     public void setTitle(String title){  
  55.         this.title = title;  
  56.     }  
  57.       
  58.     /** 
  59.      * set content for alert dialog 
  60.      * @param content 
  61.      */  
  62.     public void setContent(String text){  
  63.         this.content = text;  
  64.     }  
  65.       
  66.     /** 
  67.      * set list view for alert dialog 
  68.      * @param content 
  69.      */  
  70.     public void setContent(BaseAdapter listAdapter,OnItemClickListener itemClickListener){  
  71.         isText = false;  
  72.         this.baseAdapter = listAdapter;  
  73.         this.onItemClickListener = itemClickListener;  
  74.     }  
  75.       
  76.     /** 
  77.      * set title for alert dialog 
  78.      * @param titleId 
  79.      */  
  80.     public void setTitle(int titleId){  
  81.         this.title = context.getString(titleId);  
  82.     }  
  83.       
  84.     /** 
  85.      * set content for alert dialog 
  86.      * @param contentId 
  87.      */  
  88.     public void setContent(int contentId){  
  89.         this.content = context.getString(contentId);  
  90.     }  
  91.       
  92.     public void show(){  
  93.           
  94.         TextView tv_title = (TextView)window.findViewById(R.id.alert_title);  
  95.         ListView lv_items = (ListView) window.findViewById(R.id.lv_alert_dialog);  
  96.         TextView tv_content = (TextView)window.findViewById(R.id.alert_content);  
  97.           
  98.         tv_title.setText(title);  
  99.           
  100.         if (isText) {  
  101.             tv_content.setVisibility(View.VISIBLE);  
  102.             tv_content.setText(content);  
  103.         }else {  
  104.             View lineView = window.findViewById(R.id.line);  
  105.             lineView.setVisibility(View.GONE);  
  106.             btn_cancel.setVisibility(View.GONE);  
  107.             lv_items.setVisibility(View.VISIBLE);  
  108.             lv_items.setAdapter(baseAdapter);  
  109.             lv_items.setOnItemClickListener(onItemClickListener);  
  110.         }  
  111.           
  112.     }  
  113.       
  114.     /** 
  115.      * set listener for the confirm button 
  116.      * @param cancelClickListener 
  117.      */  
  118.     public void setCancelClickListener(String cancelText,OnClickListener cancelClickListener){  
  119.         this.cancelText = cancelText;  
  120.         btn_cancel.setText(this.cancelText);  
  121.         this.cancelClickListener = cancelClickListener;  
  122.         btn_cancel.setOnClickListener(this.cancelClickListener);  
  123.     }  
  124.       
  125.     /** 
  126.      * set listener for the cancel button 
  127.      * @param confrimClickListener 
  128.      */  
  129.     public void setConfirmClickListener(String confrimText,OnClickListener confrimClickListener){  
  130.         this.confrimClickListener = confrimClickListener;  
  131.         this.confrimText = confrimText;  
  132.         btn_confirm.setText(this.confrimText);  
  133.         btn_confirm.setOnClickListener(this.confrimClickListener);  
  134.     }  
  135.       
  136.     /** 
  137.      * dismiss the alert dialog 
  138.      */  
  139.     public void cancel(){  
  140.         alertDialog.cancel();  
  141.     }  
  142.       
  143. }  


最后是使用该自定义控件的代码:

[java]  view plain copy
  1. package com.ericssonlabs.alertdialog;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.content.Context;  
  7. import android.os.Bundle;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.view.ViewGroup;  
  12. import android.widget.AdapterView;  
  13. import android.widget.AdapterView.OnItemClickListener;  
  14. import android.widget.BaseAdapter;  
  15. import android.widget.Button;  
  16. import android.widget.TextView;  
  17.   
  18. import com.ericssonlabs.BaseActivity;  
  19. import com.ericssonlabs.R;  
  20. import com.ericssonlabs.toast.ToastUtil;  
  21.   
  22. public class AlertDialogActivity extends BaseActivity implements OnClickListener{  
  23.   
  24.     private Button showButton;  
  25.     private Button showButton2;  
  26.       
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.alertdialog_layout);  
  31.         setTopTitle(this,getString(R.string.alertdialog));  
  32.           
  33.         showButton = (Button) this.findViewById(R.id.btn_show_alert);  
  34.         showButton2 = (Button) this.findViewById(R.id.btn_show_alert1);  
  35.         showButton.setOnClickListener(this);  
  36.         showButton2.setOnClickListener(this);  
  37.           
  38.         setBackButton(thisnew OnClickListener() {  
  39.               
  40.             @Override  
  41.             public void onClick(View v) {  
  42.                 AlertDialogActivity.this.finish();  
  43.             }  
  44.         });  
  45.           
  46.     }  
  47.       
  48.     AlertDialogUtil alertDialogUtil;  
  49.   
  50.     @Override  
  51.     public void onClick(View v) {  
  52.         switch (v.getId()) {  
  53.         case R.id.btn_show_alert:  
  54.             alertDialogUtil = new AlertDialogUtil(AlertDialogActivity.this);  
  55.             alertDialogUtil.setTitle("Title");  
  56.             alertDialogUtil.setContent("Do you want to exit?");  
  57.             alertDialogUtil.setConfirmClickListener("OK",new OnClickListener() {  
  58.                   
  59.                 @Override  
  60.                 public void onClick(View v) {  
  61.                     // TODO Auto-generated method stub  
  62.                     ToastUtil.show(AlertDialogActivity.this"Test alert dialog!");  
  63.                     alertDialogUtil.cancel();  
  64.                 }  
  65.             });  
  66.             alertDialogUtil.setCancelClickListener("NO",new OnClickListener() {  
  67.                   
  68.                 @Override  
  69.                 public void onClick(View v) {  
  70.                     // TODO Auto-generated method stub  
  71.                     alertDialogUtil.cancel();  
  72.                 }  
  73.             });  
  74.             alertDialogUtil.show();  
  75.             break;  
  76.               
  77.         case R.id.btn_show_alert1:  
  78.             alertDialogUtil = new AlertDialogUtil(AlertDialogActivity.this);  
  79.             alertDialogUtil.setTitle("Title");  
  80.               
  81.             ArrayList<String> list = new ArrayList<String>();  
  82.             list.add("Item-1");  
  83.             list.add("Item-2");  
  84.             list.add("Item-3");  
  85.               
  86.             alertDialogUtil.setContent(new DialogItemAdapter(AlertDialogActivity.this,list),new OnItemClickListener() {  
  87.   
  88.                 @Override  
  89.                 public void onItemClick(AdapterView<?> arg0, View arg1,  
  90.                         int position, long arg3) {  
  91.                       
  92.                     switch (position) {  
  93.                     case 0:  
  94.                         ToastUtil.show(AlertDialogActivity.this"Alert dialog");  
  95.                         alertDialogUtil.cancel();  
  96.                         break;  
  97.                     case 1:  
  98.                         ToastUtil.show(AlertDialogActivity.this"Alert dialog");  
  99.                         alertDialogUtil.cancel();  
  100.                         break;  
  101.                     case 2:  
  102.                         ToastUtil.show(AlertDialogActivity.this"Alert dialog");  
  103.                         alertDialogUtil.cancel();  
  104.                         break;  
  105.   
  106.                     default:  
  107.                         break;  
  108.                     }  
  109.                 }  
  110.             });  
  111.               
  112.             alertDialogUtil.setConfirmClickListener("Cancel",new OnClickListener() {  
  113.                   
  114.                 @Override  
  115.                 public void onClick(View v) {  
  116.                     // TODO Auto-generated method stub  
  117.                     alertDialogUtil.cancel();  
  118.                 }  
  119.             });  
  120.             alertDialogUtil.show();  
  121.             break;  
  122.   
  123.         default:  
  124.             break;  
  125.         }  
  126.     }  
  127.       
  128.     class DialogItemAdapter extends BaseAdapter{  
  129.   
  130.         private Context context;  
  131.         private List<String> list;  
  132.           
  133.         public DialogItemAdapter(Context context,List<String> list){  
  134.             this.context = context;  
  135.             this.list = list;  
  136.         }  
  137.           
  138.         @Override  
  139.         public int getCount() {  
  140.             // TODO Auto-generated method stub  
  141.             return list.size();  
  142.         }  
  143.   
  144.         @Override  
  145.         public Object getItem(int position) {  
  146.             // TODO Auto-generated method stub  
  147.             return list.get(position);  
  148.         }  
  149.   
  150.         @Override  
  151.         public long getItemId(int position) {  
  152.             // TODO Auto-generated method stub  
  153.             return position;  
  154.         }  
  155.   
  156.         @Override  
  157.         public View getView(int position, View convertView, ViewGroup parent) {  
  158.             ViewHolder viewHolder;  
  159.             if (convertView == null) {  
  160.                 viewHolder = new ViewHolder();  
  161.                 LayoutInflater inflater = LayoutInflater.from(context);  
  162.                 convertView = inflater.inflate(R.layout.simple_item, null);  
  163.                 viewHolder.textView = (TextView) convertView.findViewById(R.id.tv_txt);  
  164.                 convertView.setTag(viewHolder);  
  165.             }else {  
  166.                 viewHolder  = (ViewHolder)convertView.getTag();  
  167.             }  
  168.               
  169.             viewHolder.textView.setText(list.get(position));  
  170.               
  171.             return convertView;  
  172.         }   
  173.           
  174.     }  
  175.       
  176.     private class ViewHolder{  
  177.         private TextView textView;  
  178.     }  
  179.   
  180. }  

以上就实现了类似4.0效果的对话框,代码写的不是很完善,希望大家共同来改进,后续我会陆续制作一套4.0效果的UI库,另外,可以在这些效果的基础上进行定制,比如一下效果是我在另一个项目中用到的样式:

仿Android ISC 4.0效果对话框_第3张图片       


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

 仿Android ISC 4.0效果对话框_第4张图片



你可能感兴趣的:(action)