AlertDialog设置自定义高度

AlertDialog

在开发中,AlertDialog是十分不错的类,它提供给我们一个通用对话框,我们只需要简单的设置一些东西就可以实现了一个具有简单功能的对话框了,包括按钮,或者是列表等等,但是我们可以注意到一个问题,那就是对话框的大小,它是自适应的,如果内容太大,我们的显示就出现了问题,比如下面的情况:

可以看到,这个内容已经占了很大的空间,看起来不是很美观,所以我们想设置它的自定义大小,比如说就是占屏幕的1/2,这样就可以看起来不错,但是该怎么做的?

自定义高度

源码:

        String items[] = new String[]{"菜单1","菜单2","菜单3","菜单4"};
        AlertDialog.Builder builder = new AlertDialog.Builder(this).setTitle(
                "菜单").setItems(items, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                //自己实现的内容
                dialog.dismiss();
            }

        });
        AlertDialog ab = builder.create();
        ab.show();
        WindowManager manager = getWindowManager();
        Display d = manager.getDefaultDisplay();
        Window window = ab.getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.height = (int) (d.getHeight() * 0.5);
        params.gravity = Gravity.CENTER_HORIZONTAL;
        ab.getWindow().setAttributes(params);

实现思路

  1. 我们需要生成一个AlertDialog.Builder的对象来生成AlertDialog对象,因为我们不能直接new出一个对象,我们在Builder对象设置好内容,然后调用Builder的create方法来生成一个AlertDialog对象。
  2. 我们需要得到一个WindowManger对象和一个Display对象,用处是得到屏幕的分辨率。
  3. 我们需要需要得到一个Window对象,对AlertDialog的方法来得到,此时Window对象就是AlertDialog对象的一个实体了。
  4. 我们需要得到LayoutParams的对象,然后我们设置高度,用params.height = (int) (d.getHeight() * 0.5)这一行代码就可以设置高度了,为屏幕高度的一半。
  5. 最后一步就是将LayoutParams对象设置到我们之前得到的Window对象中,这样我们就可以大功告成了^_^

注意

代码是简单的,但是开始写的时候我们还是很多的,因为总是无法应用成功,原因最后找到了,不过是很坑的原因,希望大家有所注意。

我总是想当然的以为设置好了高度之后才调用AlertDialog的show()方法,其实错误就是在这里,我们一定要先调用show()方法,再得到Window的对象,然后我们才可以设置高度。如果我们提前设置了高度,然后才调用show()方法,那么是不会有用的。因为只有先显示,我们才能得到显示的具体参数,然后Window对象才能有具体的值才可以被我们设置。

有什么不太了解的,欢迎大家和我交流。
时间: 2024-12-28 04:46:31

AlertDialog设置自定义高度的相关文章

SharePoint 2013 设置自定义布局页

在SharePoint中,我们经常需要自定义登陆页面.错误页面.拒绝访问等:不知道大家如何操作,以前自己经常在原来页面改或者跳转,其实SharePoint为我们提供了PowerShell命令,来修改这些页面为我们自己的布局页. 具体设置,可以通过PowerShell命令的Identity参数来修改,可以修改的参数主要包括None.AccessDenied.Confirmation.Error.Login.RequestAccess.Signout 或WebDeleted. 设置自定义布局页的映射

apache设置自定义header

1. 在设置自定义header前,需要先检测一下你的httpd是否加载了mod_headers /usr/local/apache2/bin/apachectl  -l 如果,显示有mode_headers.c  则是加载了这个模块,否则就需要重新编译一下了.另外,如果你使用的是rpm安装的话,那肯定是已经加载了mod_headers这个模块的. 2.  在httpd.conf 中加入 Header add MyHeader "Hello" 保存后,重启apache就可以了双引号中的内

设置自定义闪屏页

设置自定义闪屏页 by 伍雪颖 UILaunchStoryboardName

Android实例-手机安全卫士(四十二)-设置自定义Toast位置

一.目标 设置自定义Toast窗口的显示位置(第1-2步): 二.代码实现 1.在“显示号码归属地”服务(ShowPhoneAddService)类中的自定义吐司(myToast)方法中,通过窗口对象WindowManager.LayoutParams(params)的gravity属性可设置自定义Toast的对齐方式(顶部:Gravity.TOP,左上角:Gravity.TOP+Gravity.LEFT): 2.通过窗口对象WindowManager.LayoutParams(params)的

动态设置iframe高度

<%//动态设置iframe高度 %><script language="javascript" type="text/javascript">      function SetWinHeight(obj) {                              var win = obj;        if (document.getElementByIdx_x) {            if (win && !

自动设置iframe高度和禁止backspace后退js

function iFrameHeight(iframeId) {        var ifm = document.getElementById(iframeId);        var subWeb = document.frames ? document.frames[iframeId].document                : ifm.contentDocument;        if (ifm != null && subWeb != null) {      

xcode5设置自定义*.xib文件为main interface

从xcode5/iOS SDK 7.0开始,新建Single View Application默认界面是*.storyboard文件 如果删除*.storyboard新建自定义的xib文件,然后在Project Settings里设置的Main Interface为xib文件的话,运行时会报NSNullException错误. 用以下方法修改 AppDelegate.h/AppDelegate.m两个文件就可以使用自定义的xib做Main Interface 首先Project Settings

在ListCtrl控件中设置自定义光标

::SetCursor(::LoadCursor   (::AfxGetInstanceHandle(),   MAKEINTRESOURCE(IDB_BMP_MOUSE))); void   CMyListCtrl::OnItemchanged(NMHDR*   pNMHDR,   LRESULT*   pResult) {                   NM_LISTVIEW*   pNMListView   =   (NM_LISTVIEW*)   pNMHDR;          

textarea高度自适应(可设置最大高度)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con