Resources$NotFoundException: AlertDialog 中的资源 ID #0x0 未找到。

22

我有一个 RecyclerView,在它的适配器中,我创建了类似于 OnLongClickListener 的东西,我称之为 OnEntryLongClickListener,以避免混淆。

我正在使用一个 AlertDialog 显示一个带有不同操作列表项的对话框。然而,我遇到了以下错误:

E/AndroidRuntime: android.content.res.Resources$NotFoundException: Resource ID #0x0  
    at android.content.res.Resources.getValue(Resources.java:2345)  
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:3910)  
    at android.content.res.Resources.getLayout(Resources.java:2161)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:413)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:366)  
    at android.support.v7.app.AlertController$AlertParams.createListView(AlertController.java:734)  
    at android.support.v7.app.AlertController$AlertParams.apply(AlertController.java:711)  
    at android.support.v7.app.AlertDialog$Builder.create(AlertDialog.java:883)
    at com.mycompany.myapp.ThisActivity$2.onEntryLongClick(ThisActivity.java:135)  
    at com.mycompany.myapp.adapter.RVAdapter$RVViewHolder.onLongClick(RVAdapter.java:41)   
    at android.view.View.performLongClick(View.java:5236)  

以下是我正在使用的相关代码:

adapter.setOnEntryLongClickListener(new RVAdapter.OnEntryLongClickListener() {
    @Override
    public void onEntryLongClick(View view, int position) {
        final MiniEntry thisEntry = entryList.get(position);
        AlertDialog.Builder builder = new AlertDialog.Builder(getBaseContext());
        builder.setTitle(thisEntry.getEntryName()););
        builder.setItems(R.array.quickActions, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // Other code here
            }
        });
        AlertDialog alert = builder.create(); // The error log points to this line
        alert.show();
    }
});
mRecyclerView.setAdapter(adapter);

除了我正在使用的数组的XML之外:

<string-array name="quickActions">
    <item>Add to Favourites</item>
    <item>More information</item>
</string-array>

我不确定这是否重要,但我正在从v7支持库中导入android.support.v7.app.AlertDialog中的AlertDialog

我该怎么解决这个问题?


1
е°†AlertDialog.Builderе®һдң‹еЊ–дё­зљ„getBaseContext()ж›өж”№дёғеҢ“е‰ҚActivityе®һдң‹гЂ‚дң‹е¦‚пәЊnew AlertDialog.Builder(ThisActivity.this)гЂ‚ - Mike M.
@MikeM。这个方法有效!您能否将其发布为答案并解释一下为什么它解决了问题 - 谢谢。 - Farbod Salamat-Zadeh
3个回答

31

AlertDialog.Builder 实例化时的 getBaseContext() 更改为当前的 Activity 实例。例如:

Change getBaseContext() in the AlertDialog.Builder instantiation to the current Activity instance. For example:

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
AlertDialog需要一些资源,其值由附加到所使用的Context的主题和样式提供。通过getBaseContext()返回的Context没有这些附加项,但Activity有。实际上,每当需要UI组件的Context时(例如,DialogViewAdapter等),当前的Activity通常是您想要使用的。

2
如果我在片段中调用此函数并使用 getActivity(),仍然会出现此错误。有任何想法为什么? - AdamMc331
节省了很多时间。谢谢。 - Milan Pansuriya
1
那么什么时候应该使用 Activity,什么时候应该使用 BaseContext 呢? - Relm
@AdamMc331 对于其他寻找您评论答案的人。可以尝试:AlertDialog.Builder(context as HomeActivity) - devDeejay

26
尝试为您的对话框添加一个继承Theme.AppCompat.Light.Dialog.Alert样式的样式。 <style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert" />
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyDialogTheme);

这对我有效。

问候


我也可以工作。在我看来,这似乎是支持库中的一个错误。 - Philipp E.
2
对我来说,关键是如果我不像你建议的那样指定一个主题,活动主题必须扩展一个AppCompat主题。 - rupps
这对我有用。我和rupps遇到了同样的问题。 - karamazovbros

0
如果你和我一样,只使用Material Design Components而没有使用支持库,那么你可以使用这个构造函数。
// in app build.gradle file 
// make sure you have the MDC depencency.
// https://material.io/develop/android/docs/getting-started
implementation "com.google.android.material:material:${materialcomponents_version}"

// MainActivity.kt
// creating the builder
val dialogBuilder = MaterialAlertDialogBuilder(this)

//... setting up dialog

// creating dialog successfully 
val alert: AlertDialog = dialogBuilder.create()

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