在android中创建一个对话框可以通过直接用AlterDialog.Builder类来创建一个对象,然后通过调用这个对象的setMessage()设置这个对话
框的的显示信息,如果你需要类似于确定、取消这种按钮,你可以调用这个对象的setPositiveButton()方法和setNegativeButton()方法,
当然你还可以创建一个类,让它继承DialogFragment这个类,然后复写onCreateDialog的方法,在这个方法中用AlterDialog.Builder类来创
建一个对象,然后和上述一样操作,这是对于使用AlterDialog.Builder类的两种形式,其本质是一样的,而另一个方法同样是创建一个类,
让它继承DialogFragment这个类,只不过复写的是onCreateView()方法,这个方法需要你自己定义一个布局,这个布局的作用是给你创建的
对话框使用的,然后通过View view=inflater.inflate(R.layout.activity_dialog, container);代码,将布局文件和对话框匹配到,然后
return view;,通过这种方式得到对话框的好处是自己可以定义对话框的格式,但是我发现通过这种方式创建的对话框无法通过点击取消按
钮来退出对话框,然后我上网查询如何做到通过按钮取消,发现全是用AlertDialog.Builder来创建对话框的,没有看到用这种方式创建对
话框,即使有的话也没有说如何点击取消按钮来退出对话框,然后我就想算了,反正知道一个方法就好了,管他呢,然后就没管。

但是昨天晚上有个人打电话给我,我们聊了挺久,他说程序员应该较劲,应该有一点强迫症,然后我就觉得不能放弃,然后我今天又重新写这个程序,
昨天我虽然没做对,然后我今天按照书上的程序打了一下,但是书上的程序写的好复杂,而且大家都懂的,看这种类型的书需要一个章节的
看,因为它可能由于之前写了这份代码,然后在这里就没写,但是这一章内容有点多,于是我便将实现对话框的主要函数看了一下,然后当
我把这些自己写在程序中时(我又重新建了一个项目,因为这样看上去比较简洁,不会有别的因素干扰),发现书上的代码是建了两个
activity,一个是用来构建对话框,还有一个是调用这个activity的主界面activity,但是我自己的是一个activity,我又不想重新写过,
然后我就停下来思考,我如果继续这样写下去,就会遇到和昨天一样的问题,那就是在一个activity中有两个布局文件,如果我用
findViewById()方法来找到对话框布局文件中的控件,这时就会报空指针异常,大意是说这个控件的引用是空的,也就是说我无法通过
findViewById()方法来找到对话框布局文件中的控件,然后我就百度了一下findViewById()方法的作用,然后发现是因为我用的是
findViewById()方法,这个方法默认省略了this,而如果你需要获取别的xml文件的控件,就需要通过获取的View调用findViewById()方法
然后就发现这个问题解决了,然后运行程序,但是我又发现点击取消按钮还是没用,然后发现原来是我没有绑定到监听器中,没有添加
sureButton2.setOnClickListener(this);这行代码,然后完成后运行就发现可以了。这时我又想,这个this到底是什么呢?我已经见过很多
次了,但是糊里糊涂的,还有findViewById()方法到底是怎么实现的,然后我就开始查询源代码,因为我是用view调用了findViewById()方
法,所以我就直接去查了view,然后在view中找到了这个方法,然后发现在这这个方法中调用了findViewTraversal()方法,但是这个方法中
只有 {if (id == mID) { return this;} return null;}这些代码,然后问题来了,这个mID在Source Insight软件中是黑色的,就是说不能
再点进去,线索到这就断了,然后我就找View的最开始,这一般是我的习惯,当线索断了时我就会往最上面翻,然后看到这行代码:
@see android.view.ViewGroup,这时我就直接在右边输入了ViewGroup这个类,然后查找了一下findViewById这个方法,但是发现没有,然
后我就想,这个findViewById到底是怎么实现的,函数体是什么?然后我就百度了一下使用findViewById()要引用哪个包,我的本意就是想
知道这个方法到底在哪被实现了查找的功能,结果我看到一篇深入理解findViewById原理的文章,点进去看了一下,结果令我无语的是前面
的步骤和我差不多,但是就在ViewGroup这个View的子类中居然还隐藏着findViewTraversal()方法,也就是说ViewGroup重写了这个方法,然
后我继续阅读这篇文章,然后看到这个方法的函数体,这个函数体的返回一个View对象,看这篇文章上写的原理是说,从头开始找,遇到有子
控件的就递归接着找,我自己看这个函数是没有看到这样的结果,我只是看着代码,觉得它是在循环找对应id的控件,因为下面一行代码看的
不是很清楚:v.mPrivateFlags & PFLAG_IS_ROOT_NAMESPACE) == 0,mPrivateFlags变量实在View类中定义的,而PFLAG_IS_ROOT_NAMESPACE
实在ViewGroup中定义的,前面的是一个int型,后面的是一个十六进制的数,不是很懂这是什么意思,但是通过单词的意思大概是一直寻找
直到这些标志位变为零,然后就找到这个view,然后返回,这时我想这个方法返回的是一个View又不是控件,是不是还没结束,但是我又找不
到别的线索,然后我就想是不是控件都是View的子类,然后去看继承关系发现果然是,这也就是说我大概明白的这个findViewById()大概是怎
么个原理,也就是说这个方法是View中的,我们习惯上用的方式是省略了this,也就是对应的View,然后返回一个View对象,这个对象是控件
的引用,那么这个问题解决了,还有一个问题,this到底是什么呢?