Android之自定义对话框

很多时候系统自带的对话框无法满足我们在工作上的需求,这时,自定义对话框就显的很重要了。今天就带领大家使用自定义布局来写出自己所需要的对话框。

下面一张对话框图就是等下我们所要做的对话框:

 

 

虽然布局丑了点,但是本着大家都能看的懂的原则,我都是使用系统自带的颜色和图片来做的,省的资源和样式用多了,怕有的人看的很莫名其妙,这里只是给个思想,只要你有图片有资源,你就可以做成任何样式的对话框。

我们要做成这样的对话框,其实很简单,首先,我们要在xml中把布局布置成这样上图的样子。然后对话框加载自定义的布局就能显示这样的效果。这里关键的是就是怎么样对确定和取消这两个按钮设置单击事件。这里我们就需要设置回调接口了,让单击所做的事件回调出去让用户处理就行了,不懂的话等下看下代码就知道了。

布局我就不多说了,都是简单的布局,下面自己看代码,我们要使用自定义的对话框,我们就需要修改系统自带对话框的风格,简单说就是要使用自定义的style,当然我们不必重写对话框的每个属性,我们只需修改几个系统的属性就ok了,这个很重要,下面给出我写的自定义style,并给出解释:
   <style name="model_dialog" parent="android:style/Theme.Dialog"> <!--继承系统对话框-->

        <item name="android:windowFrame">@null</item>

<!--DialogwindowFrame框为无-->

        <item name="android:windowNoTitle">true</item>

<!--是否显示标题-->

        <item name="android:windowBackground">@color/not_color</item>

<!--设置dialog的背景-->

        <item name="android:windowIsFloating">true</item>

<!--是否浮在activity-->

        <item name="android:windowContentOverlay">@null</item>

<!--对话框是否有遮盖-->

 

<item name="android:backgroundDimEnabled">false</item>

<!--背景是否变暗-->

<item name="android:windowIsTranslucent">false</item>

<!--是否半透明-->

</style>

其实上面有的属性和系统对话框属性是一致的,但是我为了说明常用的对话框主题属性就拿出来说明下,好了下面就上代码,关键地方我都给出了注释。

 

布局文件tipdialog.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="300dp"

    android:layout_height="wrap_content"

    android:orientation="vertical" >

 

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="54dp"

        android:background="#00ff00"

        android:orientation="horizontal">

 

        <FrameLayout

            android:layout_width="44dp"

            android:layout_height="match_parent" >

 

            <ImageView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_gravity="center"

                android:src="@drawable/ic_launcher" />

        </FrameLayout>

 

        <FrameLayout

            android:layout_width="wrap_content"

            android:layout_height="match_parent" >

 

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_gravity="center_vertical"

                android:singleLine="true"

                android:textSize="32sp"

                android:text="信息提示" />

        </FrameLayout>

    </LinearLayout>

 

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:background="#00ff00"

        android:orientation="vertical" >

 

        <FrameLayout

            android:layout_width="match_parent"

            android:layout_height="wrap_content" 

            android:background="#ffff00"

            >

 

            <TextView

                android:id="@+id/content_text"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_gravity="center_vertical"

                android:singleLine="false"

                android:textSize="24sp"

                android:gravity="left" />

        </FrameLayout>

 

        <LinearLayout

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:orientation="horizontal" >

 

            <FrameLayout

                android:layout_width="0dp"

                android:layout_height="wrap_content"

                android:layout_weight="1" >

 

                <Button

                    android:id="@+id/confirm"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:layout_gravity="center"

                    android:clickable="true"

                    android:textSize="36sp"

                    android:text="确定" />

            </FrameLayout>

 

            <FrameLayout

                android:layout_width="0dp"

                android:layout_height="wrap_content"

                android:layout_weight="1" >

 

                <Button

                    android:id="@+id/cancel"

                    android:textSize="36sp"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:layout_gravity="center"

                    android:clickable="true"

                    android:text="取消" />

            </FrameLayout>

        </LinearLayout>

    </LinearLayout>

 

</LinearLayout>

 

 

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context=".MainActivity" >

 

    <Button

        android:id="@+id/button" 

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

android:onClick="Click" 

android:text="弹出自定义对话框"

        />

 

</RelativeLayout>

 

自己写的封装的自定义对话框

MyDialog.java

package com.example.customdialog;

 

import android.app.Dialog;

import android.content.Context;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

 

public class MyDialog extends Dialog implements View.OnClickListener {

 

private Context context;

public MyDialog(Context context) {

super(context,R.style.model_dialog);//使用自定义主题

setContentView(R.layout.tipdialog);//设置自定义布局

this.context = context;

init();

}

public MyDialog(Context context,int msg){

super(context,R.style.model_dialog);

setContentView(R.layout.tipdialog);

this.context = context;

TextView content = (TextView)findViewById(R.id.content_text);

content.setText(msg);

init();

}

private void init() {

setCancelable(false);//取消返回事件

setCanceledOnTouchOutside(false);//点击对话框外的事件无效

Button confirm = (Button)findViewById(R.id.confirm);

Button cancle = (Button)findViewById(R.id.cancel);

confirm.setOnClickListener(this);//设置点击事件

cancle.setOnClickListener(this);

}

@Override

public void onClick(View view) {

int id = view.getId();

if(mClickListener == null){

return;

}

if(id == R.id.confirm){

mClickListener.onConfirmClick(this);//回调接口

}else{

mClickListener.onCancleClick(this);

}

}

public ClickListener mClickListener;

public MyDialog setClickListener(ClickListener clickListener){

mClickListener = clickListener;

return this;

}

public interface ClickListener{

void onConfirmClick(MyDialog myDialog);

void onCancleClick(MyDialog myDialog);

}

 

}

 

Activity:MainActivity.java

 

package com.example.customdialog;

 

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

 

public class MainActivity extends Activity {

 

private Button button;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

init();

}

 

private void init() {

button = (Button)findViewById(R.id.button);

}

public void Click(View view){

showDialog();

}

public void showDialog(){

final MyDialog dialog = new MyDialog(this,"退出程序?");

dialog.setClickListener(new MyDialog.ClickListener() {

@Override

public void onConfirmClick(MyDialog myDialog) {

Toast.makeText(getApplicationContext(), "点击了确定按钮", Toast.LENGTH_SHORT).show();

dialog.cancel();

}

@Override

public void onCancleClick(MyDialog myDialog) {

Toast.makeText(getApplicationContext(), "点击了取消按钮", Toast.LENGTH_SHORT).show();

dialog.cancel();

}

});

dialog.show();

}

 

 

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

 

}

 

color.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <color name="not_color">#00000000</color>

    

</resources>

 

posted @ 2018-01-20 21:34  Mr.zzz  阅读(51)  评论(0编辑  收藏  举报