Android的PreferenceActivity中的getPreferenceScreen().removeAll()只删除组件

原创 2015年07月09日 18:01:19


Android的PreferenceActivity中的getPreferenceScreen().removeAll()只删除组件

如题,我们在Android中创建一个MyPreferenceActivity继承PreferenceActivity,然后在onCreate()方法中addPreferencesFromResource(R.xml.mypref);代码如下:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getApplicationContext();
        addPreferencesFromResource(R.xml.mypref);
        manager = getPreferenceManager();
//        listPreference = (ListPreference) manager.findPreference("mylist");
        listPreference = (ListPreference) manager.findPreference(context.getString(R.string.list_key));
        listPreference.setSummary(listPreference.getEntry() + ":" + listPreference.getValue());
        Toast.makeText(getApplicationContext(), listPreference.getEntry() + "的值为:" + listPreference.getValue(), Toast.LENGTH_SHORT).show();
    }

如果调用getPreferenceScreen().removeAll(),则只删除了当中的组件,而没有删除数据。代码如下:

 @Override
    protected void onStop() {
        super.onStop();
        getPreferenceScreen().removeAll();
        listPreference = (ListPreference) manager.findPreference(context.getString(R.string.list_key));
        Toast.makeText(getApplicationContext(), listPreference + "的值1为:" + listPreference, Toast.LENGTH_SHORT).show();
        Log.e("Test", "onStop1 " + listPreference);
        addPreferencesFromResource(R.xml.mypref);
        listPreference = (ListPreference) manager.findPreference(context.getString(R.string.list_key));
        Toast.makeText(getApplicationContext(), listPreference.getEntry() + "的值2为:" + listPreference.getValue(), Toast.LENGTH_SHORT).show();
        Log.e("Test", "onStop2 " + listPreference.getEntry());

        Log.e("Test", "onStop clear");
    }

打印log如下:
07-09 17:56:00.448  19857-19857/jehu.com.mypreference E/Test﹕ Main onPause
07-09 17:56:00.959  19857-19857/jehu.com.mypreference E/Test﹕ Main onStop
07-09 17:57:22.856  19857-19857/jehu.com.mypreference E/Test﹕ onStop 1null
07-09 17:57:22.866  19857-19857/jehu.com.mypreference E/Test﹕ onStop2 C#
07-09 17:57:22.866  19857-19857/jehu.com.mypreference E/Test﹕ onStop clear
07-09 17:57:22.866  19857-19857/jehu.com.mypreference E/Test﹕ onDestroy


我们发现

07-09 17:57:22.856  19857-19857/jehu.com.mypreference E/Test﹕ onStop1 null
07-09 17:57:22.866  19857-19857/jehu.com.mypreference E/Test﹕ onStop2 C#

原因是删除组件后,第一次打印null,但是数据还在,则再次加载组件后,第二次打印则为持久化到本地的数据。

完整代码:

package jehu.com.mypreference;

import android.content.Context;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;

/**
 * Created by admin on 2015/7/9.
 */
public class MyPreferenceActivity extends PreferenceActivity {
    private PreferenceManager manager;
    private ListPreference listPreference;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getApplicationContext();
        addPreferencesFromResource(R.xml.mypref);
        manager = getPreferenceManager();
//        listPreference = (ListPreference) manager.findPreference("mylist");
        listPreference = (ListPreference) manager.findPreference(context.getString(R.string.list_key));
        listPreference.setSummary(listPreference.getEntry() + ":" + listPreference.getValue());
        Toast.makeText(getApplicationContext(), listPreference.getEntry() + "的值为:" + listPreference.getValue(), Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onStop() {
        super.onStop();
        getPreferenceScreen().removeAll();
        listPreference = (ListPreference) manager.findPreference(context.getString(R.string.list_key));
        Toast.makeText(getApplicationContext(), listPreference + "的值1为:" + listPreference, Toast.LENGTH_SHORT).show();
        Log.e("Test", "onStop1 " + listPreference);
        addPreferencesFromResource(R.xml.mypref);
        listPreference = (ListPreference) manager.findPreference(context.getString(R.string.list_key));
        Toast.makeText(getApplicationContext(), listPreference.getEntry() + "的值2为:" + listPreference.getValue(), Toast.LENGTH_SHORT).show();
        Log.e("Test", "onStop2 " + listPreference.getEntry());

        Log.e("Test", "onStop clear");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("Test", "onDestroy");
    }
}


<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    android:key="123"
    xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
    android:key="@string/list_key"
    android:title="请选择一个选项"
    android:summary="选项"
    android:entries = "@array/entries"
    android:entryValues="@array/values" />

</PreferenceScreen>

android下PreferenceScreen 加载流程

前面引入主题的废话不多说,也不会说,Preference的加载过程我们就从addPreferencesFromResource()方法开始研究。     addPreferencesFromReso...
  • vipclx
  • vipclx
  • 2013年05月31日 18:09
  • 8170

android开发之PreferenceScreen使用详解

是在惭愧,学习android也有一段时间了,今天才是第一次接触PreferenceScreen。记录下来,与大家分享。本文参考:http://lovezhou.iteye.com/blog/10203...

隐藏(删除) Preference 小结

隐藏 Preference 有两种方法: 一、先在xml布局里面删,然后在java里面删掉调用的相关部分,但如果很多地方都有调用,那么删除就很麻烦; 二、用removePreference(P...

android PreferenceScreen preference偏好显示类的使用介绍

PreferenceScreen preference是偏好,首选的意思,PreferenceScreen个人翻译成 “偏好显示”,明白这个意思就好,就是说根据特点灵活的定义显示内容风格,一个屏幕可以...

Preference的 相关类 及 常用方法

前几篇博客 介绍的参数的xml配置中所使用到的一些参数标签,其实都是一些系统中实现好的类,他们负责参数的呈现及相关操作,所以,我们也可以在代码中创建参数元素并进行配置。   一、个相关的类...
  • vrix
  • vrix
  • 2015年04月06日 10:53
  • 639

Preference的使用(2) --- PreferenceCategory && PreferenceScreen

上一节有讲到Preference的基本使用跟API的
  • hewence1
  • hewence1
  • 2014年11月21日 09:26
  • 12972

Android下PreferenceScreen 加载流程

前面引入主题的废话不多说,也不会说,Preference的加载过程我们就从addPreferencesFromResource()方法开始研究。      addPreferencesFromR...

PreferenceScreen设置Preference置灰显示

PreferenceScreen设置Preference置灰显示,在xml文件中必须设置以下两个属性: android:enabled    是否起作用,false则能点取,但是不作用(...

Android软件开发之PreferenceActivity中的组件(二十八)

Android软件开发之PreferenceActivity中的组件雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyuson...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android的PreferenceActivity中的getPreferenceScreen().removeAll()只删除组件
举报原因:
原因补充:

(最多只允许输入30个字)