文档章节

support.v4.app.DialogFragment使用问题总结

artshell
 artshell
发布于 2015/06/11 16:27
字数 701
阅读 2880
收藏 6
点赞 0
评论 0

因app需求问题,需要实现如图这种dialog

看到这里,你可能会说如此easy的事情,还说什么! 那么继续往下看!

场景1:

import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;

public class AlertDialogFragmentActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alert_dialog_fragment);

        findViewById(R.id.show).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog();
            }
        });
    }

    public static class MyAlertDialogFragment extends DialogFragment {
        public static MyAlertDialogFragment newInstance(int title) {
            MyAlertDialogFragment frag = new MyAlertDialogFragment();
            Bundle args = new Bundle();
            args.putInt("title", title);
            frag.setArguments(args);
            return frag;
        }

        @NonNull
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            int title = getArguments().getInt("title");
            // AlertDialog 的内容区
            View contentView = LayoutInflater.from(getActivity()).inflate(R.layout.basic_dialog_fragment, null);
            return new AlertDialog.Builder(getActivity())
                    .setIcon(R.drawable.ic_about)
                    .setTitle(title)
                    .setView(contentView)
                    .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    })
                    .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    })
                    .create();
        }

    }
    void showDialog() {
        DialogFragment newFragment = MyAlertDialogFragment.newInstance(R.string.two_buttons_title);
        newFragment.show(getSupportFragmentManager(), "dialog");
    }
}

实际效果图成了这样

title区的内容不是纵横向居中的,button区完全走样右对齐了,如上图所示,只有绿色内容区是自定义内容,(title和button样式都是Android内置)

这是什么原因造成的?

这是因为当前这个AlertDialogFragmentActivity的theme属性的原因,它继承自AppCompatActivity要求使用 Theme.AppCompat.xxx 系列theme

代码中(AppCompatActivity,DialogFragment,AlertDialog)都是support library中的类,这些的类是配套使用的,你不能在Activity中直接使用support library中的DialogFragment和AlertDialog

尝试在AndroidManifest.xml中将AppCompatActivity的android:theme属性改成"@android:style/Theme.Holo"等,后续得到一个以下异常

Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

Theme.AppCompat.xxx 系列theme可以用于非support library包中的类,反过来Theme.Holo.xxx 或者 Theme.Light.xxx 等系列则无法用于support library包中的类

尝试修改 MyAlertDialogFragment的onCreateDialog 中的AlertDialog.Builder()代码

new AlertDialog.Builder(getActivity(),android.R.style.Theme_Holo_Dialog)

得到的效果图如下,反而更差

场景2:

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;



public class AlertDialogFragmentActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alert_dialog_fragment);

        findViewById(R.id.show).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog();
            }
        });
    }

    public static class MyAlertDialogFragment extends DialogFragment {
        public static MyAlertDialogFragment newInstance(int title) {
            MyAlertDialogFragment frag = new MyAlertDialogFragment();
            Bundle args = new Bundle();
            args.putInt("title", title);
            frag.setArguments(args);
            return frag;
        }

        @NonNull
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            int title = getArguments().getInt("title");
            // AlertDialog 的内容区
            View contentView = LayoutInflater.from(getActivity()).inflate(R.layout.basic_dialog_fragment, null);
            return new AlertDialog.Builder(getActivity())
                    .setIcon(R.drawable.ic_about)
                    .setTitle(title)
                    .setView(contentView)
                    .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    })
                    .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    })
                    .create();
        }

    }
    void showDialog() {
        DialogFragment newFragment = MyAlertDialogFragment.newInstance(R.string.two_buttons_title);
        newFragment.show(getFragmentManager(), "dialog");
    }
}

得到的效果图基本理想:

场景2中没有使用support library中类,而且Theme.AppCompat.xxx系列theme可以兼容低版本API,但是你的App的最小API也要11以上。

鉴于以上原因,最好自定义Dialog的内容区(在你自定义时,模仿将title和button都定义到你的布局中),然后不设置Dialog的title,button属性,只调用AlertDialog.Builder#setView(view),或者Dialog#setContentView(View view)



© 著作权归作者所有

共有 人打赏支持
artshell
粉丝 2
博文 56
码字总数 5163
作品 0
成都
程序员
《PHP基础知识总结》系列-新鸟老鸟通吃

《PHP基础知识总结》文件夹收藏文章列表 总结PHP基础知识,对初学者还是高手都值得参考巩固。 1PHP检查库或函数是否可用的方法 2关于PHP5 Session生命周期介绍 3PHP页面和Mysql数据库的转UTF...

开元中国2015 ⋅ 2015/05/06 ⋅ 0

MongoDB核心贡献者:不是MongoDB不行,而是你不懂!

近期MongoDB在Hack News上是频繁中枪。许多人更是声称恨上了MongoDB,David mytton就在他的博客中揭露了MongoDB许多现存问题。然而恨的人有之偏爱的也同样很多,作为回击:Russell Smith带来...

山海经 ⋅ 2014/07/27 ⋅ 0

MongoDB一些常见及生僻的问题分析

32位 vs 64位 现在大多数的服务器都对32位操作系统实现支持,更有许多新型硬件支持着允许更多RAM的64位操作系统。 MongoDB也同时发布了32位及64位两个版本的数据库。归结于MongoDB使用的内存...

旋转木马-千里马 ⋅ 2016/08/19 ⋅ 0

Java学习之路---计算圆形的面积和周长

题目:计算圆形的面积,其中圆形的半径是随意指定。 源代码以及所有的分析思路都如下: import java.util.Scanner; //引入Scanner类public class TestArea { /** * @param args */public st...

IT阳光罗诺 ⋅ 2017/07/10 ⋅ 0

Spring总结——AOP、JDBC和事务的总结

1.上一次总结了 Spring 的核心三大组件(Core,Beans,Context),今天总结的 AOP、JDBC和事务都可以看成是核心三大组件的应用。 其中 Spring 的事务管理又以 AOP 为基础的声明式事务管理,对...

wf王帆 ⋅ 2016/08/01 ⋅ 0

【MyEclipse】常见问题---XML Problem

前言 刚刚接触了Java的实践项目,需要使用Myeclipse工具,这个工具使用起来需要格外的注意,版本、设置等方面都不是非常的智能化,适应性不太好,这次小编总结的内容,是关于XML problem的问...

m18633778874 ⋅ 05/21 ⋅ 0

CocoaAsyncSocket 通信

所有资源来自github swift socket资源 socketio/socket.io-client-swift swiftsocket/SwiftSocket AlwaysRightInstitute/SwiftSockets 由于各种问题,我不知道什么问题,反正各种问题各种换最...

asjoker ⋅ 2015/12/25 ⋅ 0

10月学习总结:选择合适的框架进行快速开发

前言: 9月没有写学习总结,9月份事情有点多,平时学习时间也太少,工作中也只是重复造了一些轮子,没啥可记录的,就没有总结了,直接大跃进,进行10月总结,如果10月再不总结,那就是大大跃...

卖小女孩的小火柴 ⋅ 2015/11/14 ⋅ 2

使用JSTL的SQL标签库碰到的问题

Date:2012-10-23 Environment:Eclipse 4.2,Tomcat 7,PostgreSQL9.2 今天使用sql:setDataSource碰到的问题,在这里总结一下: 1.错误描述:invalid driver class name: "java.lang.ClassNotFoun......

陈好 ⋅ 2012/10/24 ⋅ 1

技术演讲需要准备什么?

最近参加了 SA Summit 2017 的技术大会分享,在这边总结下并分享一下自己是如何准备的。请老司机们多提点建议。 一、了解观众的诉求 了解需求永远是做任何事的第一步,脱离了观众的诉求都是偏...

6776jkjk ⋅ 2017/12/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

开启Swarm集群以及可视化管理

在搭建的两台coreos服务器上开启swarm集群 前置条件: docker均开启2375端口 同一个局域网内 主服务器上安装Portainer容器 安装Portainer容器执行: docker run -d -p 9000:9000 --restart=a...

ykbj ⋅ 10分钟前 ⋅ 0

单例设计模式

1、单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2、饿汉式单例类 在这个类被加载时,静态变量instance会被初始化,此时类的私有构造子会被调用 饿汉式是典型...

职业搬砖20年 ⋅ 15分钟前 ⋅ 0

前端基础(四):前端国际规范收集

字数:1142 阅读时间:5分钟 前言 由于前端技术的灵活性和杂乱性,导致网上的许多解决方案不够全面甚至是完全错误,容易起到误导作用。所以,我对搜索到的解决方案往往是存疑态度。那么,如何...

老司机带你撸代码 ⋅ 17分钟前 ⋅ 0

Failed to open/create Network-VirtualBox Host-Only

虚拟机版本 : Oracle Vm VirtualBox 5.2.12 报错时机:开网卡二,重启虚拟机报错 "Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Ada......

p至尊宝 ⋅ 21分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

阿里云云栖社区 ⋅ 24分钟前 ⋅ 0

springMVC接收表单时 Bean对象有Double Int Char类型的处理

前台ajax提交表单price为double类型 后台controller就介绍不到 400错误 前台 实体类: public class ReleaseMapIconConfig{ private String id; private long maxValue; private long minVal......

废柴 ⋅ 26分钟前 ⋅ 0

ZOOKEEPER安装

工作需要在ubuntu上配置了一个zookeeper集群,有些问题记录下来。 1. zookeeper以来java,所以首先要安装java。但是ubuntu系统有自带的jdk,需要通过命令切换java版本: $ sudo update-alter...

恰东 ⋅ 29分钟前 ⋅ 0

linux 进程地址空间的一步步探究

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。 那虚拟内存空间...

HelloRookie ⋅ 29分钟前 ⋅ 0

myatis #{}与${}区别及原理

https://blog.csdn.net/wo541075754/article/details/54292751

李道福 ⋅ 32分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

猫耳m ⋅ 33分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部