Calling a method when you click on the Android preferences header

I would like to call the cache clear method when I click on a specific title on the settings screen in Android.

The problem is that onSharedPreferenceChanged is never called:

Here is the code snippet of my preferences .xml:

<header android:icon="@drawable/ic_action_cancel" android:title="Vider le cache d'articles" android:key="clearCache" android:summary="Clear all datas."> </header> 

And here is my setup code:

 package com.rss.preferences; import java.io.File; import java.util.List; import com.rss.R; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.util.Log; import android.view.Gravity; import android.widget.TextView; public class SettingsFragment extends PreferenceActivity { SharedPreferences settings; public static final String KEY_CLEAR_CACHE = "clearCache"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Add a button to the header list. if (hasHeaders()) { TextView txt = new TextView(this); txt.setText("Version 1.0 Beta"); txt.setGravity(Gravity.CENTER); setListFooter(txt); } settings = getSharedPreferences("clearCache", 0); settings.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged (SharedPreferences sharedPreferences, String key) { Log.d("INFO", "popopo"); } }); } public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.preferences, target); } // public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { // if (key.equals(KEY_CLEAR_CACHE)) { // clearApplicationData(); // } // } public void clearApplicationData() { File cache = getCacheDir(); File appDir = new File(cache.getParent()); if (appDir.exists()) { String[] children = appDir.list(); for (String s : children) { if (!s.equals("lib")) { deleteDir(new File(appDir, s)); Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************"); } } } } public static boolean deleteDir(File dir) { if (dir != null && dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } return dir.delete(); } } 
+4
source share
1 answer

In this case, you do not need OnSharedPreferenceChangeListener. You need to override the onHeaderClick method in your PreferenceActivity.

 @Override public void onHeaderClick(Header header, int position) { super.onHeaderClick(header, position); if (header.id == R.id.clear_cache) { clearApplicationData(); } } 

Of course you need to add id to the header in xml.

 <header android:id="@+id/clear_cache" android:icon="@drawable/ic_action_cancel" android:title="Vider le cache d'articles" android:key="clearCache" android:summary="Clear all datas."> </header> 
+18
source

Source: https://habr.com/ru/post/1492610/


All Articles