5

当我在 Android 的首选项屏幕中单击特定标题时,我想调用一种方法来清除缓存。

问题是永远不会调用 onSharedPreferenceChanged :

这是我的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>

而且,这是我的 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();
    }

}
4

1 回答 1

22

在这种情况下,您不需要 OnSharedPreferenceChangeListener。您需要的是覆盖 PreferenceActivity 中的 onHeaderClick 方法。

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

当然,你必须在 xml 的 header 中添加一个 id。

<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>
于 2013-07-22T06:45:22.277 回答