android自定义Dialog

本文详细介绍了如何在Android中创建自定义Dialog,包括界面布局、接口定义、样式配置及与MainActivity的交互。同时,展示了如何自定义按钮样式并集成到自定义Dialog中,最终通过代码实现与用户交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.新建一个项目

取名为CustomDialog,项目结构如图所示:

项目结构

2.定义一个接口DialogListener

package com.example.customdialog;

import android.view.View;

public interface DialogListener {
    public void OnClick(View v);
}

3.写一个类CustomDialog继承Dialog

package com.example.customdialog;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
public class CustomDialog extends Dialog  implements android.view.View.OnClickListener{ 

    TextView tv_message; 
    Button bt_yes,bt_no; 
    ImageView iv_warn;
    DialogListener dialogListner; 
    String content;
    Integer resId;
    //resId是iv_warn.setBackgroundResource(resId);的图片资源
    public CustomDialog(Context context, int theme,Integer resId,String content,DialogListener dialogListner){ 
        super(context, theme); 
        this.dialogListner=dialogListner; 
        this.resId=resId;
        this.content=content; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        this.setContentView(R.layout.custom_dialog); 
        //点击外部不会消失  
        this.setCanceledOnTouchOutside(false); 
        InitViews(); 
    } 

    private void InitViews(){ 
        iv_warn=(ImageView) findViewById(R.id.iv_warn); 
        tv_message=(TextView) findViewById(R.id.tv_message); 
        iv_warn.setBackgroundResource(resId);
        tv_message.setText(this.content);
        bt_yes=(Button) findViewById(R.id.bt_yes); 
        bt_no=(Button) findViewById(R.id.bt_no); 
        bt_yes.setOnClickListener(this); 
        bt_no.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
        // TODO Auto-generated method stub  
        dialogListner.OnClick(v); 
        dismiss();
    } 
    @Override 
    public void dismiss() { 
        super.dismiss(); 
    } 
} 

4.再写一个custom_dialog的配置文件

弹出的自定义Dialog样式在这里进行定义!

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:background="@drawable/dialog_custom_bg"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/iv_warn"
        android:layout_width="80dip"
        android:layout_height="80dip"
        android:layout_marginTop="15dip" />

    <TextView
        android:id="@+id/tv_message"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dip"
        android:gravity="center"
        android:textSize="18sp" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="20dp"
        android:layout_margin="10dp"
         >

        <Button
            android:id="@+id/bt_yes"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@string/btn_yes" />

        <Button
            android:id="@+id/bt_no"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:gravity="center"
            android:text="@string/btn_no" />
    </LinearLayout>

</LinearLayout>

5.dialog的背景样式

在drawable里新建文件dialog_custom_bg.xml文件,第四步的 custom_dialog.xml里面的LinearLayout的background用到。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
        <solid android:color="#fff4f4f4" />

    <corners
        android:bottomLeftRadius="8dp"
        android:bottomRightRadius="8dp"
        android:topLeftRadius="8dp"
        android:topRightRadius="8dp" />
</shape>

6.在style.xml文件里添加自定义的Dialog样式

    <style name="Custom_Dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">false</item>
    </style>

6.定义MainActivity

到这一步基本上大功告成了,就剩下在MainActivity里面调用了,在activity_main里面定义一个Button按钮,这里就不说,后面会附上源码:

package com.example.customdialog;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
    private static String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        Button b = (Button) findViewById(R.id.btn_custom_dialog);
        b.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_custom_dialog:
            CustomDialog dialog = new CustomDialog(MainActivity.this,
                    R.style.Custom_Dialog, R.drawable.ic_launcher, "我帅不!",
                    new DialogListener() {
                        @Override
                        public void OnClick(View v) {
                            switch (v.getId()) {
                            case R.id.bt_yes:
                                Log.v(TAG, "是的,你很帅!");
                                break;
                            case R.id.bt_no:
                                Log.v(TAG, "不是的,你非常帅!");
                            default:
                                break;
                            }
                        }
                    });
            dialog.show();
            break;
        default:
            break;
        }
    }
}

到这里我们来看看效果图:
CustomDialog_MianActivity
CustomDialog_Handsome
再看看控制台:
Console

7.自定义按钮

看图片是不是发觉按钮不好看,既然是自定义,那我们就自定义按钮,这里用到的是Android选择器的知识,首先定义一个选择器btn_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:drawable="@drawable/btn_pressed"></item>
    <item android:state_pressed="false" android:drawable="@drawable/btn_nomal"></item>
</selector>

选择器里定义了按下的样式和常态下的样式,分别定义两个资源文件,这里只写一个,因为两个相差不大:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="#23BA00" /> <!-- 定义填充的颜色值 -->  
    <!-- 圆角 -->  
    <corners android:radius="5dp" />  
    <!-- 间隔  -->  
    <padding  
        android:bottom="5dp"  
        android:left="10dp"  
        android:right="10dp"  
        android:top="5dp" />  
</shape>

引用的时候只要在button里加上android:background=”@drawable/btn_selector”就可以了。

最后我们看看终极效果图

CustomDialog

最后附上源码:

CustomDialog源码

原文地址:http://blog.youkuaiyun.com/hanjianc/article/details/49100729

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值