自定義Dialog彈框和其背景陰影顯示方法
昨天研究了一下自定義Dialog的彈框,其實(shí)要點(diǎn)都是把自定義好的view用setContentView(view)的方法設(shè)置進(jìn)dialog里,首先我們先看一個(gè)簡單的自定義Dialog。
一、寫布局文件:custom_dialog_layout.xml(這個(gè)布局就是一個(gè)簡單的提示內(nèi)容,下面有一個(gè)確定的按鈕,請(qǐng)參看評(píng)論中的效果圖)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/content_layout" android:layout_gravity="center" android:gravity="center"> <LinearLayout android:background="@drawable/dialog_content_white_with_radius" android:layout_marginLeft="40dp" android:layout_marginRight="40dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center"> <TextView android:id="@+id/dialog_content_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="info" android:textSize="@dimen/size40" android:textColor="@color/word_color_444444" android:padding="10dp" android:gravity="center"/> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:background="@color/divide_line"/> <TextView android:paddingTop="10dp" android:paddingBottom="10dp" android:id="@+id/tv_sure" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textColor="@color/main_color" android:text = "確定" android:textSize="@dimen/two_level_word" /> </LinearLayout> </LinearLayout>
寫好布局文件后,由于布局直角不好看,我們可以設(shè)置邊框?yàn)閳A角的shape,寫入,代碼如下:dialog_content_white_with_radius
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/wirte_ffffff" /> <corners android:bottomLeftRadius="8dp" android:bottomRightRadius="8dp" android:topLeftRadius="8dp" android:topRightRadius="8dp" /> </shape>
二、寫自定義Dialog類繼承自Dialog:
/** [Description] * 只有確認(rèn)button * [How to use] * * [Tips] * * Created by lan.zheng on 2017/7/25 18:26. */ public class SureClickDialog extends Dialog { private Listener mListener; public SureClickDialog(Context context) { super(context); } public SureClickDialog(Context context, String content, Listener listener){ super(context, R.style.custom_dialog_style); mListener = listener; View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_have_been_sign_section_show, null); TextView contentTextView = (TextView) contentView.findViewById(R.id.dialog_content_text); contentTextView.setText(content); TextView sureButton = (TextView) contentView.findViewById(R.id.tv_sure); //消失監(jiān)聽 this.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { mListener.onDialogDismissListener(); } }); //確認(rèn) sureButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); mListener.onSureListerner(); } }); setContentView(contentView); } public interface Listener { void onDialogDismissListener(); void onSureListerner(); } }
這里我們只監(jiān)聽彈框消失和點(diǎn)擊確定的按鈕,好了基本工作到這里完成了,最后就是設(shè)置樣式style,一般彈框背景都是半透明的遮罩:
<style name="custom_dialog_style" parent="android:Theme.Dialog"> <item name="android:windowFrame">@null</item> <item name="android:windowIsFloating">true</item> <item name="android:windowIsTranslucent">false</item> <item name="android:windowNoTitle">true</item><!--除去title--> <item name="android:backgroundDimEnabled">true</item><!--半透明--> <item name="android:windowBackground">@color/transparent</item><!--除去背景色--> <item name="android:radius">10dp</item> </style>
這樣就完成了一個(gè)背景半透明的彈框了。
設(shè)置<itemname="android:backgroundDimEnabled">true</item><!--半透明-->能實(shí)現(xiàn)半透明,但是如果有特殊的背景要求那就不能滿足了,此時(shí)通過查詢發(fā)現(xiàn),可以重寫下面這個(gè)函數(shù)進(jìn)行把整個(gè)你自定義的布局全屏顯示。
@Override public void show() { super.show(); /** * 設(shè)置寬度全屏,要設(shè)置在show的后面 */ WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); layoutParams.width= ViewGroup.LayoutParams.MATCH_PARENT; layoutParams.height= ViewGroup.LayoutParams.MATCH_PARENT; getWindow().getDecorView().setPadding(0, 0, 0, 0); getWindow().setAttributes(layoutParams); }
發(fā)現(xiàn)是生效的,我布局中的背景是成功的應(yīng)用上了,但是發(fā)現(xiàn)點(diǎn)擊外圍卻不能讓彈框消失,這是因?yàn)槟愕膹椏蛞呀?jīng)是全屏了,所以在屏幕上就沒有所謂的彈框外圍了,這時(shí)候我們可以自己去監(jiān)聽點(diǎn)擊事件,我們來重寫一下自定義Dialog類:
/** * [Description] * 只有確認(rèn)button * [How to use] * new SureClickDialog() * [Tips] * isClickOutsideCanDismiss必須給值,true表示可點(diǎn)擊外圍消失,false表示不能 * Created by lan.zheng on 2017/7/25 18:26. */ public class SureClickDialog extends Dialog { private Listener mListener; public SureClickDialog(Context context) { super(context); } public SureClickDialog(Context context, String content, boolean isClickOutsideCanDismiss,Listener listener){ super(context, R.style.custom_dialog_style); mListener = listener; View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_have_been_sign_section_show, null); LinearLayout linearLayout = (LinearLayout)contentView.findViewById(R.id.content_layout) ; //自定義布局的最外層 linearLayout.setBackgroundColor(context.getResources().getColor(R.color.half_transparent)); linearLayout.setOnClickListener(new View.OnClickListener() { //為其設(shè)置自定義點(diǎn)擊監(jiān)聽 @Override public void onClick(View v) { if(isClickOutsideCanDismiss){ dismiss(); } } }); TextView contentTextView = (TextView) contentView.findViewById(R.id.dialog_content_text); contentTextView.setText(content); TextView sureButton = (TextView) contentView.findViewById(R.id.tv_sure); //消失監(jiān)聽 this.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { mListener.onDialogDismissListener(); } }); //確認(rèn) sureButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); mListener.onSureListerner(); } }); setContentView(contentView); } @Override public void show() { super.show(); WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); layoutParams.width= ViewGroup.LayoutParams.MATCH_PARENT; layoutParams.height= ViewGroup.LayoutParams.MATCH_PARENT; getWindow().getDecorView().setPadding(0, 0, 0, 0); getWindow().setAttributes(layoutParams); } public interface Listener { void onDialogDismissListener(); void onSureListerner(); } }
OK,關(guān)于彈框的就寫到這里啦,自定義的功能十分豐富和具有可塑性,有興趣的可以研究一下。
以上這篇自定義Dialog彈框和其背景陰影顯示方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android客制化adb shell進(jìn)去后顯示shell@xxx的標(biāo)識(shí)
今天小編就為大家分享一篇關(guān)于Android客制化adb shell進(jìn)去后顯示shell@xxx的標(biāo)識(shí),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12Android 浮動(dòng)編輯框的具體實(shí)現(xiàn)代碼
本篇文章主要介紹了Android 浮動(dòng)編輯框的具體實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10Android啟動(dòng)頁用戶相關(guān)政策彈框的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android啟動(dòng)頁用戶相關(guān)政策彈框的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Flutter路由跳轉(zhuǎn)參數(shù)處理技巧詳解
這篇文章主要為大家介紹了Flutter路由跳轉(zhuǎn)參數(shù)處理技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Android使用OKHttp庫實(shí)現(xiàn)視頻文件的上傳到服務(wù)器功能
這篇文章主要介紹了Android使用OKHttp庫實(shí)現(xiàn)視頻文件的上傳到服務(wù)器功能,需要的朋友可以參考下2018-03-03Android更多條目收縮展開控件ExpandView的示例代碼
本篇文章主要介紹了Android更多條目收縮展開控件ExpandView的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01Android9.0 SystemUI 網(wǎng)絡(luò)信號(hào)欄定制修改的流程解析
這篇文章主要介紹了Android9.0 SystemUI 網(wǎng)絡(luò)信號(hào)欄定制修改的流程,本文通過圖文實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11