安卓自定义弹出窗口/对话框

15

我正在尝试创建一个完全自定义的对话框或弹出窗口,没有任何默认的Android UI控件(标题、背景、按钮等)。

这是否可能?我花了几个小时搜索,但没有运气... 这似乎应该很容易实现,但我找不到。

最好是通过从XML填充View来实现,但此时任何能正常工作的东西都很好。

谢谢。


1
这可能会有所帮助https://dev59.com/P3I95IYBdhLWcg3wvgl9#2700683 - Sheraz Ahmad Khilji
2个回答

29

我采取的步骤:

  1. 创建一个继承Dialog的类。
  2. 在onCreate中,使用setContentView(x, y)调用x是你的R.layout,y是R.style.popupStyle(见下文)。
  3. 在你的res/values/style.xml中,你需要覆盖默认的DialogWindow样式。我试图只创建一个将此作为其父级的样式,但仍然无法清除所有默认值。所以我检查了Android git树并得到了默认样式,然后复制粘贴了它。这就是它:
<style name="Theme.Dialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowTitleStyle">@android:style/DialogWindowTitle</item>
    <item name="android:windowBackground">@android:drawable/panel_background</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
</style>

你会得到一些错误,只需通过从官方Android styles.xml和themes.xml文件中复制更多内容来解决它们。这是我的styles.xml文件的内容:http://pastebin.com/RRR15YYS

这只给你一个白色的弹出窗口,没有边框,也没有其他东西。开始自定义吧。 :)

感谢mbaird给我指明正确的方向。

[编辑] 我需要再次查找自己的答案,我花了至少十分钟搜索官方Android styles/themes文件,所以在这里,供日后参考: styles.xmlthemes.xml


@benvd - 我按照您的步骤操作,成功地从我的代码中获取了与Android相同的对话框主题。但是我的问题在于重新定位对话框。我希望它能够放置在(x,y)位置。我试图使用布局边距来实现这一点。但是在Dialog.java(framework/base/core/java/android/app)的第143行(android 1.6),我看到了一行w.setGravity(Gravity.CENTER);。这是否会影响我的边距设置?因为我无法将其定位到我想要的位置。一旦我添加了边距,事情就变得混乱了。 - user344801
作为参考,我尝试了这种方法,但发现步骤有点混乱(虽然非常有帮助)。我已经成功地实现了类似的结果,而不必创建一个扩展Dialog类的类。我的方法在这里:https://dev59.com/3m865IYBdhLWcg3wnP2a#3736057 - justinl
为避免编译错误 <style name="MyDialog" parent="android:style/Theme.Dialog"> - EricLarch
只有setContentView(View view,ViewGroup.LayoutParams params)这一个方法。你在哪里找到了带有两个View参数的方法? - lomza

8

看起来你想要真正定制一个AlertDialog。为了实现你想要的效果,你最好创建一个继承Dialog类的自定义类,就像编写一个继承Activity类的活动一样。

你可以在自定义对话框类的onCreate()方法中调用setContentView()来设置布局XML,就像在Activity中一样。

我以前曾遇到过限制AlertDialog定制程度的问题,所以我只能实现自己的Dialog类来获得所需的定制级别。


这仍然会给我系统背景和边框(就像这里的截图:http://developer.android.com/guide/topics/ui/dialogs.html#CustomDialog)。有没有办法禁用它们?我只想要我的视图 - 除了我的视图之外,其他都不要。我会处理绘制背景和其他所有内容。 - benvd
除非您覆盖它,否则始终会得到默认的布局主题。为此,在实例化自定义对话框类时调用带有2个参数的Dialog构造函数,并将自定义主题作为第2个参数传递。 - Mark B
是的,我刚刚弄明白了。我必须跳过一些更多的障碍才能得到我想要的东西。我马上会发布完整的答案。非常感谢。 - benvd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接