AlertDialog.Builder:setView;自定义视图未显示。

3
我有一个视频列表,用户在我的应用中记录了这些视频。当用户在ListView中长按视频名称时,会弹出对话框,让用户选择:播放、重命名和删除。点击播放会弹出视频播放器的选择器以播放视频,正常工作。点击删除会弹出另一个确认对话框,询问用户是否要删除该视频,也能正常工作。当点击重命名时,它应显示另一个AlertDialog,其中包含自定义视图的EditText,以便让用户重新命名视频。
下面是为重命名AlertDialog设置的自定义视图的XML:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/flRename"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <EditText
        android:id="@+id/etRename"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint_rename" />
</FrameLayout>

在onCreate中,我设置了自定义视图和AlertDialog:

vRename   = getLayoutInflater().inflate(R.layout.rename, null);
etRename  = (EditText)vRename.findViewById(R.id.etRename);

adRename = new AlertDialog.Builder(context)
    .setIcon(R.drawable.ic_launcher)
    .setMessage("Rename video:")
    .setPositiveButton("Rename", dioclRename)
    .setNegativeButton("Cancel", null)
    .setTitle(getString(R.string.app_name))
    .setView(vRename)
    .create();

当AlertDialog弹出时,它会显示图标、标题、消息和按钮,但不会显示自定义视图。


1
你的 XML 中 EditText 的 ID 是 etRename,但是在代码中却是 R.id.etFilename。你有检查过吗? - MilanNz
不是问题,但你的眼睛真尖。这个问题肯定会在以后引起麻烦。我有另一个视图使用了同样的名称,所以Eclipse没有给我抛出错误。 - Adam Komar
2个回答

1
AlertDialog 文档中可以看到:

If you want to display a more complex view, look up the FrameLayout called "custom" and add your view to it:

FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom);
fl.addView(myView, new LayoutParams(MATCH_PARENT, WRAP_CONTENT));

那么可能要调用:

FrameLayout fl = (FrameLayout) adRename.findViewById(android.R.id.custom);
fl.addView(vRename, new LayoutParams(MATCH_PARENT, WRAP_CONTENT));

或者检查是否将 create() 切换为 show() 有所帮助。


在构建器链之前,adRename是一个空对象,因此尝试在adRename上调用findViewById()会导致NullPointerException。另外,我不想在链发生的时候显示对话框;只需初始化对话框,使其准备好使用,所以将create()更改为show()并不好。 - Adam Komar

0

我现在无法查找源代码,但请尝试从链中删除此调用setMessage()(以及可能与标题和图标相关的内容)。

首先,这没有意义,因为您提供自己的布局。其次,此调用实际上可能会阻止自定义视图的使用。


我只尝试过在链中使用 setView()create(),但仍然不起作用。在这种情况下,屏幕会稍微变暗,什么都不显示。 - Adam Komar
1
@AdamKomar 你确定屏幕中间没有 @string/hint_rename 的小写字母吗? :) 或许是因为你的两个视图都是透明的,所以你看不到任何东西。不过,EditText 的提示应该仍然可见。尝试在框架视图中添加 android:background - AndroidEx
我喜欢跳出常规思维方式。不幸的是,现在好像不是这种情况。我设置了 android:background="@android:color/black",甚至使用 android:textColor="@android:color/white" 设置了 etRename,以确保它们对比鲜明,但仍然没有效果。在 Eclipse 的图形布局预览中显示得很好,但应用程序运行时却没有任何效果。为了以防万一,我仍然会保留这些设置。@Android777 - Adam Komar
@AdamKomar 嗯,这很奇怪...让我再想一下。顺便问一下,你使用的是什么上下文?是 Activity 而不是 Application 吗? - AndroidEx
new Dialog(context) 返回了 null,这是另一个我不想处理的头疼问题。 - Adam Komar
显示剩余6条评论

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