2014-07-09 4 views
4

버튼과 비슷한 동작을하는 사용자 정의 Preference을 구현하고 있습니다 (기본 설정은 모든 환경 설정의 기본값을 복원하는 대화 상자를 엽니 다). ResetPreference을 클릭하면 긍정적 인 클릭으로 모든 기본 설정 데이터가 지워지고 재설정됩니다. 이지만을 클릭하면 아무 일도 일어나지 않습니다. 나는 PreferenceScreen을 null로 설정하고 리소스를 다시 추가하는 동안 문제가 발생한다고 생각합니다.PreferenceFragment OnPreferenceClickListener()는 한 번만 작동합니다.

내가이 접근법을 사용한 이유를 묻는다면 재설정을 클릭하여 변경 결과를 직접 보여주고 싶었습니다. 재설정을 구현하는 더 좋은 방법을 알고 있다면 약간의 예를 들어주세요.

추 신 : ResetPreference을 클릭하고 음수 단추를 선택하면 아무 반응이 없으며 청취자는 계속 작동하므로 실제로 자원을 삭제하고 다시 추가해야합니다. ResetPreference.java

public class ResetPreference extends Preference { 

public ResetPreference(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    setOnPreferenceClickListener(new OnPreferenceClickListener() { 

     public boolean onPreferenceClick(Preference preference) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 
      builder.setTitle(R.string.prefAlertDialog_Title); 
      builder.setMessage(R.string.prefAlertDialog_Message); 
      builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        SettingsFragment.resetSettings(getContext()); 
       } 
      }); 
      builder.setNegativeButton(R.string.prefAlertDialog_Negative, null); 
      builder.create().show(); 

      return false; 
     } 
    }); 

}} 

그런 다음 https://stackoverflow.com/a/24648780/3387852 모든 것이 SettingsFragment에서 이루어집니다에서 제안을 추가 한 후 내 사용자 지정 PreferenceFragment SettingsFragment.java

public class SettingsFragment extends PreferenceFragment{ 

private static SettingsFragment sf = null; 

public static void resetSettings(Context ctx) 
{ 

    PreferenceManager 
    .getDefaultSharedPreferences(ctx) 
    .edit() 
    .clear() 
    .commit(); 
    PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);   

    if(sf != null) 
    { 
     sf.setPreferenceScreen(null); 
     sf.addPreferencesFromResource(R.xml.preferences); 
    } 
} 

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     sf = this; 

     // Load the preferences from an XML resource 
     addPreferencesFromResource(R.xml.preferences); 

     Preference reset = (Preference) findPreference("reset"); 

     reset.setOnPreferenceClickListener(new OnPreferenceClickListener() 
     { 
      public boolean onPreferenceClick(Preference pref) 
      {   

       AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
       builder.setTitle(R.string.prefAlertDialog_Title); 
       builder.setMessage(R.string.prefAlertDialog_Message); 
       builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() { 

        public void onClick(DialogInterface dialog, int which) { 
         PreferenceManager 
         .getDefaultSharedPreferences(getActivity().getApplicationContext()) 
         .edit() 
         .clear() 
         .commit(); 
         PreferenceManager.setDefaultValues(getActivity().getApplicationContext(), R.xml.preferences, true);    

         setPreferenceScreen(null); 
         addPreferencesFromResource(R.xml.preferences);      
        } 
       }); 
       builder.setNegativeButton(R.string.prefAlertDialog_Negative, null); 
       builder.create().show(); 


       return true; 
      } 
     }); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    sf = null; 
}} 

있다 . ResetPreference은 더 이상 필요하지 않으며 표준 안드로이드 Preference을 대신 사용할 수 있습니다. 당신이 제거되는 setPreferenceScreen(null); 모든 데이터와 화면의 청취자를 호출 할 때

리셋 버튼을 구현하는 데 필요한 유일한 코드는

업데이트 SettingsFragment.java

public class SettingsFragment extends PreferenceFragment{ 

private void addMyResetListener() { 
    Preference reset = (Preference) findPreference("reset"); 

    reset.setOnPreferenceClickListener(new OnPreferenceClickListener() 
    { 
     public boolean onPreferenceClick(Preference pref) 
     {   

      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
      builder.setTitle(R.string.prefAlertDialog_Title); 
      builder.setMessage(R.string.prefAlertDialog_Message); 
      builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        resetSettings(SettingsFragment.this.getActivity());    
       } 
      }); 
      builder.setNegativeButton(R.string.prefAlertDialog_Negative, null); 
      builder.create().show(); 

      return true; 
     } 
    }); 
} 

public void resetSettings(Context ctx) 
{ 
    //Remove all Settings 
    PreferenceManager 
    .getDefaultSharedPreferences(ctx) 
    .edit() 
    .clear() 
    .commit(); 
    //All Settings that are empty will be loaded from default values again 
    PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);   

    setPreferenceScreen(null); 
    addPreferencesFromResource(R.xml.preferences); 
    addMyResetListener(); 
} 

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Load the preferences from an XML resource & add listener 
     addPreferencesFromResource(R.xml.preferences); 
     addMyResetListener(); 
} } 

답변

3

입니다. 그런 다음 addPreferencesFromResource(R.xml.preferences);을 호출하면 데이터가 추가되지만 리스너는 추가되지 않습니다.

Preference을 다시 작동 시키려면 수신기를 다시 추가해야합니다!

나는 당신이 방법

private void addMyResetListener() { 
    Preference reset = (Preference) findPreference("reset"); 

    reset.setOnPreferenceClickListener(new OnPreferenceClickListener() 
    { 
     public boolean onPreferenceClick(Preference pref) 
     {   

      resetSettings(SettingsFragment.this.getActivity()); 


      return true; 
     } 
    }); 
} 

를 생성하고 사용자 정의 환경 설정을 필요로하지 않는

setPreferenceScreen(null); 
addPreferencesFromResource(R.xml.preferences); 
addMyResetListener(); 

그래서 resetSettings 변경

public void resetSettings(Context ctx) // also removed static 
{ 

    PreferenceManager 
    .getDefaultSharedPreferences(ctx) 
    .edit() 
    .clear() 
    .commit(); 
    PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);   

    setPreferenceScreen(null); 
    addPreferencesFromResource(R.xml.preferences); 
    addMyResetListener(); 
} 

그 방법

에 후를 사용하는 것이 좋습니다 ResetPreference

+0

고마워요. 정말 잘 작동합니다. 혼란스럽지 않고 이해하기 쉽습니다. 다른 사람들이 이해하기 쉬운 예제로 사용할 수 있도록 최적화 된 버전 (전체 프래그먼트 클래스)을 저의 questen에 넣을 것입니다. – Alcardis

관련 문제