Android实现自定义对话框(Dialog)
16lz
2021-01-24
在日常开发过程中,Android自带的对话框控件美观程度远远满足不了开发的要求,特别是相对于移植开发,下面描述的demo是基于1280X720分辨率实现的效果。
自定义对话框和上次记录的自定义RatingBar非常类似,都是通过在styles.xml里面继承父类(此处是Dialog)的样式。
styles.xml
<style name="NoticeDialog" parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item><!--边框--> <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上--> <item name="android:windowIsTranslucent">false</item><!--半透明--> <item name="android:windowNoTitle">true</item><!--无标题--> <item name="android:windowBackground">@drawable/tck_bg</item><!--背景透明--> <item name="android:backgroundDimEnabled">false</item><!--模糊--> </style>我们下面将要做下面三个效果:
(1)带选择确认框的提示
(2)图片+文字的提示
(3)图片+图片
实现上面三个效果我们只需要继承一个Dialog类,然后根据不同的布局添加相对应的xml布局就可以简单实现功能扩展的效果了。
1.继承Dialog类,重写父类的方法,并添加子类自己的方法。
NoticeDialog.java,继承于Dialog父类,实现了点击事件的接口,如果有确认选择框,则把确认选择框的控件添加click事件监听,通过在回调方法在UI主线程里面实现界面更新和逻辑操作。
package com.zlc.dialog;import android.app.Dialog;import android.content.Context;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.TextView;public class NoticeDialog extends Dialog implements OnClickListener{Context context;private NoticeDialogListener listener;//对话框事件监听接口,用于处理回调点击事件public interface NoticeDialogListener {public void onClick(View view);}public NoticeDialog(Context context) {super(context);// TODO Auto-generated constructor stubthis.context = context;}public NoticeDialog(Context context,int theme){super(context, theme);this.context = context;}public NoticeDialog(Context context,int theme,NoticeDialogListener listener){super(context, theme);this.context = context;this.listener = listener;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView enter = (TextView)findViewById(R.id.dialog_enter);//确定控件TextView cancel = (TextView)findViewById(R.id.dialog_cancle);//取消控件if(enter != null && cancel != null){//如果是不带确认选择框,不做事件监听操作enter.setOnClickListener(this);cancel.setOnClickListener(this);enter.requestFocus();}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stublistener.onClick(v);}}2.对应上面三个效果,添加不同的xml布局。
1)带选择确认框的提示dialog_notice_choise.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="652dp" android:layout_height="352dp" > <LinearLayout android:layout_width="500dp" android:layout_height="200dp" android:layout_marginLeft="76dp" android:layout_marginTop="76dp" android:orientation="vertical" android:background="@drawable/tck01"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginLeft="10dp" > <TextView android:textSize="26sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/dialog_title" android:text="@string/dialog_title" android:focusable="false" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:gravity="center" > <TextView android:id="@+id/notice_value" android:textSize="32sp" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/dialog_content" android:text="@string/dialog_uninstall" android:focusable="false" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="44dp" android:layout_marginTop="35dp" android:layout_marginLeft="4dp" > <TextView android:id="@+id/dialog_enter" android:textSize="25sp" android:layout_width="246dp" android:layout_height="fill_parent" android:text="@string/dialog_enter" android:gravity="center" android:textColor="@drawable/app_manager_dialog_textcolor" android:background="@drawable/app_manager_dialog_btn_color" android:focusable="true" /> <TextView android:id="@+id/dialog_cancle" android:textSize="25sp" android:layout_width="246dp" android:layout_height="fill_parent" android:text="@string/dialog_cancel" android:gravity="center" android:textColor="@drawable/app_manager_dialog_textcolor" android:background="@drawable/app_manager_dialog_btn_color" android:focusable="true" /> </LinearLayout> </LinearLayout></LinearLayout>
2)图片+文字的提示dialog_notice_ing.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="652dp" android:layout_height="352dp" > <LinearLayout android:layout_width="500dp" android:layout_height="200dp" android:layout_marginLeft="76dp" android:layout_marginTop="76dp" android:orientation="vertical" android:background="@drawable/tck01"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginLeft="10dp" > <TextView android:textSize="26sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/dialog_title" android:text="@string/dialog_title" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="50dp" android:gravity="center" > <ImageView android:layout_width="38dp" android:layout_height="42dp" android:src="@drawable/uninstall_icon"/> <TextView android:id="@+id/dialog_in_msg" android:textSize="32sp" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/dialog_content" android:text="@string/dialog_uninstall_in" /> </LinearLayout> </LinearLayout></LinearLayout>3) 图片+图片dialog_notice_finish.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="652dp" android:layout_height="352dp" > <LinearLayout android:layout_width="500dp" android:layout_height="200dp" android:layout_marginLeft="76dp" android:layout_marginTop="76dp" android:orientation="vertical" android:background="@drawable/tck01"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginLeft="10dp" > <TextView android:textSize="26sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/dialog_title" android:text="@string/dialog_title" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:gravity="center" > <ImageView android:layout_width="66dp" android:layout_height="67dp" android:src="@drawable/cg"/> <ImageView android:id="@+id/dialog_finish_img" android:layout_marginLeft="20dp" android:layout_width="165dp" android:layout_height="36dp" android:src="@drawable/uninstall_ok" /> </LinearLayout> </LinearLayout></LinearLayout>3.在MainActivity实现对自定义对话框的添加显示。
MainActivity.java,在进行对话框切换显示的时候,只需要设置不同的xml配置文件就行了。(注意:NoticeDialog里面的构造方法的context参数只能是XXXActivity.this,不能是通过getApplicationContext获取的context对象)
package com.zlc.dialog;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import com.zlc.dialog.NoticeDialog.NoticeDialogListener;public class MainActivity extends Activity {private Context context;private NoticeDialog notiDialog;int count = 0;Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);context = getApplicationContext();notiDialog = new NoticeDialog(MainActivity.this,R.style.NoticeDialog, new NoticeDialogListener() {@Overridepublic void onClick(View view) {try {if(view.getId() == R.id.dialog_enter){notiDialog.dismiss();//TODO 购买}notiDialog.dismiss();} catch (Exception e) {e.printStackTrace();}} });notiDialog.setContentView(R.layout.dialog_notice_choise);notiDialog.show();Timer timer = new Timer();handler = new Myhandler();timer.schedule(new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stubcount = count % 4;notiDialog.cancel();handler.sendEmptyMessage(count);count ++;}}, 3000, 3000);}private class Myhandler extends Handler{@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubswitch (msg.what) {case 0:notiDialog.setContentView(R.layout.dialog_notice_ing);break;case 1:notiDialog.setContentView(R.layout.dialog_notice_finish);break;case 2:notiDialog.setContentView(R.layout.dialog_notice_choise);break;default:break;}notiDialog.show();}}}
剩下的一些效果配置和图片附在源码里面
自定义对话框
更多相关文章
- Android实现按钮点击效果(第一次点击变色,第二次恢复)
- Android显示圆角图片,可指定图片某几个角为圆角
- Android实现带动画效果的Tab Menu
- Android(安卓)ImageView的ScaleType属性
- Android(安卓)适配不同分辨率&hdpi、mdpi、ldpi&横屏竖屏
- Android(安卓)Scroller简单用法
- Android——操作摄像头、图片合成
- 那些年收藏的技术文章(一)-CSDN篇
- android 按钮水波纹效果