Android 自定義dialog的實現(xiàn)代碼
Android 自定義dialog的實現(xiàn)代碼
搜索相關(guān)關(guān)鍵字網(wǎng)上一大堆實現(xiàn),但是看完總覺得缺胳膊少腿,繞了不少彎路,終于弄好了自定義dialog。把自己整合的完整代碼發(fā)上來。
要點:
1、設(shè)置自定義dialog的布局文件my_dialog.xml
2、設(shè)置一份自定義的樣式文件styles_wx.xml,該文件用于覆蓋Android的默認主題樣式,如黑色邊框等。
3、Java代碼繼承Dialog實現(xiàn)自定義類MyDialog,實現(xiàn)自定義布局,還有設(shè)置窗口的大小、位置等。
(網(wǎng)上文章要么少介紹第2點,要么是使用AlterDialog直接實現(xiàn)效果)
先看下效果,模仿微信風格的dialog:


允許添加子view到彈出dialog,如:
代碼。
Part1.styles_wx.xml
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 微信彈窗 -->
<style name="wx_dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item> <!-- 邊框 -->
<item name="android:windowIsFloating">true</item> <!-- 是否浮現(xiàn)在activity之上 -->
<item name="android:windowIsTranslucent">false</item> <!-- 半透明 -->
<item name="android:windowNoTitle">true</item> <!-- 無標題 -->
<item name="android:windowBackground">@drawable/transparent</item> <!-- 自己想要的背景 -->
<item name="android:backgroundDimEnabled">true</item> <!-- 背景內(nèi)容模糊 -->
</style>
</resources>
注意,此處:
<item name="android:windowBackground">@drawable/transparent</item>
這是設(shè)置對話框彈出背景,嘗試設(shè)置@null,仍然是黑色背景,在使用半透明圖片時會受其影響。
所以,可以在這里指定你想要的背景圖片或者顏色。
我為了靈活性,我設(shè)置該屬性為名為"transparent"的圖片,這是一張1*1的透明圖片。這樣背景完全透明,真正使用的背景在my_dialog.xml里定義
Part2.my_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/frame_white"
android:orientation="vertical"
android:padding="15dp" >
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/systitle"
android:textSize="18sp" />
<!-- 分隔符用 -->
<TextView
android:id="@+id/tvSeparator"
style="@style/TextViewAsSeparator"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp" />
<TextView
android:id="@+id/tvText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sysText"
android:textSize="18sp" />
<!-- 該RelativeLayout作為子視圖容器 -->
<RelativeLayout
android:id="@+id/rlContent"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:orientation="horizontal" >
<TextView
android:id="@+id/tvButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dp"
android:background="@drawable/selector_text_button"
android:clickable="true"
android:paddingBottom="5dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingTop="5dp"
android:text="@string/ok"
android:textColor="@color/wx_text_link"
android:textSize="14sp"
android:visibility="visible" />
<TextView
android:id="@+id/tvButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignWithParentIfMissing="true"
android:layout_marginLeft="10dp"
android:layout_toLeftOf="@id/tvButton2"
android:background="@drawable/selector_text_button"
android:clickable="true"
android:paddingBottom="5dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingTop="5dp"
android:text="@string/cancel"
android:textColor="@color/wx_text_link"
android:textSize="14sp" />
</RelativeLayout>
</LinearLayout>
Part3.MyDialog.java
package com.kwws;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.navigator.R;
/**
* 自定義對話框
*
* @author Kangwei
*
*/
public class MyDialog extends Dialog {
/* 屬性 */
// 數(shù)據(jù)
String title = "title";
String text = "text";
String cancelButtonText = "cancel";
String okButtonText = "ok";
int okColor = -1;
int cancelColor = -1;
// UI
Context mContent;
TextView tvTitle;
TextView tvSeparator;
TextView tvText;
TextView tvBtn1;
TextView tvBtn2;
RelativeLayout childViewWrapper;// 子組件容器
/**
* 設(shè)置對話框樣式,設(shè)置null則不顯示
*
* @param context
* 上下文
* @param title
* 標題
* @param text
* 文本
* @param cancelButtonText
* 取消按鈕文本
* @param okButtonText
* 確認按鈕文本
*/
public MyDialog(Context context, String title, String text,
String cancelButtonText, String okButtonText) {
super(context, R.style.wx_dialog);// 樣式定義,該樣式去除android默認的黑色背景邊框等。
this.mContent = context;
setDialogStyle(title, text, cancelButtonText, okButtonText);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
LayoutInflater layout = LayoutInflater.from(mContent);
View view = layout.inflate(R.layout.my_dialog, null);
setContentView(view);
findView();
initView();
initViewEvent();
}
private void setDialogStyle(String title, String text,
String cancelButtonText, String okButtonText) {
this.title = title;
this.text = text;
this.cancelButtonText = cancelButtonText;
this.okButtonText = okButtonText;
}
private void findView() {
tvTitle = (TextView) findViewById(R.id.tvTitle);
tvSeparator = (TextView) findViewById(R.id.tvSeparator);
tvText = (TextView) findViewById(R.id.tvText);
tvBtn1 = (TextView) findViewById(R.id.tvButton1);
tvBtn2 = (TextView) findViewById(R.id.tvButton2);
childViewWrapper = (RelativeLayout) findViewById(R.id.rlContent);
}
private void initView() {
if (title == null) {
tvTitle.setVisibility(View.GONE);
tvSeparator.setVisibility(View.GONE);
} else {
tvTitle.setVisibility(View.VISIBLE);
tvSeparator.setVisibility(View.VISIBLE);
tvTitle.setText(title);
}
if (text == null) {
tvText.setVisibility(View.GONE);
} else {
tvText.setVisibility(View.VISIBLE);
tvText.setText(text);
}
if (cancelButtonText == null) {
tvBtn1.setVisibility(View.GONE);
} else {
tvBtn1.setVisibility(View.VISIBLE);
tvBtn1.setText(cancelButtonText);
if (cancelColor != -1) {
tvBtn1.setTextColor(cancelColor);
}
}
if (okButtonText == null) {
tvBtn2.setVisibility(View.GONE);
} else {
tvBtn2.setVisibility(View.VISIBLE);
tvBtn2.setText(okButtonText);
if (okColor != -1) {
tvBtn2.setTextColor(okColor);
}
}
if (childViewWrapper != null && childView != null) {
childViewWrapper.addView(childView);
}
// 設(shè)置對話框大小
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
DisplayMetrics d = mContent.getResources().getDisplayMetrics();
// 獲取屏幕寬、高用
lp.width = (int) (d.widthPixels * 0.8); // 高度設(shè)置為屏幕的0.8
dialogWindow.setAttributes(lp);
}
private void initViewEvent() {
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.tvButton1:
if (mListener != null) {
mListener.onCancelButtonClick(MyDialog.this, v);
}
break;
case R.id.tvButton2:
if (mListener != null) {
mListener.onOKButtonClick(MyDialog.this, v);
}
break;
default:
break;
}
}
};
tvBtn1.setOnClickListener(listener);
tvBtn2.setOnClickListener(listener);
}
public interface OnDialogButtonClickListener {
void onCancelButtonClick(MyDialog dialog, View view);
void onOKButtonClick(MyDialog dialog, View view);
}
private OnDialogButtonClickListener mListener;
/**
* 對話框按鈕監(jiān)聽
*
* @param listener
*/
public void setOnDialogButtonClickListener(
OnDialogButtonClickListener listener) {
this.mListener = listener;
}
/**
* 確定按鈕文本顏色
*
* @param color
*/
public void setOKButtonTextColor(int color) {
this.okColor = color;
}
/**
* 取消按鈕文本顏色
*
* @param color
*/
public void setCancelButtonTextColor(int color) {
this.cancelColor = color;
}
View childView;
/**
* 在對話框顯示自定義視圖
*/
public void setChildView(View view) {
childView = view;
}
}
Part4.使用
// 退出提示框
public void exitDialog() {
MyDialog dialog = new MyDialog(this, "提示", "確認退出?", "取消", "退出");
dialog.setOKButtonTextColor(getResources().getColor(R.color.red));
dialog.setOnDialogButtonClickListener(new OnDialogButtonClickListener() {
@Override
public void onOKButtonClick(MyDialog dialog, View view) {
finish();
}
@Override
public void onCancelButtonClick(MyDialog dialog, View view) {
dialog.dismiss();
}
});
dialog.show();
}
/*
* 顯示配置對話框
*/
private void showConfigDialog() {
// 讀取參數(shù)
final SharedPreferencesHelper helper = new SharedPreferencesHelper(
this, "config");
final String ip = helper.getValue("serverip");
final String port = helper.getValue("serverport");
// 配置界面 輸入IP和端口的簡單界面,這里就不附xml了
View view = getLayoutInflater().inflate(R.layout.dialog_config, null);
final EditText etIP = (EditText) view.findViewById(R.id.etIP);
final EditText etPort = (EditText) view.findViewById(R.id.etPort);
etIP.setText(ip != null ? ip : Ksoap2Helper.getServerIP());
etPort.setText(port != null ? port : String.valueOf(Ksoap2Helper
.getServerPort()));
// 配置對話框
MyDialog dialog = new MyDialog(this, "參數(shù)配置", null, "取消", "確定");
// 添加配置界面到對話框
dialog.setChildView(view);
// 按鈕監(jiān)聽
dialog.setOnDialogButtonClickListener(new OnDialogButtonClickListener() {
@Override
public void onOKButtonClick(MyDialog dialog, View view) {
// 保存配置
String newIP = etIP.getText().toString();
String newPort = etPort.getText().toString();
if (true) {
helper.putValue("serverip", newIP);
Ksoap2Helper.setServerIP(newIP);
}
if (true) {
helper.putValue("serverport", newPort);
Ksoap2Helper.setServerPort(Integer.valueOf(newPort));
}
dialog.dismiss();
}
@Override
public void onCancelButtonClick(MyDialog dialog, View view) {
dialog.dismiss();
}
});
dialog.show();
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android 系統(tǒng)語言切換監(jiān)聽和設(shè)置實例代碼
本篇文章主要介紹了Android 系統(tǒng)語言切換監(jiān)聽和設(shè)置實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Android?獲取手機已安裝的應(yīng)用列表實現(xiàn)詳解
這篇文章主要介紹了Android?獲取手機已安裝的應(yīng)用列表的實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
Android 自動判斷是電話,網(wǎng)址,EMAIL方法之Linkify的使用
本篇文章小編為大家介紹,在Android中 自動判斷是電話,網(wǎng)址,EMAIL方法之Linkify的使用。需要的朋友參考下2013-04-04
Android 7.0 SEAndroid app權(quán)限配置方法
今天小編就為大家分享一篇Android 7.0 SEAndroid app權(quán)限配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Kotlin實現(xiàn)多函數(shù)接口的簡化調(diào)用
這篇文章主要為大家詳細介紹了Kotlin實現(xiàn)多函數(shù)接口的簡化調(diào)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06

