2014-02-04 4 views
3

Некоторые из моих пользователей возникают сбои, и это ошибка, которая показывает в отчете об аварии на Google Play Developer Console:Фрагмент Инстанцирование аварии

Unable to start activity ComponentInfo{com.havens1515.autorespond/com.havens1515.autorespond.SettingsMenuNew}: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.havens1515.autorespond.NotificationOptions: make sure class name exists, is public, and has an empty constructor that is public

Пользователи говорят, что это происходит при открытии любой меню настроек внутри SettingsMenuNew, о котором говорится в приведенной выше ошибке, но я не испытываю аварии на моем телефоне. SettingsMenuNew является PreferenceActivity и все подменю являются PreferenceFragment

PreferenceFragment Каждый имеет пустой конструктор, и я не знаю, что еще может быть проблема. Я также видел в чьем-то другом вопросе, что ему нужен метод newInstance, но я не думаю, что мне это действительно нужно, если я не ставил никаких других аргументов в этот фрагмент.

вот некоторый код, показывающий те методы:

public class NotificationOptions extends PreferenceFragment 
{ 
    public NotificationOptions() 
    { 

    } 

    public static NotificationOptions newInstance(int title, String message) 
    { 
     NotificationOptions f = new NotificationOptions(); 
     return f; 
    } 
    ... 
} 
+0

Если NotificationOptions является внутренним классом, он должен быть статическим. –

+0

Это не внутренний класс, он находится в собственном файле – Randy

+0

Возможно, вы забыли добавить его в исключение proguard или использовать неправильную конфигурацию proguard. –

ответ

5

Это, вероятно, происходит из-за Proguard отрывая фрагменты.

Чтобы воспроизвести, создайте запутанный APK, включите «Не выполнять действия» в настройках разработчика, откройте «Активность», в которой содержится фрагмент, который сбой. Минимизируйте домашнюю кнопку и восстановите приложение из ретентатов.

Для объединения конфигураций Proguard с невыполнением одним и вашим в ADT, вы должны указать в project.properties

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 

Если вы используете Gradle построить систему

buildTypes { 
    debug { 
     runProguard false 
    } 

    release { 
     runProguard true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' 
    } 
} 

И ProGuard-project.txt должны содержать по крайней мере эти правила

-keep public class * extends android.preference.PreferenceFragment 

И если вы используете поддержку Fragmen ц

-keep public class * extends android.support.v4.app.Fragment 
-keep public class * extends android.support.v4.app.FragmentActivity 

Не стоит забывать, что уже есть некоторые правила, содержащиеся в $ {} sdk.dir /tools/proguard/proguard-android.txt так закачивать только отсутствующие в зависимости от потребностей.

+1

Я думаю, мне нужно добавить '-keep public class * extends android.preference.PreferenceFragment', так как эти классы являются PreferenceFragment, а не Fragment или FragmentActivity. – Randy

+0

это сделал произведение. Большое спасибо! Я пытался понять это примерно за неделю – Randy

+0

@ Randy вы правы. Я забыл упомянуть PreferenceFragment. –

Смежные вопросы