Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call a method when click on preference header Android

I would like to call a method to clear cache when i click on a specific header in my preference screen in Android.

The problem is that onSharedPreferenceChanged is never called :

Here is the piece of code 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 the code of my settingActivity :

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();
    }

}
like image 920
wawanopoulos Avatar asked Jul 21 '13 20:07

wawanopoulos


1 Answers

You don't need OnSharedPreferenceChangeListener in this case. What you need is to override 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 have to add an id to 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>
like image 75
Chiral Code Avatar answered Sep 23 '22 05:09

Chiral Code