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를 사용하도록 설정 했습니까? 그렇다면, 사용자 정의'Preference'를'@ Keep '해야 할 수도 있습니다. – CommonsWare

+0

그게 뭔지 모르겠군요 ... –

+0

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

답변

6

발견했습니다.

id가 preferences.xml 파일의 id와 일치하지 않는 환경 설정을 찾으려고했습니다.

정말 바보 같은 실수였습니다. 그리고 그것은 제가 처음 먹었던 코드 조각에있었습니다 (미안).

어쨌든 도움을 주신 모든 분들께 감사드립니다!

3

이 오류는 당신이 당신의 MyEditTextPreference 클래스에 오류가 있다고 말했다.

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

이 오류가 발생하기 전에 상황에 따라 달라질 수 있습니다. 거기에 몇 가지 당신이 시도 할 수있는 것들입니다 : 당신의 MyEditTextPreference 클래스

  1. 모습과 레이아웃 XML은 올바른 우선 순위를 호출하는 경우를 참조하십시오. 패키지는 동일해야합니다. 이것은 내가 실수 한 곳입니다.

  2. 시도는 예를 들어 당신의 MyEditTextPreference 클래스 내 제안이 어떤 줄을 제거 수정 :

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

또는 당신은 또한 당신의 생성자을 수정할 수 있습니다. 새로운 오류 로그를 찾았는지 확인하십시오.

  1. 기기에 배포하기 전에 gradle을 빌드하고 프로젝트를 정리하십시오. 대개 이것은 XML에서 실수를 가리 킵니다.

모두 작동하지 않는다면 MyEditTextPreference 클래스를 수정해야합니다. 이것은 당신을 돕기를 희망하는 나의 제안입니다.