Android 中SettingsActivity(PreferenceFragmentCompat)的简单使用

如果你需要一个简单的APP设置,可以使用sharedPreferences进行存储,我们可以借助AndroidStudio快速创建一个用于设置的Activity,其实它是继承PreferenceFragmentCompat,存储方式用的就是sharedPreferences,只是帮我们节省了很多操作
 

1.新建SettingsActivity

使用AS新建一个SettingsActivity

Android 中SettingsActivity(PreferenceFragmentCompat)的简单使用_第1张图片

 可以发现它自动生成了一个Activity、一个layout布局和一个xml文件Android 中SettingsActivity(PreferenceFragmentCompat)的简单使用_第2张图片

 layout文件很简单,里面就是一个LinearLayout里套FrameLayout,我们不用去修改它
xml文件是使用PreferenceScreen的布局文件,在自动生成Activity文件里的SettingsFragment类引用该xml

2.xml
它默认生成的是root_preferences.xml,里面是PreferenceScreen布局,关于PreferenceScreen 的布局大家可以去网上搜一下,或者去官网看看说明,我这里只是简单举个例子

title:显示的标题
key:存储的键(sharedPreferences取值需要用)
dependency:是否依赖某个组件,被依赖组件启用则当前组件启用
icon:图标
summary:描述
fragment:嵌套fragment(多级页面)
useSimpleSummaryProvider:是否显示值内容
Android 中SettingsActivity(PreferenceFragmentCompat)的简单使用_第3张图片

Android 中SettingsActivity(PreferenceFragmentCompat)的简单使用_第4张图片 

3.Activity监听校验

如果修改了设置可以进行保存,我们需要实现Preference.OnPreferenceChangeListener才能监听改变,比如说校验输入值的合法性


 

public class SettingsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings_activity);
        if (savedInstanceState == null) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.settings, new SettingsFragment())
                    .commit();
        }
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setTitle("设置");
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }


    // 点击返回图标事件
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            this.finish();
        }
        return super.onOptionsItemSelected(item);
    }

	// 接口Preference.OnPreferenceChangeListener
    public static class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceChangeListener {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
            // 通过xml设置的key找到要监听的项
            Preference sPEditUsername = findPreference("username");
            Preference sPEditPassword = findPreference("password");
            // 设置监听
            if (sPEditUsername != null) {
                sPEditUsername.setOnPreferenceChangeListener(this);
            }
            if (sPEditPassword != null) {
                sPEditPassword.setOnPreferenceChangeListener(this);
            }

        }
		// 值发生改变时触发,return值决定是否保存修改,true保存,false不保存
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            String key = preference.getKey();
            if (key.equals("username")) {
                ...
                return true;  // 保存
            } else if (key.equals("password")) {
                ...
                return true;
            }
            return false;  //不保存
        }
}

 采用的是sharedPreferences的存储方式,所以取值还是很简单的

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
boolean spIsAuth = sharedPreferences.getBoolean("is_auth", false);  // 第一个参数是key,第二个是根据key取不到值时的默认值
String spUsername = sharedPreferences.getString("username", "");
String spPassword = sharedPreferences.getString("password", "");

你可能感兴趣的:(android,Preference,FragmentCompat)