欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android用PopupWindow实现自定义Dailog

程序员文章站 2024-02-20 13:29:58
android的popupwindow是个很有用的widget,利用它可以实现悬浮窗体的效果,比如实现一个悬浮的菜单,最常见的应用就是在视频播放界面里,做一个工具栏,用来控...

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

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

Android用PopupWindow实现自定义Dailog

(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">
                                                                                                                                                         
  <textview   
    android: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"/>
                                                                                                                                                           
  <view
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="@android:color/darker_gray"/>
                                                                                                                                                           
  <linearlayout
    android:id="@+id/customdlgcontentview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_margin="5dp" />
                                                                                                                                                         
  <textview
    android:id="@+id/customdlgcontenttext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textsize="15sp"
    android:layout_margin="5dp"
    android:paddingleft="5sp"/>
                                                                                                                                                       
  <linearlayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_margin="5dp" >
                                                                                                                                                         
    <button
      android:id="@+id/customdlgbuttonok"
      android:layout_width="0dp"
      android:layout_weight="0.5"
      android:layout_height="wrap_content"
      android:visibility="gone"/>
                                                                                                                                                             
    <button
      android: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;
  }
                                                                        
  //显示dailog
  public 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中的使用方法

由于 popupwindow 的显示必须给一个parentview,在activity中使用的话,最简单的方法就是将整个activity的“根view”传递给这个popupwindow,这样就可以在整个屏幕的正*来显示dailog,获取acitivity的根view的方法如下:

findviewbyid(android.r.id.content)).getchildat(0);

因此,上面定义的 cunstomdailog的使用方法如下所示:

final customdailog dailog = new customdailog(this,getrootlayout());
dailog.settitle("warning");
dailog.setmessage("this is ticktick's blog!");
dailog.setpositivebutton("ok", new onclicklistener() {    
  @override
  public void onclick(view v) {
    dailog.dismiss();     
  }
});
dailog.setnegativebutton("cancel", new onclicklistener() {    
  @override
  public void onclick(view v) {
  dailog.dismiss();     
  }
});
dailog.show();

到此为止,整个dailog的实现就介绍到这里了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。