【问题标题】:Custom Dialog, setContentView throws ResourceNotFoundException自定义对话框,setContentView 抛出 ResourceNotFoundException
【发布时间】:2014-11-07 16:19:54
【问题描述】:

我正在使用this tutorial 创建一个自定义对话框,当我从微调器中单击“创建新文件夹”时应显示该对话框。我进入 OnItemsSelected 方法,检查“创建新文件夹”选项是否已单击,然后我想显示一个对话框来介绍新文件夹的名称。我是这样做的:

res/layout/dialog.html

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible" >

<EditText 
    android:id="@+id/editText_dialog"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:hint="@string/editText_dialog"
    android:layout_alignParentTop="true"
    android:layout_marginTop="15dip"
    android:layout_marginBottom="15dip"/>

<Button 
    android:id="@+id/button_create_dialog"
    android:text="@string/button_create_dialog"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/editText_dialog"
    android:layout_alignParentLeft="true"
    android:layout_marginLeft="50dip"
    android:background="#176CEC"
    android:textColor="#fff"
    android:textStyle="bold"
    android:textAppearance="?android:attr/textAppearanceLarge"/>

<Button 
    android:id="@+id/button_cancel_dialog"
    android:text="@string/button_cancel_dialog"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/editText_dialog"
    android:layout_alignParentRight="true"
    android:layout_marginRight="50dip"
    android:background="#176CEC"
    android:textColor="#fff"
    android:textStyle="bold"
    android:textAppearance="?android:attr/textAppearanceLarge"/>

</RelativeLayout>

Java 文件

public void onItemSelected(AdapterView<?> parent, View view, int position,long id){
    if (parent.getItemAtPosition(position).toString().matches("Create New Folder")){
        final Dialog dialog = new Dialog(this);
        try {
            dialog.setContentView(R.id.dialog);
            dialog.setTitle("Create New Folder");
        }
        catch (Exception e){
            StringWriter errors = new StringWriter();
            e.printStackTrace(new PrintWriter(errors));
            Log.i("Exception", errors.toString());
        }


        Button createButton = (Button) findViewById(R.id.button_create_dialog);
        Button cancelButton = (Button) findViewById(R.id.button_cancel_dialog);

        createButton.setOnClickListener(new Button.OnClickListener(){
            public void onClick(View v){
                EditText newFolderName = (EditText) findViewById(R.id.editText_dialog);
                String folderName = newFolderName.getText().toString().trim();
                if (folderName.length() > 0) {
                    // do stuff
                    dialog.dismiss();
                }
            }
        });

        cancelButton.setOnClickListener(new Button.OnClickListener(){
            public void onClick(View v){
                dialog.dismiss();
            }
        });
        dialog.show();
    }
}

我收到了 ResourceNotFoundException。这是堆栈跟踪:

11-07 17:11:49.075: I/Exception(8315): android.content.res.Resources$NotFoundException: Resource ID #0x7f05000e
11-07 17:11:49.075: I/Exception(8315):  at android.content.res.Resources.getValue(Resources.java:1118)
11-07 17:11:49.075: I/Exception(8315):  at android.content.res.Resources.loadXmlResourceParser(Resources.java:2304)
11-07 17:11:49.075: I/Exception(8315):  at android.content.res.Resources.getLayout(Resources.java:934)
11-07 17:11:49.075: I/Exception(8315):  at android.view.LayoutInflater.inflate(LayoutInflater.java:395)
11-07 17:11:49.075: I/Exception(8315):  at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
11-07 17:11:49.075: I/Exception(8315):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:267)
11-07 17:11:49.075: I/Exception(8315):  at android.app.Dialog.setContentView(Dialog.java:471)
11-07 17:11:49.075: I/Exception(8315):  at com.example.example.MainActivity.onItemSelected(MainActivity.java:94)
11-07 17:11:49.075: I/Exception(8315):  at android.widget.AdapterView.fireOnSelected(AdapterView.java:892)
11-07 17:11:49.075: I/Exception(8315):  at android.widget.AdapterView.access$200(AdapterView.java:49)
11-07 17:11:49.075: I/Exception(8315):  at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:860)
11-07 17:11:49.075: I/Exception(8315):  at android.os.Handler.handleCallback(Handler.java:730)
11-07 17:11:49.075: I/Exception(8315):  at android.os.Handler.dispatchMessage(Handler.java:92)
11-07 17:11:49.075: I/Exception(8315):  at android.os.Looper.loop(Looper.java:137)
11-07 17:11:49.075: I/Exception(8315):  at android.app.ActivityThread.main(ActivityThread.java:5103)
11-07 17:11:49.075: I/Exception(8315):  at java.lang.reflect.Method.invokeNative(Native Method)
11-07 17:11:49.075: I/Exception(8315):  at java.lang.reflect.Method.invoke(Method.java:525)
11-07 17:11:49.075: I/Exception(8315):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-07 17:11:49.075: I/Exception(8315):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-07 17:11:49.075: I/Exception(8315):  at dalvik.system.NativeStart.main(Native Method)

可以想象,资源 ID #0x7f05000e 匹配 R.id.dialog,我已经检查过了:

R.java 内部

 public static final int dialog = 0x7f05000e;

知道可能是什么问题吗?

更新 我忘了说在这一行抛出了异常:

dialog.setContentView(R.id.dialog);

【问题讨论】:

    标签: android dialog android-resources r.java-file


    【解决方案1】:

    发生此错误是因为您尝试在view(s) 上执行findViewById,而存在于您的Activity 中,但存在于您的对话框中。

    更改此代码:

        Button createButton = (Button) findViewById(R.id.button_create_dialog);
        Button cancelButton = (Button) findViewById(R.id.button_cancel_dialog);
    

    收件人:

        Button createButton = (Button) dialog.findViewById(R.id.button_create_dialog);
        Button cancelButton = (Button) dialog.findViewById(R.id.button_cancel_dialog);
    

    那些按钮不在Activity 中,所以你不能只调用findViewById,因为它会尝试在Activity's XML 中查找button's id。相反,调用dialog.findViewById 告诉代码在您的对话框中找到button

    更新(抱歉没有代码标签,我从手机更新)

    您应该在 setContentView 方法中使用 R.layout.dialog 而不是 R.id.dialog。

    【讨论】:

    • 感谢您的回答,因为我确信我以后会遇到这个问题。我要编辑/更新我的问题,我忘了说我在“dialog.setContentView(R.id.dialog);”这一行遇到了异常
    • 谢谢 :) 我认为应该是 R.layout.dialog
    • 天啊,有时我会因为我提出的问题而感到尴尬。好吧,我总是可以说我还年轻,还很粗心:S
    • 我认为您的问题没有问题,您展示了您尝试过的内容并提供了很好的代码:) 这只是一个小错误,我们有时会这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 2012-08-13
    • 2013-01-06
    相关资源
    最近更新 更多