【问题标题】:InstantiationException when using subclass of EditTextPreference使用 EditTextPreference 的子类时的 InstantiationException
【发布时间】:2011-05-31 13:06:59
【问题描述】:

假设,我有一个名为 PasswordProtectedEditTextPreference 的 EditTextPreference 的子类。这个子类基本上显示一个密码对话框,然后才能通过EditTextPreference自己的对话框编辑首选项。

现在我在相应的preferences.xml 中定义首选项,如下所示:

<edu.myproject.pwprefs.PasswordProtectedEditTextPreference android:key="pref_password"
            android:title="@string/pref_password_title" android:summary="@string/pref_password_summary"
            android:dialogTitle="@string/pref_password_dialog_title" android:dialogMessage="@string/pref_password_dialog_message">
</edu.myproject.pwprefs.PasswordProtectedEditTextPreference>

然后我通过调用在PreferenceActivity 的子类中应用preferences.xml

addPreferencesFromResource(R.xml.preferences);

onCreate() 期间。这一切都适用于 Android 1.5。但是,当我使用更高版本的 Android 时,我得到以下堆栈跟踪:

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.myproject/edu.myproject.Preferences}: android.view.InflateException: Binary XML file line #25: Error inflating class java.lang.reflect.Constructor
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
     at android.app.ActivityThread.access$2300(ActivityThread.java:135)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
     at android.os.Handler.dispatchMessage(Handler.java:99)
     at android.os.Looper.loop(Looper.java:144)
     at android.app.ActivityThread.main(ActivityThread.java:4937)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:521)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
     at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.view.InflateException: Binary XML file line #25: Error inflating class java.lang.reflect.Constructor
     at android.preference.GenericInflater.createItem(GenericInflater.java:397)
     at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:430)
     at android.preference.GenericInflater.rInflate(GenericInflater.java:481)
     at android.preference.GenericInflater.rInflate(GenericInflater.java:493)
     at android.preference.GenericInflater.inflate(GenericInflater.java:326)
     at android.preference.GenericInflater.inflate(GenericInflater.java:263)
     at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:254)
     at android.preference.PreferenceActivity.addPreferencesFromResource(PreferenceActivity.java:268)
     at edu.myproject.Preferences.onCreate(Preferences.java:50)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
     ... 11 more
 Caused by: java.lang.InstantiationException: edu.myproject.pwprefs.PasswordProtectedEditTextPreference
     at java.lang.reflect.Constructor.constructNative(Native Method)
     at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
     at android.preference.GenericInflater.createItem(GenericInflater.java:383)
     ... 21 more

知道这里发生了什么吗?

编辑: stacktrace 中的#25 对应于preferences.xml 中的PasswordProtectedEditTextPreference

编辑:这是我的 PasswordProtectedEditTextPreference:

package edu.myproject.pwprefs;

import edu.myproject.R;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.preference.EditTextPreference;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.EditText;
import android.widget.LinearLayout;

public abstract class PasswordProtectedEditTextPreference extends EditTextPreference {

    public PasswordProtectedEditTextPreference(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public PasswordProtectedEditTextPreference(Context context,
            AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public PasswordProtectedEditTextPreference(Context context,
            AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }


    // further non-instantiation related code
}

【问题讨论】:

    标签: android exception instantiation inflate


    【解决方案1】:

    你创建了一个抽象类:

      public abstract class PasswordProtectedEditTextPreference  
    

    难怪它不能被实例化;-)

    【讨论】:

    • 我的天啊,我太垃圾了^^ 我记得几天前我添加另一个方法存根时,Eclipse 做了一些自动修复,但我忘了删除它......非常感谢!跨度>
    • 虽然奇​​怪,这对 1.5 来说没问题?!我在某处读到有一个错误允许在 1.5 中实例化抽象类,但我想知道为什么他们从未为这个版本修复它...
    • 同意,1.5 位很奇怪。
    • 你知道这是我第二次遇到这个答案(第一次赞成)——希望我第三次不需要它:D
    【解决方案2】:

    通常,这意味着您没有合适的构造函数。确保您的构造函数是公开的,并采用 ContextAttributeSet 作为参数:

    public TimePreference(Context ctxt, AttributeSet attrs)
    

    (来自this custom preference来自this sample project

    【讨论】:

    • 如果不能解决问题,请添加您的偏好代码,可能还有其他问题。
    • 希望这么简单 - 构造函数已经到位,我怀疑它不会在 1.5 中运行。
    • @ubuntudroid:实际上,构造函数组合已经改变,至少在膨胀首选项 XML 所使用的方面。确保你有完全我引用的构造函数(当然,用你自己的类名代替)。
    • @dmon, CommonsWare:添加了 Preference 的相关部分。在我看来,我已经拥有了所有需要的代码......
    猜你喜欢
    • 1970-01-01
    • 2015-03-06
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多