7

संबंधित विषयों में मेरी समस्या के समाधान की तलाश करने के बाद, मैंने अपने मामले का पर्दाफाश करने का फैसला किया। यहां यह है: जब भी मैं अपनी वरीयता सक्रियता खोलने की कोशिश करता हूं, तब भी मुझे एक InflateException है।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 स्क्रीन।

रेस \ एक्सएमएल \ 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 फेंक सकती है, इसलिए मैं इसे हर बार जांचता हूं जब भी मैं इसका उपयोग करता हूं।

मुझे लगता है कि समाधान मेरे सामने सही है, मैं इसे देख नहीं रहा हूं। मेरे द्वारा पढ़े गए अधिकांश संबंधित विषयों के लिए यह मामला था।

क्या कोई इसे ढूंढने में मेरी सहायता कर सकता है?

धन्यवाद

संपादित करें:

विजय के सुझाव के बाद, मैं अनुप्रयोग को पुनर्स्थापित। यह अभी भी एक ही कार्रवाई में दुर्घटनाग्रस्त है, लेकिन त्रुटि बदल गई है।

न्यू लॉग

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

मुझे यह मिला।

मैं वरीयता ढूंढने की कोशिश कर रहा था जिसका आईडी प्राथमिकता.एक्सएमएल फ़ाइल में किसी से मेल नहीं खाता था।

यह वास्तव में एक मूर्खतापूर्ण गलती थी। और यह कोड के एक टुकड़े में था जिसे मैंने पहले नहीं सोचा था (माफ करना)।

वैसे भी, हर किसी के लिए धन्यवाद जिन्होंने मदद करने की कोशिश की!

3

त्रुटि कहा कि तुम अपने MyEditTextPreference कक्षा में एक त्रुटि है।

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

मुझे पहले यह त्रुटि है लेकिन यह आपकी स्थिति पर निर्भर करता है। वहाँ कुछ बातें आप की कोशिश कर सकते हैं: अपने MyEditTextPreference कक्षा में

  1. देखो और अपने लेआउट एक्सएमएल सही वरीयता फोन करता है, तो देखते हैं। पैकेज एक ही होना चाहिए। यह वह जगह है जहां मैंने गलती की थी।

  2. कोशिश उदाहरण के लिए अपने MyEditTextPreference वर्ग कुछ लाइन मेरे सुझाव है हटाने संशोधित करने के लिए:

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

या आप भी अपने निर्माता को संशोधित कर सकता है। देखें कि क्या आपको नया त्रुटि लॉग मिलता है।

  1. डिवाइस पर तैनाती करने से पहले, अपनी परियोजना को धीरे-धीरे बनाएं और साफ़ करें। आमतौर पर यह आपकी गलती xml में इंगित करेगा।

यदि सभी काम नहीं कर रहे हैं तो MyEditTextPreference कक्षा है जहां आपको ठीक करना चाहिए। यह मेरा सुझाव है कि यह आपकी मदद करता है।

संबंधित मुद्दे