自定义dialog

    xiaoxiao2025-04-22  17

    做项目时,感觉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
    最新回复(0)