InstantiationException при использовании подкласса EditTextPreference

1

Предположим, у меня есть подкласс EditTextPreference, называемый PasswordProtectedEditTextPreference. Этот подкласс в основном показывает диалог с паролем, прежде чем можно отредактировать предпочтение в собственном диалоге 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>

Затем я применяю preferences.xml в своем подклассе PreferenceActivity, вызывая

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

Любая идея, что происходит здесь?

Изменить: # 25 из stacktrace соответствует параметру PasswordProtectedEditTextPreference в preferences.xml

Изменить: Это моя 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
}
Теги:
exception
instantiation
inflate

2 ответа

7
Лучший ответ

Создан абстрактный класс:

  public abstract class PasswordProtectedEditTextPreference  

Неудивительно, что он не может быть создан, -)

  • 0
    О боже, я такой дамп ^^ Я помню, Eclipse несколько раз делал авто-исправления, когда несколько дней назад я добавил еще одну заглушку метода, и я забыл ее удалить ... Большое спасибо!
  • 0
    Хотя странно, что для 1,5 это не проблема ?! Я где-то читал, что была ошибка, которая позволяла создавать абстрактные классы в 1.5, но мне интересно, почему они никогда не исправляли это для этой версии ...
Показать ещё 2 комментария
4

Обычно это означает, что у вас нет соответствующего конструктора. Убедитесь, что ваш конструктор является общедоступным и принимает параметры Context и AttributeSet:

public TimePreference(Context ctxt, AttributeSet attrs)

(от это пользовательское предпочтение от этот примерный проект)

  • 0
    Если это не помогает, добавьте свой код предпочтения, возможно, что-то не так.
  • 0
    Если бы все было так просто - конструктор уже на месте, я сомневаюсь, что он будет работать без версии 1.5.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню