zoukankan      html  css  js  c++  java
  • Android自定义组件系列【13】——Android自定义对话框如此简单

    在我们的日常项目中很多地方会用到对话框,但是Android系统为我们提供的对话框样子和我们精心设计的界面很不协调,在这种情况下我们想很自由的定义对话框,或者有的时候我们的对话框是一个图片,没有标题和按钮,例如这样的一系列需求,这一篇文章我们来给大家介绍一下如何像使用Activity一样来自定义我们的对话框。

    一般自定义对话框有下面几种办法:

    1、重写Dialog来实现。

    2、获取Dialog的Window对象实现。

    3、使用WindowManager来实现。

    4、使用DialogTheme来实现。

    下面我们来介绍一下第二种和第四种方式,并且将封装好的代码贴出,第三种方式待后面对WindowManager进行介绍的时候再说。

    转载请说明出处:http://blog.csdn.net/dawanganban


    一、自定义Dialog

    主界面布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    	<Button 
    	    android:id="@+id/dialog_custom_button"
    	    android:layout_width="wrap_content"
    	    android:layout_height="wrap_content"
    	    android:text="自定义对话框"/>
    	<Button 
    	    android:id="@+id/dialog_activity_button"
    	    android:layout_width="wrap_content"
    	    android:layout_height="wrap_content"
    	    android:text="Activity对话框"/>
    </LinearLayout>
    用两个按钮来分别弹出两种类型的对话框

    public class MainActivity extends Activity implements OnClickListener{
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		findViewById(R.id.dialog_custom_button).setOnClickListener(this);
    		findViewById(R.id.dialog_activity_button).setOnClickListener(this);
    	}
    
    	@Override
    	public void onClick(View view) {
    		switch (view.getId()) {
    		case R.id.dialog_custom_button:
    			DialogCustom dc = new DialogCustom(MainActivity.this, R.layout.dialog);
    			dc.setDismissButtonId(R.id.close_dialog);
    			break;
    		case R.id.dialog_activity_button:
    			Intent intent = new Intent(MainActivity.this, DialogActivity.class);
    			startActivity(intent);
    			break;
    		default:
    			break;
    		}
    	}
    }
    对自定义对话框的方法进行了简单封装,方便使用,可以依据你的项目需求进行封装。

    package com.example.testcustomdialog;
    
    import android.app.AlertDialog;
    import android.app.AlertDialog.Builder;
    import android.content.Context;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.Window;
    
    /**
     * 公用的自定义对话框
     * @author Administrator
     *
     */
    public class DialogCustom{
    	
    	private android.app.AlertDialog.Builder builder;
    	private int layout;
    	private AlertDialog dialog;
    	private Window window;
    	
    	public DialogCustom(Context context, int layout){
    		builder = new AlertDialog.Builder(context);
    		this.layout = layout;
    	}
    	
    	public DialogCustom(Context context, int theme, int layout){
    		builder = new AlertDialog.Builder(context, theme);
    		this.layout = layout;
    	}
    	
    	public Builder getBuilder(){
    		return builder;
    	}
    	
    	/**
    	 * 获取对话框的Window对象
    	 * @return
    	 */
    	public Window getWindow(){
    		dialog = builder.create();
    		dialog.show();
    		window = dialog.getWindow();
    		window.setContentView(layout);
    		return window;
    	}
    	
    	/**
    	 * 通过ID获取对应的View
    	 * @param id
    	 * @return
    	 */
    	public View getViewById(int id){
    		if(window == null) getWindow();
    		return window.findViewById(id);
    	}
    	
    	/**
    	 * 设置需要添加关闭事件的按钮ID
    	 * @param id
    	 */
    	public void setDismissButtonId(int id){
    		View view = getViewById(id);
    		view.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				dismiss();
    			}
    		});
    	}
    	
    	/**
    	 * 关闭对话框
    	 */
    	public void dismiss(){
    		if(dialog != null){
    			dialog.dismiss();
    		}
    	}
    }
    然后创建Dialog对象添加监听View就可以了,主要工作在布局文件中,也就是你的对话框的内容。

    <?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="match_parent"
        android:orientation="vertical">
        <LinearLayout 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_gravity="center_horizontal"
            android:gravity="center_horizontal"
            android:paddingBottom="30dip"
            android:background="#ffffff">
            <TextView 
                android:layout_width="260dip"
                android:layout_height="40dip"
                android:layout_margin="30dip"
                android:gravity="center"
                android:text="这是ActivityDialog"/>
            <Button 
                android:id="@+id/close_dialog"
                android:layout_width="100dip"
                android:layout_height="30dip"
                android:text="点击关闭"
                android:background="@drawable/close_butten_p"/>
         </LinearLayout>
    </LinearLayout>

    二、使用DialogTheme

        <style name="DialogActivityTheme" parent="android:style/Theme.Dialog">
            <item name="android:windowBackground">@android:color/transparent</item>
            <item name="android:windowFrame">@null</item>
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowIsFloating">true</item>
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:windowContentOverlay">@null</item>
            <item name="android:width">1px</item>
            <item name="android:height">1px</item>
            <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
            <item name="android:backgroundDimEnabled">true</item>
        </style>
    在ActivityManifest.xml中注册DialogActivity

            <activity 
                android:name="com.example.testcustomdialog.DialogActivity"
                android:theme="@style/DialogActivityTheme"
                android:screenOrientation="portrait"></activity>
    这样我们就可以像使用普通Activity一样创建一个对话框了,是不是很简单。

    三、两种对话框总结

    运行起来看似一样的对话框却有很大区别,使用第二种方式创建的对话框其实是一个Activity,所以具有Activity的生命周期和所有特性。它会影响到栈中的其他Activity的生命周期。而且如果在对话框中有需要输入的输入框,建议使用这种方式,可以自动调出输入法并使屏幕自动适应,而第一种方式的对话框创建特别方便,在需要显示一段提示信息的时候建议使用。(源代码下载http://download.csdn.net/detail/lxq_xsyu/8315023

    CSDN博客之星活动开始了,为我投上一票吧:http://vote.blog.csdn.net/blogstar2014/details?username=lxq_xsyu#content


  • 相关阅读:
    hdu1238 Substrings
    CCF试题:高速公路(Targin)
    hdu 1269 迷宫城堡(Targin算法)
    hdu 1253 胜利大逃亡
    NYOJ 55 懒省事的小明
    HDU 1024 Max Sum Plus Plus
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1257 最少拦截系统
    HDU 1069 Monkey and Banana
    HDU 1104 Remainder
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468593.html
Copyright © 2011-2022 走看看