如果你需要一个简单的APP设置,可以使用sharedPreferences进行存储,我们可以借助AndroidStudio快速创建一个用于设置的Activity,其实它是继承PreferenceFragmentCompat,存储方式用的就是sharedPreferences,只是帮我们节省了很多操作
1.新建SettingsActivity
使用AS新建一个SettingsActivity
可以发现它自动生成了一个Activity、一个layout布局和一个xml文件
layout文件很简单,里面就是一个LinearLayout里套FrameLayout,我们不用去修改它
xml文件是使用PreferenceScreen的布局文件,在自动生成Activity文件里的SettingsFragment类引用该xml
2.xml
它默认生成的是root_preferences.xml,里面是PreferenceScreen布局,关于PreferenceScreen 的布局大家可以去网上搜一下,或者去官网看看说明,我这里只是简单举个例子
title:显示的标题
key:存储的键(sharedPreferences取值需要用)
dependency:是否依赖某个组件,被依赖组件启用则当前组件启用
icon:图标
summary:描述
fragment:嵌套fragment(多级页面)
useSimpleSummaryProvider:是否显示值内容
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", "");