当前位置: 移动技术网 > 移动技术>移动开发>Android > Android用PopupWindow实现自定义Dailog

Android用PopupWindow实现自定义Dailog

2019年07月24日  | 移动技术网移动技术  | 我要评论

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">
                                                                                                                                                         
  <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的实现就介绍到这里了。

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网