Android开发实践:用PopupWindow实现自定义Dailog

Android的PopupWindow是个很有用的widget,利用它可以实现悬浮窗体的效果,比如实现一个悬浮的菜单,最常见的应用就是在视频播放界面里,做一个工具栏,用来控制播放进度。本文利用PopupWindow来实现一个通用的Dailog,类似Android系统的AlertDailog,从中学习和掌握有关PopupWindow和Dailog的使用和实现细节。

界面效果如图所示,点击 Click 按钮后,弹出对话框提示。

1. CustomDailog的布局

首先定义 CustDailog的布局文件,由系统的AlertDailog可以知道,一个对话框包含了三个要素,一个是Title,即标题,一个是Message,即主体内容,还有一个是Button,即确定和取消的按钮,用来与用户交互。因此,布局设计如下:

<?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:orientation=”vertical”android:background=”@drawable/shape_bg”android:layout_margin=”10dp”><TextViewandroid:id=”@+id/CustomDlgTitle”android:layout_width=”match_parent”android:layout_height=”wrap_content”android:textStyle=”bold”android:textSize=”20sp”android:layout_margin=”10dp”android:gravity=”center”/><Viewandroid:layout_width=”match_parent”android:layout_height=”1dp”android:background=”@android:color/darker_gray”/><LinearLayoutandroid:id=”@+id/CustomDlgContentView”android:layout_width=”match_parent”android:layout_height=”wrap_content”android:orientation=”vertical”android:layout_margin=”5dp” /><TextViewandroid:id=”@+id/CustomDlgContentText”android:layout_width=”match_parent”android:layout_height=”wrap_content”android:textSize=”15sp”android:layout_margin=”5dp”android:paddingLeft=”5sp”/><LinearLayoutandroid:layout_width=”match_parent”android:layout_height=”wrap_content”android:orientation=”horizontal”android:layout_margin=”5dp” ><Buttonandroid:id=”@+id/CustomDlgButtonOK”android:layout_width=”0dp”android:layout_weight=”0.5″android:layout_height=”wrap_content”android:visibility=”gone”/><Buttonandroid:id=”@+id/CustomDlgButtonCancel”android:layout_width=”0dp”android:layout_weight=”0.5″android:layout_height=”wrap_content”android:visibility=”gone”/></LinearLayout></LinearLayout>

其中,shap_bg.xml 是Dailog的背景的定义文件,你可以修改此文件,来改变Dailog的背景:

<?xml version=”1.0″ encoding=”UTF-8″?><shape android:shape=”rectangle” xmlns:android=”http://schemas.android.com/apk/res/android”><solid android:color=”#e6ecee” /><stroke android:width=”1.0dip” android:color=”@android:color/darker_gray” /><corners android:radius=”8.0dip” /></shape>

(2) CustomDailog的定义

CustomDailog的接口,可以类比AlertDailg的接口定义,主要包括如下一些方法:

1. setTitle 设置标题

2. setMessage 设置主体内容

3. setPositiveButton 设置 “确定” 按钮

4. setNegativeButton 设置 “取消” 按钮

5. show 显示

6. dimiss 消失

其定义如下:

package com.ticktick.popdailog;import android.content.Context;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup.LayoutParams;import android.widget.Button;import android.widget.LinearLayout;import android.widget.PopupWindow;import android.widget.TextView;public class CustomDailog {private View mParent;private PopupWindow mPopupWindow;private LinearLayout mRootLayout;private LayoutParams mLayoutParams;//PopupWindow必须有一个ParentView,,所以必须添加这个参数public CustomDailog(Context context, View parent) {mParent = parent;LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//加载布局文件mRootLayout = (LinearLayout)mInflater.inflate(R.layout.custom_dailog, null);mLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);}//设置Dailog的标题public void setTitle(String title) {TextView mTitle = (TextView)mRootLayout.findViewById(R.id.CustomDlgTitle);mTitle.setText(title);}//设置Dailog的主体内容public void setMessage(String message) {TextView mMessage = (TextView)mRootLayout.findViewById(R.id.CustomDlgContentText);mMessage.setText(message);}//设置Dailog的“确定”按钮public void setPositiveButton(String text,OnClickListener listener ) {final Button buttonOK = (Button)mRootLayout.findViewById(R.id.CustomDlgButtonOK);buttonOK.setText(text);buttonOK.setOnClickListener(listener);buttonOK.setVisibility(View.VISIBLE);}//设置Dailog的“取消”按钮public void setNegativeButton(String text,OnClickListener listener ) {final Button buttonCancel = (Button)mRootLayout.findViewById(R.id.CustomDlgButtonCancel);buttonCancel.setText(text);buttonCancel.setOnClickListener(listener);buttonCancel.setVisibility(View.VISIBLE);}//替换Dailog的“主体”布局public void setContentLayout(View layout) {TextView mMessage = (TextView)mRootLayout.findViewById(R.id.CustomDlgContentText);mMessage.setVisibility(View.GONE);LinearLayout contentLayout = (LinearLayout)mRootLayout.findViewById(R.id.CustomDlgContentView);contentLayout.addView(layout);}//设置Dailog的长宽public void setLayoutParams(int width, int height) {mLayoutParams.width = width;mLayoutParams.height = height;}//显示Dailogpublic void show() {if(mPopupWindow == null) {mPopupWindow = new PopupWindow(mRootLayout, mLayoutParams.width,mLayoutParams.height);mPopupWindow.setFocusable(true);}mPopupWindow.showAtLocation(mParent, Gravity.CENTER, Gravity.CENTER, Gravity.CENTER);}//取消Dailog的显示public void dismiss() {if(mPopupWindow == null) {return;}mPopupWindow.dismiss();}}

(3) 在Activity中的使用方法

记忆像是倒在手心里的水,不论是摊平还是握紧,

Android开发实践:用PopupWindow实现自定义Dailog

相关文章:

你感兴趣的文章:

标签云: