探索首选项框架
在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景。假设你正在编写一个应用程序,它提供了一个搜 索飞机航班的工具。而且,假设该应用程序的默认设置是根据机票价格由低到高的顺序显示航班,但用户可以将首选项设置为始终根据最少停站数或特定航线来航 班。如果实现这一场景?ListPreference 显然,必须为用户提供UI 来查看排序选项列表。该列表将包含每个选项的单选按钮,而且默认(或当前)选项应该被预先选中。要使用Android首选项框架解决此问题,所做的工作非 常之少。首先,创建首选项XML文件来描述首选项,然后使用预先构建的活动类,该类知道如何显示和持久化首选项,下面是我们的首选项 XML 文件flightoptions.xml 。Xml代码
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="flight_option_preference"
android:title="@string/prefTitle"
android:summary="@string/prefSummary">
<ListPreference
android:key="@string/selected_flight_sort_option"
android:title="@string/listTitle"
android:summary="@string/listSummary"
android:entries="@array/flight_sort_options"
android:entryValues="@array/flight_sort_options_values"
android:dialogTitle="@string/dialogTitle"
android:defaultValue="@string/flight_sort_option_default_value"/>
</PreferenceScreen>
Java代码
package xiaohang.zhimeng;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class FlightPreferenceActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.flightoptions);
}
}
Xml代码
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="flight_sort_options">
<item>Total Cost</item>
<item># of Stops</item>
<item>Airline</item>
</string-array>
<string-array name="flight_sort_options_values">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
</resources>
Xml代码
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, FlightPreferenceActivity!</string>
<string name="app_name">Preference_Demo</string>
<string name="prefTitle">My Preferences</string>
<string name="prefSummary">Set Flight Option Preferences</string>
<string name="flight_sort_option_default_value">1</string>
<string name="dialogTitle">Choose Flight Options</string>
<string name="listSummary">Set Search Options</string>
<string name="listTitle">Flight Options</string>
<string name="selected_flight_sort_option">selected_flight_sort_option</string>
<string name="menu_prefs_title">Settings</string>
<string name="menu_quit_title">Quit</string>
</resources>
Xml代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_prefs" android:title="@string/menu_prefs_title" />
<item android:id="@+id/menu_quit" android:title="@string/menu_quit_title" />
</menu>
Xml代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/text1" android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Java代码
package xiaohang.zhimeng;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends Activity{
private TextView tv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView)findViewById(R.id.text1);
setOptionText();
}
//创建菜单,这个菜单我们在XML文件中定义 这里加载进来就OK
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
//加载我们的菜单文件
inflater.inflate(R.menu.mainmenu, menu);
return true;
}
//菜单选项事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_prefs) {
//当我们点击 Settings 菜单的时候就会跳转到我们的 首选项视图,也就是我们的 FlightPreferenceActivity
Intent intent = new Intent().setClass(this, xiaohang.zhimeng.FlightPreferenceActivity.class);
//因为我们要接收上一个Activity 就是我们的首选项视图 返回的数据,所以这里用 startActivityForResult()方法启动我们的首选项视图
//参数一:我们要跳转到哪里
//参数二:回传码
this.startActivityForResult(intent, 0);
}else if (item.getItemId() == R.id.menu_quit) {
//当我们点击Quit菜单退出应用程序
finish();
}
return true;
}
//此方法用来 接收我们上一个Activity 也就是我们的首选项视图 返回的数据,因为我们可能会修改数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
setOptionText();
}
//这个方法就是用来设置我们 MainActivity 上的TextView的值(就是我们首选项的值)
private void setOptionText(){
/*这个方法比较有意思了
* 第一个参数:用来指定我们存储我们首选项值的文件的名称
* 格式就是 包名_preferences,大家可以看到我的包名就是xiaohang.zhimeng
* 这里如果你不按照这个格式写 比如你不写你当前包名 写成别的,也会生成 当前包名_preferences 这个文件 写或不写它就在那里
* 第二个参数:打开模式
* */
SharedPreferences prefs = getSharedPreferences("xiaohang.zhimeng_preferences", 0);
//这个方法大家去看文档,否则我会越写越乱
String option = prefs.getString(this.getResources().getString(R.string.selected_flight_sort_option), this.getResources().getString(R.string.flight_sort_option_default_value));
//得到我们首选项 所有选项的文本
String[] optionText = this.getResources().getStringArray(R.array.flight_sort_options);
//设置我们 TextView要显示的值
tv.setText("option value is " + option + "(" + optionText[Integer.parseInt(option)] + ")");
}
}
Xml代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xiaohang.zhimeng" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".FlightPreferenceActivity"
android:label="@string/prefTitle">
<intent-filter>
<action android:name="xiaohang.zhimeng.intent.action.FlightPreferences" />
<category android:name="android.intent.category.PREFERENCE" />
</intent-filter>
</activity>
</application>
</manifest>
(48.1 KB)
下载次数: 415