Android:自定义Material Design风格的Dialog

3.1.1 MaterialDesign中DrawerHost使用案例 DrawerHost 是 MaterialDesignInXAML Toolkit 中实现 Material Design 侧边抽屉导航的控件 阅读详情

Android:自定义Material Design风格的Dialog


项目需要,所以来做一个Material Design风格的选择的对话框。

界面如下所示:



先来看看布局文件:

<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dialog_rootView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#55000000"
    android:padding="32dp" >

    <RelativeLayout
        android:id="@+id/contentDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="@drawable/dialog_background"
        android:padding="24dp" >

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:text="Title"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="#000" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/title"
            android:orientation="vertical"
            android:paddingBottom="20dp" >

            <ListView
                android:id="@+id/list_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:footerDividersEnabled="true" >
            </ListView>
        </LinearLayout>
    </RelativeLayout>
</RelativeLayout></span>

实现起来比较简单,我们看图就知道 ,我们需要一个title,也就是标题栏,所以布局中有一个TextView来承载标题的文本内容,下面就是一个listview,用于加载我们的每一项。
所以我们在代码中主要就是要处理后这两个控件。

自定义Dialog代码:

<span style="font-size:14px;">package com.testdialog.testmydialog;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Animation.AnimationListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class ItemDialog extends android.app.Dialog {

	Context context;
	View view;
	View backView;
	ListView listView;
	ArrayAdapter<String> adapter;

	String[] messages;
	String title;
	TextView titleTextView;
	
	OnItemClickListener itemClickListener;

	public ItemDialog(Context context, String title, String[] messages) {
		super(context, android.R.style.Theme_Translucent);
		this.context = context;
		this.messages = messages;
		this.title = title;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.dialog);

		view = (RelativeLayout) findViewById(R.id.contentDialog);
		backView = (RelativeLayout) findViewById(R.id.dialog_rootView);
		backView.setOnTouchListener(new OnTouchListener() {

			@SuppressLint("ClickableViewAccessibility")
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getX() < view.getLeft()
						|| event.getX() > view.getRight()
						|| event.getY() > view.getBottom()
						|| event.getY() < view.getTop()) {
					dismiss();
				}
				return false;
			}
		});

		this.titleTextView = (TextView) findViewById(R.id.title);
		setTitle(title);
		
		this.listView = (ListView) findViewById(R.id.list_view);
		adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, messages);
		listView.setAdapter(adapter);
		
	}
	//get title
	public String getTitle() {
		return title;
	}
	//set title
	public void setTitle(String title) {
		this.title = title;
		if(title == null)
			titleTextView.setVisibility(View.GONE);
		else{
			titleTextView.setVisibility(View.VISIBLE);
			titleTextView.setText(title);
		}
	}
	
	@Override
	public void dismiss() {
		Animation anim = AnimationUtils.loadAnimation(context,
				R.anim.dialog_main_hide_amination);
		anim.setAnimationListener(new AnimationListener() {

			public void onAnimationStart(Animation animation) {
			}

			public void onAnimationRepeat(Animation animation) {
			}

			public void onAnimationEnd(Animation animation) {
				view.post(new Runnable() {
					public void run() {
						ItemDialog.super.dismiss();
					}
				});

			}
		});
		Animation backAnim = AnimationUtils.loadAnimation(context,
				R.anim.dialog_root_hide_amin);

		view.startAnimation(anim);
		backView.startAnimation(backAnim);
	}
	
	public void setOnItemClickListener(OnItemClickListener itemClickListener){
		this.itemClickListener = itemClickListener;
		if(listView != null){
			listView.setOnItemClickListener(itemClickListener);
		}
	}
}
</span>

代码中主要是处理TextView的数据加载初始化,以及listview的数据添加,事件处理的接口。再有就是用户点击对话框外的区域就行对话框的关闭。


最后是使用方法:

<span style="font-size:14px;">package com.testdialog.testmydialog;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class MainActivity extends Activity {
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				showItemDialog();
			}
		});
	}
	
	private void showItemDialog(){
		String[] messages = {"百度地图","卫星地图","热力地图"};
		ItemDialog dialog = new ItemDialog(this, "请选择地图类型", messages);
		dialog.show();
		dialog.setOnItemClickListener(new OnItemClickListener() {

			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				Toast.makeText(MainActivity.this, "王灿"+position, Toast.LENGTH_SHORT).show();
			}
		});
	}
}</span>

最后,附上完整源码:

http://download.youkuaiyun.com/detail/cassiepython/9117091


自定义MaterialDesign风格的Dialog 立即下载

相关推荐

Android代码-又一个漂亮的 Android MD 风格日历效果。

Material Design Calendar A Material design calendar inspired by the CalendarView of School Diary. Usage Add CalendarView into your layouts or view hierarchy. Example: Check the example app for more information. Contributing Would you like to contribute? Fork us and send a pull request! Be sure to checkout our issues first. License Copyright (c) Josue Mavarez 2017 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the Li

WPF MaterialDesignInXamlToolkit Dialog使用

前言 用WPF做一款收银系统的PC端,使用了MaterialDesignInXamlToolkit。 场景 在点击登录时需要避免用户重复多次操作,原本是想在登录按钮的点击事件加入禁用按钮的逻辑,后面发现禁用后会导致按钮样式被改变,而且需要写的代码有点多,怕乱(没错,本人就是懒),为了能更好的实现想要的效果且代码量少且优雅。就打算用MaterialDesignInXamlToolkit给登录页...

___z_h_a_o的博客 1万+

android 自定义Dialog提示+动画效果

一个可以直接使用的自定义AlertDialog,封装的很完整的一个Demo,可以灵活使用,里面提示图标还额外添加了动画效果,希望可以帮到大家。

自定义material design 风格的Dialog

自定义dialog/** * 这是兼容的 AlertDialog ,最后又贴出源码,不过最好打打哈 */ private void showDialog() { /* 这里使用了 android.support.v7.app.AlertDialog.Builder 可以直接在头部写 import android.support.v7.app.AlertDialog 那么下面就可以写

简国堂的博客 1408

MaterialDesign风格的进度对话框

在非android5.0实现MaterialDesign风格的进度对话框

unity 腾讯地图sdk移动和缩放代码

unity 腾讯地图sdk 实现移动端 缩放 和 移动

。。。。。 1283

AlertDialog使用和自定义

AlertDialog的使用和自定义

feather(猎羽) 3622

关于图像傅里叶变换得到的频谱图的通俗理解

傅里叶变换过程: 经过傅里叶变化且频谱居中化处理的频谱图: 1.如果将图像某一行上的灰度变化看作是一个离散信号,那么整张图像可以看作是一个分布在二维平面上的信号,因此图像可看作是空间域信号。傅里叶变换则是将图像灰度分布(空间域信号)变换到了频域上,给我们提供了观察图像的另一个视角。 2.图像的频谱图(频谱居中后)的中心点是频率最低点,以该点为圆心,不同半径的上的点表示不同的频率。这里的图像频率是指对应原图像中的某灰度曲线变化的快慢(这么说不严谨,但是按照上面第1点的角度,似乎也可以这么理解

daimashiren的博客 2万+

[Android] Material 风格的 Dialog 的使用

前言 谷歌发布了 Material Design 设计之后,很多 Material 风格的控件也随之加入到了 V7 兼容包中. Android Support Library v22.1 中开始提供了 Material 风格的 Dialog 控件 。 这为开发者提供了很好的支持,省去了使用开源库或自己设计的烦恼。 下面我们来看看如何使用 Material 风格的 Dialog 。 兼

燕赵之骄子的专栏 1040

【Gin框架入门到精通系列01】Gin框架介绍与环境搭建

本文是Gin框架入门到精通系列的第一篇,系统介绍Gin框架的基本概念、核心特性以及环境搭建。无论你是Go语言新手还是有经验的开发者,都能通过本文快速掌握Gin框架的基础知识,创建并运行你的第一个Gin应用。

GopherTribe的博客 1560

ZYNQ 系统的IEEE1588 实现方法

zynq IEEE588/PTP 实现方案(讨论稿)

姚家湾博客 1万+

android material风格,[Android] Material 风格的 Dialog 的使用

前言谷歌发布了 Material Design 设计之后,很多 Material 风格的控件也随之加入到了 V7 兼容包中.Android Support Library v22.1 中开始提供了 Material 风格的 Dialog 控件 。这为开发者提供了很好的支持,省去了使用开源库或自己设计的烦恼。下面我们来看看如何使用 Material 风格的 Dialog 。兼容的 AlertDial...

weixin_42403100的博客 534

深入解析i2cdetect:从基础命令到高级读写操作

本文深入解析Linux下i2cdetect工具,从基础安装、总线扫描到高级读写操作。作为i2c-tools的核心组件,i2cdetect是硬件调试的得力侦探,能快速识别I2C总线上的设备地址。文章还涵盖了i2cdump、i2cset、i2cget等进阶工具,并介绍了如何在C程序中调用读写接口进行嵌入式开发,是掌握I2C通信调试的实用指南。

weixin_29189987的博客 371

Material Components for Android Dialog 完整指南:从 MaterialAlertDialogBuilder 到 Material 3 主题定制

本文围绕 Material Components for Android(MDC-Android)中的 **Dialog(对话框)组件**展开,系统讲解基本对话框(Basic dialog)与全屏对话框(Full-screen dialog)两种形态的解剖结构、全部关键属性(容器、标题、内容、按钮、遮罩)、基于 `MaterialAlertDialogBuilder` 的代码实现,以及通过 `Th

gitblog_01046的博客 946

手把手教你用FPGA解析AD9680的JESD204B数据流(附Verilog代码)

本文详细介绍了如何利用FPGA解析AD9680的JESD204B数据流,包括协议核心机制、硬件平台搭建、Verilog代码实现及调试技巧。通过实战案例和代码示例,帮助工程师快速掌握高速ADC数据采集与处理技术,提升系统性能。

weixin_33640562的博客 371

Glue)《Multi-omics single-cell data integration and regulatory inference with graph-linked embedding》

论文引入GLUE框架,通过知识引导图(guidance graph)显式建模跨层调控交互,桥接特征空间,实现准确、鲁棒、可扩展的整合。近年来,单细胞测序技术(如scATAC-seq用于染色质可及性、snmC-seq用于DNA甲基化、scRNA-seq用于转录组)允许同时探测多个组学层,揭示细胞异质性和调控机制。GLUE优于现有方法:桥接特征空间,避免信息丢失,支持多组学和调控推断。用于整合未配对的单细胞多组学数据(如scRNA-seq、scATAC-seq和snmC-seq),并同时进行调控交互推断。

m0_58293236的博客 1152

Android Material Dialog 教程

Android Material Dialog 教程 1. 项目介绍 Android Material Dialog 是一个强大的Android库,它基于Google的Material Design规范,允许开发者轻松地创建具有动画效果的美观且风格统一的对话框。这个库提供了丰富的API,支持创建带有标题、图标、消息文本、多个按钮以及可选列表项的对话框。此外,即使在运行早期Android版本的设备上...

gitblog_00683的博客 998

点云处理实操(四) -PCL中的点云三角化

点云处理实操(四) -PCL中的点云三角化

cangqiongxiaoye的博客 939

Dialog深度解析:如何实现Material、Kongzue、iOS三种UI风格

Dialog对话框库是一个功能强大的Android对话框解决方案,它提供了Material Design、Kongzue和iOS三种流行的UI风格,让开发者能够轻松实现跨平台统一的用户体验。这个开源项目由空祖家开发,旨在为Android开发者提供最简单、最灵活的对话框调用方式,满足不同产品设计需求。 ## 🎨 三种UI风格概览 Dialog库支持三种主流的UI设计风格,每种风格都有其独特的设

gitblog_00321的博客 389

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Material风格的Dialog

谷歌发布了Material Design设计之后,很多 Material 风格的控件也随之加入到了V7兼容包中。Android Support Library v22.1 中开始提供了Material风格的Dialog控件 。这为开发者提供了很好的支持,省去了使用开源库或自己设计的烦恼。下面我们来看看如何使用 Material风格的 Dialog。 兼容的 AlertDialog

happy_love1990的博客 287

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android Material Design Dialog

 Android Material Design Dialog 如图所示: 代码实现: package zhangphil.materialdesign; import android.app.Activity; import android.os.Bun...

chuoshao2508的博客 101

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ColorPicker实战案例:构建符合Material Design的颜色选择器终极指南

在Android应用开发中,一个美观且功能强大的**颜色选择器**是提升用户体验的关键组件。今天,我将为大家详细介绍如何使用ColorPicker库快速构建符合**Material Design**规范的Android颜色选择器。这个高度可定制的开源库让开发者能够轻松集成专业的颜色选择功能,无论是设置主题颜色还是自定义UI配色,都能完美适配Material Design设计语言。 ## 🎨 为

gitblog_00362的博客 653

如何快速打造Android Material Design对话框:material-dialogs完整指南

material-dialogs是一个基于Android Material Design的UI库,适用于Android和Web应用。它提供了一套美观的对话框组件,可以帮助开发者快速构建应用,特点包括Material Design、易于使用、支持多种主题等。 ## 为什么选择material-dialogs? 在Android应用开发中,对话框是与用户交互的重要组件。一个设计精美、交互友好的对话

gitblog_00625的博客 1051

Material 框架完全指南:用 Swift 打造 Material Design 风格的 iOS 精美应用

Material 是一个面向 iOS 的开源 UI/UX 框架,它把 Google Material Design 的设计语言(卡片、浮动按钮、Snackbar、Material 配色、Roboto 字体、层次阴影等)以纯 Swift 组件的形式引入 App 开发。本文以当前仓库的 [README.md](https://link.gitcode.com/i/f382765a1c574c6dbf1

gitblog_00813的博客 460
上一篇: Android音乐播放器(一):搜索手机存储的音乐
下一篇: Android:使用pagerslidingtabstrip做Tab
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值