单击首选项标题Android时调用方法

时间:2013-07-21 20:39:38

标签: android android-preferences preferenceactivity

当我点击Android中偏好设置屏幕中的特定标题时,我想调用一种清除缓存的方法。

问题是永远不会调用onSharedPreferenceChanged:

以下是我的偏好.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();
    }

}

1 个答案:

答案 0 :(得分:20)

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

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

当然你必须在xml中为标题添加一个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>