7

Примерно через 1 час поиска решений по моей проблеме в смежных вопросах я решил разоблачить свое дело. Вот он: у меня есть InflateException каждый раз, когда я пытаюсь открыть свою PreferenceActivity.EditTextPreference вызывает Inflate Exception

Вход

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: lineo.smarteam, PID: 5087 
        Theme: themes:{} 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{lineo.smarteam/lineo.smarteam.activity.SettingsActivity}: android.view.InflateException: Binary XML file line #5: Error inflating class lineo.smarteam.preference.MyEditTextPreference 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510) 
         at android.app.ActivityThread.-wrap11(ActivityThread.java) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:148) 
         at android.app.ActivityThread.main(ActivityThread.java:5461) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
        Caused by: android.view.InflateException: Binary XML file line #5: Error inflating class lineo.smarteam.preference.MyEditTextPreference 
         at android.preference.GenericInflater.createItem(GenericInflater.java:388) 
         at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:432) 
         at android.preference.GenericInflater.rInflate(GenericInflater.java:483) 
         at android.preference.GenericInflater.rInflate(GenericInflater.java:495) 
         at android.preference.GenericInflater.inflate(GenericInflater.java:327) 
         at android.preference.GenericInflater.inflate(GenericInflater.java:264) 
         at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:273) 
         at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:304) 
         at lineo.smarteam.activity.SettingsActivity$SettingsFragment.onCreate(SettingsActivity.java:57) 
         at android.app.Fragment.performCreate(Fragment.java:2198) 
         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:942) 
         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 
         at android.app.BackStackRecord.run(BackStackRecord.java:793) 
         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) 
         at android.app.FragmentController.execPendingActions(FragmentController.java:325) 
         at android.app.Activity.performStart(Activity.java:6267) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510)  
         at android.app.ActivityThread.-wrap11(ActivityThread.java)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)  
         at android.os.Handler.dispatchMessage(Handler.java:102)  
         at android.os.Looper.loop(Looper.java:148)  
         at android.app.ActivityThread.main(ActivityThread.java:5461)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
        Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet] 

У меня есть предпочтения экран несколько EditTextPreferences, позволяющие настроить некоторые целочисленные параметры.

Рез \ XML \ preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory  android:title="@string/scores_category_title" 
          android:key="pref_key_scores_settings"> 
     <lineo.smarteam.preference.MyEditTextPreference 
      android:title="@string/pref_title_win_score" 
      android:inputType="numberSigned" 
      android:maxLength="9" 
      android:defaultValue="@integer/def_win_score" 
      android:key="pref_key_win_score" > 
     </lineo.smarteam.preference.MyEditTextPreference> 
     (more of the same) 
    </PreferenceCategory> 
</PreferenceScreen> 

Потому что я упрямая, и я хочу, чтобы курсор для выравнивания в конце текста всякий раз, когда я нажимаю какие-либо предпочтения, я создал пользовательский EditTextPreference.

предпочтения \ MyEditTextPreference.java

package lineo.smarteam.preference; 

import android.content.Context; 
import android.preference.EditTextPreference; 
import android.util.AttributeSet; 
import android.widget.EditText; 

public class MyEditTextPreference extends EditTextPreference { 
    public MyEditTextPreference(Context context) { 
     super(context); 
    } 
    public MyEditTextPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    public MyEditTextPreference(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onClick() { 
     super.onClick(); 
     EditText et = getEditText(); 
     et.setSelection(et.getText().length()); 
    } 
} 

Как вы можете видеть, я все Конструкторы упомянутые в основном все темы, связанные с этим вопросом. Тогда у меня есть фактический PreferenceActivity:

активность \ SettingsActivity

package lineo.smarteam.activity; 

import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.Preference; 
import android.preference.PreferenceActivity; 
import android.preference.PreferenceFragment; 
import android.preference.PreferenceManager; 
import android.util.Log; 
import android.view.MenuItem; 

import lineo.smarteam.MyApplication; 
import lineo.smarteam.R; 

public class SettingsActivity extends PreferenceActivity { 
    static SharedPreferences sharedPreferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Context context = this; 
     sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
     getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit(); 
    } 

    public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.preferences); 
      setListeners(); 
     } 

     //EDIT: 
     public void setListeners(){ 
      setListenerA(); 
      //other listeners 
     } 

     pulic void setListenerA(){ 
      findPreference("KEY_PREF_WIN_SCORE").setOnPreferenceChangeListener() { 
       //(...) 
      } 
     } 
    } 
} 

Как было указано выше, где-то в опущенной этой последней части кода, у меня есть звонки на getActivity(), который, как я прочитал где-то, может вызвать эту проблему. Дело в том, что я пробовал комментировать все вызовы этого метода, и проблема сохраняется. Поэтому я пришел к выводу, что это не причина. Кроме того, я читал, что этот метод может вызвать исключение NullPointerException, поэтому я всегда проверяю его каждый раз, когда я его использую.

У меня есть чувство, что решение прямо передо мной, я просто не вижу его. Это было связано с большинством связанных тем, которые я прочитал.

Может кто-нибудь помочь мне найти его?

Благодаря

EDIT:

По предложению Виджай, я переустановил приложения. Он по-прежнему сбой в одном и том же действии, но ошибка изменилась.

New Log

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: lineo.smarteam, PID: 19210 
Theme: themes:{} 
java.lang.RuntimeException: Unable to start activity ComponentInfo{lineo.smarteam/lineo.smarteam.activity.SettingsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.preference.Preference.setOnPreferenceChangeListener(android.preference.Preference$OnPreferenceChangeListener)' on a null object reference 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5461) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

У вас включен ProGuard? Если это так, вам может понадобиться '@ Keep' ваш пользовательский' Preference'. – CommonsWare

+0

Я не знаю, что это такое ... –

+0

https://developer.android.com/studio/build/shrink-code.html – CommonsWare

ответ

6

Я нашел его.

Я пытался найти предпочтение, чей идентификатор не соответствует ни одному из файлов preferences.xml.

Это была действительно глупая ошибка. И это было в куске кода, который я не разделял сначала (извините).

В любом случае, спасибо всем, кто попытался помочь!

3

ошибка говорит, что у Вас есть ошибка в вашем MyEditTextPreference классе.

Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet] 

У меня есть эта ошибка раньше, но это может сильно зависеть от вашей ситуации. Есть пара вещей, которые вы могли бы попробовать:

  1. взгляд в вашем MyEditTextPreference класса и посмотреть, если ваш макет XML назвать правильное предпочтение. пакет должен быть таким же. Здесь я ошибся.

  2. попытаться изменить ваш MyEditTextPreference класс, например, удалить некоторые строки мое предложение:

    protected void onClick() { super.onClick(); EditText et = getEditText(); et.setSelection(et.getText().length()); }

или вы можете также изменить свой конструктор. Посмотрите, находите ли вы новый журнал ошибок.

  1. Постройте град и очистите проект, прежде чем развертывать его на устройстве. обычно это укажет на вашу ошибку в xml.

Если все не работает, то класс MyEditTextPreference - это то, где вы должны исправить. Это мое предложение надеяться, что это поможет вам.