버튼과 비슷한 동작을하는 사용자 정의 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();
} }
고마워요. 정말 잘 작동합니다. 혼란스럽지 않고 이해하기 쉽습니다. 다른 사람들이 이해하기 쉬운 예제로 사용할 수 있도록 최적화 된 버전 (전체 프래그먼트 클래스)을 저의 questen에 넣을 것입니다. – Alcardis