Android AlertDialog.Builder:setView;自定义视图不显示
我有一个用户在我的应用程序中录制的视频列表。当用户在ListView中长时间单击视频名称时,会弹出一个对话框,为用户提供以下选项:播放、重命名、删除。播放为视频播放器打开一个选择器以播放视频。它本该起作用的。删除会弹出另一个对话框,确认用户是否要删除视频。它也能正常工作。单击“重命名”时,应该显示另一个AlertDialog,其中包含来自自定义视图的EditText,以便用户重命名视频 以下是重命名警报对话框的自定义视图集的XML:Android AlertDialog.Builder:setView;自定义视图不显示,android,android-custom-view,android-alertdialog,Android,Android Custom View,Android Alertdialog,我有一个用户在我的应用程序中录制的视频列表。当用户在ListView中长时间单击视频名称时,会弹出一个对话框,为用户提供以下选项:播放、重命名、删除。播放为视频播放器打开一个选择器以播放视频。它本该起作用的。删除会弹出另一个对话框,确认用户是否要删除视频。它也能正常工作。单击“重命名”时,应该显示另一个AlertDialog,其中包含来自自定义视图的EditText,以便用户重命名视频 以下是重命名警报对话框的自定义视图集的XML: <?xml version="1.0" encoding
<?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>
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显示时,它有图标、标题、消息和按钮,但没有自定义视图。来自文档:
如果要显示更复杂的视图,请查找名为“自定义”的FrameLayout并将视图添加到其中:
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()
是否有帮助。我现在无法查找源代码,但请尝试从链中删除此调用setMessage()
(可能还有与标题和图标相关的调用)
首先,这是没有意义的,因为您提供了自己的布局。其次,此调用实际上可能会阻止自定义视图的使用。在edittext的xml id中是etRename,但在代码中是R.id.etFilename。你检查过了吗?没问题,但是眼睛很好。以后肯定会出问题的。我有另一个视图,其中一个EditText使用了该名称,因此Eclipse没有向我抛出错误。我只使用链中的
setView()
和create()
尝试了它,但仍然不起作用。在这种情况下,屏幕略微变暗,没有任何东西显示出来。@ AdamKomar,你确定在屏幕中部没有小代码“<代码> @ String / HythyReNeNe/Cuth>”吗?)也许,你什么也看不到,因为你的两个观点都是透明的。无论如何,edittext的提示应该是可见的。尝试将android:background添加到框架视图中。我喜欢跳出框框的思维方式。不幸的是,情况似乎并非如此。我设置了android:background=“@android:color/black”
,甚至用android:textColor=“@android:color/white”
设置了etRename,以确保它们的对比度仍然是零。它在Eclipse的图形布局预览中显示得很好,但在应用程序运行时什么都没有。还是要暂时离开那些设置以防万一@Android777@AdamKomar嗯,真奇怪。。。让我想一想。顺便问一下,你使用什么上下文<代码>活动,而不是应用程序
?@AdamKomar您可以测试另一种解决方法:使用对话框
而不是警报对话框
,如下所示:对话框名称=新建对话框(上下文);adRename.setContentView(vRename)代码>。在我的项目中,我曾经通过用Dialog
替换AlertDialog
来解决一些问题。adRename在构建器链之前是一个空对象,因此在尝试调用adRename上的findViewById()
时,尝试此操作会导致NullPointerException
。另外,我不想在链发生的地方显示对话框;只需初始化对话框即可使用,因此将create()
更改为show()
将不太好。