7

經過大約1小時尋找解決我的問題的相關主題,我決定揭露我的情況。這裏是:我每次嘗試打開我的PreferenceActivity時都會遇到InflateException。EditTextPreference導致充氣異常

登錄

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,所以我總是在每次使用它時檢查它。

我有一種感覺,解決方案就在我面前,我只是沒有看到它。我讀過的大多數相關主題就是這種情況。

有人可以幫我找到它嗎?

感謝

編輯:

繼Vijai的建議下,我重新安裝應用程序。它仍然在同一個動作中崩潰,但錯誤已經改變。

新日誌

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'您的自定義'偏好'。 – CommonsWare

+0

我不知道那是什麼... –

+0

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

回答

6

我找到了。

我試圖找到一個首選項,其id與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. 在部署到設備之前構建gradle並清理項目。通常這會在xml中指出你的錯誤。

如果一切沒有那麼工作MyEditTextPreference類是你應該修正。這是我的建議希望它可以幫助你。