Êíèãà: Beginning Android

Letting Users Have Their Say

Letting Users Have Their Say

Given that you have set up the preference XML, you can use a nearly built-in activity for allowing your users to set their preferences. The activity is “nearly built-in” because you merely need to subclass it and point it to your preference XML, plus hook the activity into the rest of your application.

So, for example, here is the EditPreferences activity of the Prefs/Simple project available on the Apress Web site:

package com.commonsware.android.prefs;
import android.app.Activity;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class EditPreferences extends PreferenceActivity {
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.preferences);
 }
}

As you can see, there is not much to see. All you need to do is call addPreferencesFromResource() and specify the XML resource containing your preferences. You will also need to add this as an activity to your AndroidManifest.xml file:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.commonsware.android.prefs">
 <application android:label="@string/app_name">
  <activity
   android:name=".SimplePrefsDemo"
   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=".EditPreferences"
   android:label="@string/app_name">
  </activity>
 </application>
</manifest>

And you will need to arrange to invoke the activity, such as from a menu option, here pulled from SimplePrefsDemo at http://apress.com:

@Override
public boolean onCreateOptionsMenu (Menu menu) {
 menu.add(Menu.NONE, EDIT_ID, Menu.NONE, "Edit Prefs")
  .setIcon(R.drawable.misc)
  .setAlphabeticShortcut('e');
 menu.add(Menu.NONE, CLOSE_ID, Menu.NONE, "Close")
  .setIcon(R.drawable.eject)
  .setAlphabeticShortcut('c');
 return(super.onCreateOptionsMenu(menu));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
 switch (item.getItemId()) {
  case EDIT_ID:
   startActivity(new Intent(this, EditPreferences.class));
   return(true);
  case CLOSE_ID:
   finish();
   return(true);
 }
 return(super.onOptionsItemSelected(item));
}

However, that is all that is needed, and it really is not that much code outside of the preferences XML. What you get for your effort is an Android-supplied preference UI, as shown in Figure 17-1.


Figure 17-1. The Simple project’s preferences UI

The checkbox can be directly checked or unchecked. To change the ringtone preference, just click on the entry in the preference list to bring up a selection dialog like the one in Figure 17-2.


Figure 17-2. Choosing a ringtone preference

Note that there is no explicit Save or Commit button or menu — changes are persisted as soon as they are made.

The SimplePrefsDemo activity, beyond having the aforementioned menu, also displays the current preferences via a TableLayout:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
>
 <TableRow>
  <TextView
   android:text="Checkbox:"
   android:paddingRight="5px"
  />
  <TextView android:id="@+id/checkbox"
  />
 </TableRow>
 <TableRow>
  <TextView
   android:text="Ringtone:"
   android:paddingRight="5px"
  />
  <TextView android:id="@+id/ringtone"
  />
 </TableRow>
</TableLayout>

The fields for the table are found in onCreate():

@Override
public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 checkbox = (TextView)findViewById(R.id.checkbox);
 ringtone = (TextView)findViewById(R.id.ringtone);
}

The fields are updated on each onResume():

@Override
public void onResume() {
 super.onResume();
 SharedPreferences prefs = PreferenceManager
  .getDefaultSharedPreferences(this);
 checkbox.setText(new Boolean(prefs
  .getBoolean("checkbox", false)).toString());
 ringtone.setText(prefs.getString("ringtone", "<unset>"));
}

This means the fields will be updated when the activity is opened and after the preferences activity is left (e.g., via the back button); see Figure 17-3.


Figure 17-3. The Simple project’s list of saved preferences

Îãëàâëåíèå êíèãè


Ãåíåðàöèÿ: 6.457. Çàïðîñîâ Ê ÁÄ/Cache: 3 / 1
ïîäåëèòüñÿ
Ââåðõ Âíèç