Android中出现“无法检索到正确的封闭实例”错误?

问题描述

| 在下面的给定功能中,我试图创建一个包含用户名密码字段的alertDialog对话框,并将这些字段的值插入共享的首选项中。 我无法访问受保护的对话框onCreateDialog(int id)内的alertDialog框肯定按钮单击侦听器中的变量。当我检查变量时 首选项,用户名密码向我显示了这一点。 无法检索此的正确封闭实例。有人可以告诉我原因是什么
       import android.app.Activity;
        import android.app.AlertDialog;
        import android.app.Dialog;
        import android.content.Context;
        import android.content.DialogInterface;
        import android.content.DialogInterface.OnClickListener;
        import android.content.SharedPreferences;
        import android.os.Bundle;
        import android.preference.PreferenceManager;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.widget.EditText;

        public class Login extends Activity {

            public static String PREF_LOGIN_USERNAME = \"pref_username\";
            public static String PREF_LOGIN_PASSWORD = \"pref_password\";

            public static final int DIALOG_LOGIN = 100;
            public static final int DIALOG_NEW_PASSWORD = 101;


            LayoutInflater factory;
            View loginView;

            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                showDialog(DIALOG_LOGIN);

            }

            protected Dialog onCreateDialog(int id) {
                switch (id) {

                case DIALOG_LOGIN:
                    // Inflating the View from the xml
                    factory = LayoutInflater.from(Login.this);
                    loginView = factory.inflate(R.layout.alert_dialog_text_entry,null);
                    return new AlertDialog.Builder(this)
                            .setTitle(R.string.alert_dialog_login)
                            .setView(loginView)
                            .setPositiveButton(R.string.dialog_ok,new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog,int whichButton) {
                       Context context = getApplicationContext();
                            SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(context);
                                    SharedPreferences.Editor editor = prefs.edit();

                                    EditText username = (EditText)loginView.findViewById(R.id.username_edit);
                                    EditText password = (EditText)loginView.findViewById(R.id.password_edit);
                                    editor.putString(PREF_LOGIN_USERNAME,username.getText().toString());
                                    editor.putString(PREF_LOGIN_PASSWORD,password.getText().toString());
                                    editor.commit();
                                    editor.commit();


                                        }
                                    })
                            .setNegativeButton(R.string.dialog_cancel,new OnClickListener() {

                                        @Override
                                        public void onClick(DialogInterface dialog,int which) {
                                            // Todo Auto-generated method stub
                                            showDialog(DIALOG_LOGIN);
                                        }
                                    }).create();
    }
    return null;
        }
    }
xml文件
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<!-- copyright (C) 2008 The Android Open Source Project

     Licensed under the Apache License,Version 2.0 (the \"License\");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing,software
     distributed under the License is distributed on an \"AS IS\" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"
    android:layout_width=\"match_parent\"
    android:layout_height=\"wrap_content\"
    android:orientation=\"vertical\">

    <TextView 
        android:id=\"@+id/username_view\"
        android:layout_height=\"wrap_content\"
        android:layout_width=\"wrap_content\"
        android:layout_marginLeft=\"20dip\"
        android:layout_marginRight=\"20dip\"
        android:text=\"@string/alert_dialog_username\"
        android:gravity=\"left\"
        android:textAppearance=\"?android:attr/textAppearanceMedium\" />

    <EditText
        android:id=\"@+id/username_edit\"
        android:layout_height=\"wrap_content\"
        android:layout_width=\"match_parent\"
        android:layout_marginLeft=\"20dip\"
        android:layout_marginRight=\"20dip\"
        android:scrollHorizontally=\"true\"
        android:autoText=\"false\"
        android:capitalize=\"none\"
        android:gravity=\"fill_horizontal\"
        android:textAppearance=\"?android:attr/textAppearanceMedium\" />

    <TextView
        android:id=\"@+id/password_view\"
        android:layout_height=\"wrap_content\"
        android:layout_width=\"wrap_content\"
        android:layout_marginLeft=\"20dip\"
        android:layout_marginRight=\"20dip\"
        android:text=\"@string/alert_dialog_password\"
        android:gravity=\"left\"
        android:textAppearance=\"?android:attr/textAppearanceMedium\" />

    <EditText
        android:id=\"@+id/password_edit\"
        android:layout_height=\"wrap_content\"
        android:layout_width=\"match_parent\"
        android:layout_marginLeft=\"20dip\"
        android:layout_marginRight=\"20dip\"
        android:scrollHorizontally=\"true\"
        android:autoText=\"false\"
        android:capitalize=\"none\"
        android:gravity=\"fill_horizontal\"
        android:password=\"true\"
        android:textAppearance=\"?android:attr/textAppearanceMedium\" />

</LinearLayout>
来自ddms的错误日志:
04-14 21:43:32.870: ERROR/AndroidRuntime(16125): java.lang.NullPointerException
04-14 21:43:32.870: 
ERROR/AndroidRuntime(16125):     at com.qrcoder.Login$1.onClick(Login.java:66)
04-14 21:43:32.870: ERROR/AndroidRuntime(16125):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158)
04-14 21:43:32.870: ERROR/AndroidRuntime(16125):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-14 21:43:32.870: ERROR/AndroidRuntime(16125):     at android.os.Looper.loop(Looper.java:123)
04-14 21:43:32.870: ERROR/AndroidRuntime(16125):     at android.app.ActivityThread.main(ActivityThread.java:4627)
04-14 21:43:32.870: ERROR/AndroidRuntime(16125):     at java.lang.reflect.Method.invokeNative(Native Method)
04-14 21:43:32.870: ERROR/AndroidRuntime(16125):     at java.lang.reflect.Method.invoke(Method.java:521)
04-14 21:43:32.870: ERROR/AndroidRuntime(16125):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
04-14 21:43:32.870: ERROR/AndroidRuntime(16125):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
04-14 21:43:32.870: ERROR/AndroidRuntime(16125):     at dalvik.system.NativeStart.main(Native Method)
编辑:这是工作代码。     

解决方法

我不确定发生了什么,但建议您将通话从moving4移到moving3ѭ。当UI实际上在屏幕上时,最好以ѭ5进行操作。 编辑好的,我想我知道发生了什么事。您正在尝试为您的活动初始化onCreate方法中的用户名和密码字段,但是我猜测这些字段仅存在于登录对话框中。在构造对话框本身之后,您需要查找这些字段,因为在此之前它们不存在。