做项目时,感觉android自带的弹出框样式比较丑,很多应用都是自己做的弹出框,这里也试着自己做了一个。
实现机制
1.先自定义一个弹出框的样式
2.自己实现CustomDialog类,继承自Dialog,实现里面方法,在里面加载自定义样式的弹出框;
3.使用时,与使用Dialog一样
具体代码
dialog_normal_layout.xml样式文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_gravity="center"
tools:context="com.cunstomdialog.MainActivity">
<LinearLayout
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@android:color/black"
android:orientation="vertical" >
<TextView
android:id="@+id/title"
style="@style/text_18_ffffff"
android:layout_width="match_parent"
android:layout_height="40.0dp"
android:gravity="center"
android:text="提示"
android:visibility="visible" />
<View
android:layout_width="300dp"
android:layout_height="1.0px"
android:background="#ffd0d0d0" />
<LinearLayout
android:id="@+id/content"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:gravity="center" >
<TextView
android:id="@+id/message"
style="@style/text_16_666666"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left|center"
android:lineSpacingMultiplier="1.5"
android:minHeight="120.0dp"
android:paddingBottom="15.0dp"
android:paddingLeft="20.0dp"
android:paddingRight="20.0dp"
android:paddingTop="15.0dp" />
</LinearLayout>
<View
android:layout_width="300dp"
android:layout_height="1.0px"
android:background="#ffd0d0d0" />
<LinearLayout
android:layout_width="300dp"
android:layout_height="60.0dp"
android:layout_gravity="bottom"
android:background="@android:color/black"
android:gravity="center"
android:orientation="horizontal" >
<Button
android:id="@+id/positiveButton"
style="@style/text_15_ffffff_sdw"
android:layout_width="114.0dp"
android:layout_height="40.0dp"
android:background="@android:color/holo_purple"
android:gravity="center"
android:text="确定" />
<Button
android:id="@+id/negativeButton"
style="@style/text_15_666666_sdw"
android:layout_width="114.0dp"
android:layout_height="40.0dp"
android:layout_marginLeft="20.0dp"
android:background="@android:color/holo_purple"
android:gravity="center"
android:text="取消" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
其中引用的样式文件styles.xml(大家可以自己去定义样式)
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary
</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark
</item>
<item name="colorAccent">@color/colorAccent
</item>
</style>
<style name="text_18_ffffff">
<item name="android:textSize">18.0dip
</item>
<item name="android:textColor">#ffffffff
</item>
</style>
<style name="text_16_666666">
<item name="android:textSize">16.0dip
</item>
<item name="android:textColor">#ff666666
</item>
</style>
<style name="sdw_white">
<item name="android:shadowColor">#7fffffff
</item>
<item name="android:shadowDx">0.0
</item>
<item name="android:shadowDy">0.65
</item>
<item name="android:shadowRadius">1.0
</item>
</style>
<style name="sdw_79351b">
<item name="android:shadowColor">#ff79351b
</item>
<item name="android:shadowDx">0.0
</item>
<item name="android:shadowDy">1.0
</item>
<item name="android:shadowRadius">1.0
</item>
</style>
<style name="text_15_ffffff_sdw" parent="@style/sdw_79351b">
<item name="android:textSize">15.0dip
</item>
<item name="android:textColor">#ffffffff
</item>
</style>
<style name="text_15_666666_sdw" parent="@style/sdw_white">
<item name="android:textSize">15.0dip
</item>
<item name="android:textColor">#ff666666
</item>
</style>
<style name="Dialog" parent="android:style/Theme.Dialog">
<item name="android:background">#00000000
</item>
<item name="android:windowBackground">@android:color/transparent
</item>
<item name="android:windowNoTitle">true
</item>
<item name="android:windowIsFloating">true
</item>
</style>
</resources>
自定义Dialog的实现类CustomDialog
package com.cunstomdialog
;
import android.app.ActionBar
;
import android.app.Dialog
;
import android.content.Context
;
import android.content.DialogInterface
;
import android.view.LayoutInflater
;
import android.view.View
;
import android.widget.Button
;
import android.widget.LinearLayout
;
import android.widget.TextView
;
/**
* Created by Administrator on 2016-08-14.
*/
public class CustomDialog
extends Dialog {
public CustomDialog(Context context) {
super(context)
;
}
public CustomDialog(Context context
, int themeResId) {
super(context
, themeResId)
;
}
protected CustomDialog(Context context
, boolean cancelable
, OnCancelListener cancelListener) {
super(context
, cancelable
, cancelListener)
;
}
public static class Builder {
private Context
context;
private String
title;
private String
message;
private String
positiveButtonText;
private String
negativeButtonText;
private View
contentView;
private DialogInterface.OnClickListener
positiveButtonClickListener;
private DialogInterface.OnClickListener
negativeButtonClickListener;
public Builder(Context context) {
this.
context = context
;
}
public Builder
setMessage(String message) {
this.
message = message
;
return this;
}
/**
* Set the Dialog message from resource
*
* @param title
* @return
*/
public Builder
setMessage(
int message) {
this.
message = (String)
context.getText(message)
;
return this;
}
/**
* Set the Dialog title from resource
*
* @param title
* @return
*/
public Builder
setTitle(
int title) {
this.
title = (String)
context.getText(title)
;
return this;
}
/**
* Set the Dialog title from String
*
* @param title
* @return
*/
public Builder
setTitle(String title) {
this.
title = title
;
return this;
}
public Builder
setContentView(View v) {
this.
contentView = v
;
return this;
}
/**
* Set the positive button resource and it's listener
*
* @param positiveButtonText
* @return
*/
public Builder
setPositiveButton(
int positiveButtonText
,
DialogInterface.OnClickListener listener) {
this.
positiveButtonText = (String)
context
.getText(positiveButtonText)
;
this.
positiveButtonClickListener = listener
;
return this;
}
public Builder
setPositiveButton(String positiveButtonText
,
DialogInterface.OnClickListener listener) {
this.
positiveButtonText = positiveButtonText
;
this.
positiveButtonClickListener = listener
;
return this;
}
public Builder
setNegativeButton(
int negativeButtonText
,
DialogInterface.OnClickListener listener) {
this.
negativeButtonText = (String)
context
.getText(negativeButtonText)
;
this.
negativeButtonClickListener = listener
;
return this;
}
public Builder
setNegativeButton(String
negativeButtonText,
DialogInterface.OnClickListener listener) {
this.
negativeButtonText =
negativeButtonText;
this.
negativeButtonClickListener = listener
;
return this;
}
public CustomDialog
create() {
LayoutInflater inflater = (LayoutInflater)
context
.getSystemService(Context.
LAYOUT_INFLATER_SERVICE)
;
// instantiate the dialog with the custom Theme
final CustomDialog dialog =
new CustomDialog(
context, R.style.
Dialog)
;
View layout = inflater.inflate(R.layout.
dialog_normal_layout, null)
;
dialog.addContentView(layout
, new ActionBar.LayoutParams(
ActionBar.LayoutParams.
FILL_PARENT, ActionBar.LayoutParams.
WRAP_CONTENT))
;
// set the dialog title
((TextView) layout.findViewById(R.id.
title)).setText(
title)
;
// set the confirm button
if (
positiveButtonText !=
null) {
((Button) layout.findViewById(R.id.
positiveButton))
.setText(
positiveButtonText)
;
if (
positiveButtonClickListener !=
null) {
((Button) layout.findViewById(R.id.
positiveButton))
.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
positiveButtonClickListener.onClick(
dialog,
DialogInterface.
BUTTON_POSITIVE)
;
}
})
;
}
}
else {
// if no confirm button just set the visibility to GONE
layout.findViewById(R.id.
positiveButton).setVisibility(
View.
GONE)
;
}
// set the cancel button
if (
negativeButtonText !=
null) {
((Button) layout.findViewById(R.id.
negativeButton))
.setText(
negativeButtonText)
;
if (
negativeButtonClickListener !=
null) {
((Button) layout.findViewById(R.id.
negativeButton))
.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
negativeButtonClickListener.onClick(
dialog,
DialogInterface.
BUTTON_NEGATIVE)
;
}
})
;
}
}
else {
// if no confirm button just set the visibility to GONE
layout.findViewById(R.id.
negativeButton).setVisibility(
View.
GONE)
;
}
// set the content message
if (
message !=
null) {
((TextView) layout.findViewById(R.id.
message)).setText(
message)
;
}
else if (
contentView !=
null) {
// if no message set
// add the contentView to the dialog body
((LinearLayout) layout.findViewById(R.id.
content))
.removeAllViews()
;
((LinearLayout) layout.findViewById(R.id.
content))
.addView(
contentView, new ActionBar.LayoutParams(ActionBar.LayoutParams.
FILL_PARENT, ActionBar.LayoutParams.
FILL_PARENT))
;
}
dialog.setContentView(layout)
;
return dialog
;
}
}
}
MainActivity.java使用代码如下
package com.cunstomdialog
;
import android.content.DialogInterface
;
import android.support.v7.app.AppCompatActivity
;
import android.os.Bundle
;
import android.widget.Toast
;
public class MainActivity
extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
;
CustomDialog.Builder builder =
new CustomDialog.Builder(
this)
;
builder.setMessage(
"这个就是自定义的提示框")
;
builder.setTitle(
"提示")
;
builder.setPositiveButton(
"确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog
, int which) {
//设置你的操作事项
dialog.dismiss()
;
}
})
;
builder.setNegativeButton(
"取消",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog
, int which) {
dialog.dismiss()
;
}
})
;
builder.create().show()
;
}
}
至此,自定义弹出框已经完成,是不是感觉很简单呢。
转载请注明原文地址: https://ju.6miu.com/read-1298318.html