| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.example.spinner; |
| |
| import com.android.example.spinner.R; |
| |
| import android.app.Activity; |
| import android.content.Context; |
| import android.content.SharedPreferences; |
| import android.os.Bundle; |
| import android.view.View; |
| import android.widget.AdapterView; |
| import android.widget.ArrayAdapter; |
| import android.widget.Spinner; |
| import android.widget.TextView; |
| import android.widget.Toast; |
| import android.widget.AdapterView.OnItemSelectedListener; |
| |
| /** |
| * Displays an Android spinner widget backed by data in an array. The |
| * array is loaded from the strings.xml resources file. |
| */ |
| public class SpinnerActivity extends Activity { |
| |
| /** |
| * Fields to contain the current position and display contents of the spinner |
| */ |
| protected int mPos; |
| protected String mSelection; |
| |
| /** |
| * ArrayAdapter connects the spinner widget to array-based data. |
| */ |
| protected ArrayAdapter<CharSequence> mAdapter; |
| |
| /** |
| * The initial position of the spinner when it is first installed. |
| */ |
| public static final int DEFAULT_POSITION = 2; |
| |
| /** |
| * The name of a properties file that stores the position and |
| * selection when the activity is not loaded. |
| */ |
| public static final String PREFERENCES_FILE = "SpinnerPrefs"; |
| |
| /** |
| * These values are used to read and write the properties file. |
| * PROPERTY_DELIMITER delimits the key and value in a Java properties file. |
| * The "marker" strings are used to write the properties into the file |
| */ |
| public static final String PROPERTY_DELIMITER = "="; |
| |
| /** |
| * The key or label for "position" in the preferences file |
| */ |
| public static final String POSITION_KEY = "Position"; |
| |
| /** |
| * The key or label for "selection" in the preferences file |
| */ |
| public static final String SELECTION_KEY = "Selection"; |
| |
| public static final String POSITION_MARKER = |
| POSITION_KEY + PROPERTY_DELIMITER; |
| |
| public static final String SELECTION_MARKER = |
| SELECTION_KEY + PROPERTY_DELIMITER; |
| |
| /** |
| * Initializes the application and the activity. |
| * 1) Sets the view |
| * 2) Reads the spinner's backing data from the string resources file |
| * 3) Instantiates a callback listener for handling selection from the |
| * spinner |
| * Notice that this method includes code that can be uncommented to force |
| * tests to fail. |
| * |
| * This method overrides the default onCreate() method for an Activity. |
| * |
| * @see android.app.Activity#onCreate(android.os.Bundle) |
| */ |
| @Override |
| public void onCreate(Bundle savedInstanceState) { |
| |
| /** |
| * derived classes that use onCreate() overrides must always call the super constructor |
| */ |
| super.onCreate(savedInstanceState); |
| |
| setContentView(R.layout.main); |
| |
| Spinner spinner = (Spinner) findViewById(R.id.Spinner01); |
| |
| /* |
| * Create a backing mLocalAdapter for the Spinner from a list of the |
| * planets. The list is defined by XML in the strings.xml file. |
| */ |
| |
| this.mAdapter = ArrayAdapter.createFromResource(this, R.array.Planets, |
| android.R.layout.simple_spinner_dropdown_item); |
| |
| /* |
| * Attach the mLocalAdapter to the spinner. |
| */ |
| |
| spinner.setAdapter(this.mAdapter); |
| |
| /* |
| * Create a listener that is triggered when Android detects the |
| * user has selected an item in the Spinner. |
| */ |
| |
| OnItemSelectedListener spinnerListener = new myOnItemSelectedListener(this,this.mAdapter); |
| |
| /* |
| * Attach the listener to the Spinner. |
| */ |
| |
| spinner.setOnItemSelectedListener(spinnerListener); |
| |
| |
| /* |
| * To demonstrate a failure in the preConditions test, |
| * uncomment the following line. |
| * The test will fail because the selection listener for the |
| * Spinner is not set. |
| */ |
| // spinner.setOnItemSelectedListener(null); |
| |
| } |
| |
| |
| /** |
| * A callback listener that implements the |
| * {@link android.widget.AdapterView.OnItemSelectedListener} interface |
| * For views based on adapters, this interface defines the methods available |
| * when the user selects an item from the View. |
| * |
| */ |
| public class myOnItemSelectedListener implements OnItemSelectedListener { |
| |
| /* |
| * provide local instances of the mLocalAdapter and the mLocalContext |
| */ |
| |
| ArrayAdapter<CharSequence> mLocalAdapter; |
| Activity mLocalContext; |
| |
| /** |
| * Constructor |
| * @param c - The activity that displays the Spinner. |
| * @param ad - The Adapter view that |
| * controls the Spinner. |
| * Instantiate a new listener object. |
| */ |
| public myOnItemSelectedListener(Activity c, ArrayAdapter<CharSequence> ad) { |
| |
| this.mLocalContext = c; |
| this.mLocalAdapter = ad; |
| |
| } |
| |
| /** |
| * When the user selects an item in the spinner, this method is invoked by the callback |
| * chain. Android calls the item selected listener for the spinner, which invokes the |
| * onItemSelected method. |
| * |
| * @see android.widget.AdapterView.OnItemSelectedListener#onItemSelected( |
| * android.widget.AdapterView, android.view.View, int, long) |
| * @param parent - the AdapterView for this listener |
| * @param v - the View for this listener |
| * @param pos - the 0-based position of the selection in the mLocalAdapter |
| * @param row - the 0-based row number of the selection in the View |
| */ |
| public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) { |
| |
| SpinnerActivity.this.mPos = pos; |
| SpinnerActivity.this.mSelection = parent.getItemAtPosition(pos).toString(); |
| /* |
| * Set the value of the text field in the UI |
| */ |
| TextView resultText = (TextView)findViewById(R.id.SpinnerResult); |
| resultText.setText(SpinnerActivity.this.mSelection); |
| } |
| |
| /** |
| * The definition of OnItemSelectedListener requires an override |
| * of onNothingSelected(), even though this implementation does not use it. |
| * @param parent - The View for this Listener |
| */ |
| public void onNothingSelected(AdapterView<?> parent) { |
| |
| // do nothing |
| |
| } |
| } |
| |
| /** |
| * Restores the current state of the spinner (which item is selected, and the value |
| * of that item). |
| * Since onResume() is always called when an Activity is starting, even if it is re-displaying |
| * after being hidden, it is the best place to restore state. |
| * |
| * Attempts to read the state from a preferences file. If this read fails, |
| * assume it was just installed, so do an initialization. Regardless, change the |
| * state of the spinner to be the previous position. |
| * |
| * @see android.app.Activity#onResume() |
| */ |
| @Override |
| public void onResume() { |
| |
| /* |
| * an override to onResume() must call the super constructor first. |
| */ |
| |
| super.onResume(); |
| |
| /* |
| * Try to read the preferences file. If not found, set the state to the desired initial |
| * values. |
| */ |
| |
| if (!readInstanceState(this)) setInitialState(); |
| |
| /* |
| * Set the spinner to the current state. |
| */ |
| |
| Spinner restoreSpinner = (Spinner)findViewById(R.id.Spinner01); |
| restoreSpinner.setSelection(getSpinnerPosition()); |
| |
| } |
| |
| /** |
| * Store the current state of the spinner (which item is selected, and the value of that item). |
| * Since onPause() is always called when an Activity is about to be hidden, even if it is about |
| * to be destroyed, it is the best place to save state. |
| * |
| * Attempt to write the state to the preferences file. If this fails, notify the user. |
| * |
| * @see android.app.Activity#onPause() |
| */ |
| @Override |
| public void onPause() { |
| |
| /* |
| * an override to onPause() must call the super constructor first. |
| */ |
| |
| super.onPause(); |
| |
| /* |
| * Save the state to the preferences file. If it fails, display a Toast, noting the failure. |
| */ |
| |
| if (!writeInstanceState(this)) { |
| Toast.makeText(this, |
| "Failed to write state!", Toast.LENGTH_LONG).show(); |
| } |
| } |
| |
| /** |
| * Sets the initial state of the spinner when the application is first run. |
| */ |
| public void setInitialState() { |
| |
| this.mPos = DEFAULT_POSITION; |
| |
| } |
| |
| /** |
| * Read the previous state of the spinner from the preferences file |
| * @param c - The Activity's Context |
| */ |
| public boolean readInstanceState(Context c) { |
| |
| /* |
| * The preferences are stored in a SharedPreferences file. The abstract implementation of |
| * SharedPreferences is a "file" containing a hashmap. All instances of an application |
| * share the same instance of this file, which means that all instances of an application |
| * share the same preference settings. |
| */ |
| |
| /* |
| * Get the SharedPreferences object for this application |
| */ |
| |
| SharedPreferences p = c.getSharedPreferences(PREFERENCES_FILE, MODE_WORLD_READABLE); |
| /* |
| * Get the position and value of the spinner from the file, or a default value if the |
| * key-value pair does not exist. |
| */ |
| this.mPos = p.getInt(POSITION_KEY, SpinnerActivity.DEFAULT_POSITION); |
| this.mSelection = p.getString(SELECTION_KEY, ""); |
| |
| /* |
| * SharedPreferences doesn't fail if the code tries to get a non-existent key. The |
| * most straightforward way to indicate success is to return the results of a test that |
| * SharedPreferences contained the position key. |
| */ |
| |
| return (p.contains(POSITION_KEY)); |
| |
| } |
| |
| /** |
| * Write the application's current state to a properties repository. |
| * @param c - The Activity's Context |
| * |
| */ |
| public boolean writeInstanceState(Context c) { |
| |
| /* |
| * Get the SharedPreferences object for this application |
| */ |
| |
| SharedPreferences p = |
| c.getSharedPreferences(SpinnerActivity.PREFERENCES_FILE, MODE_WORLD_READABLE); |
| |
| /* |
| * Get the editor for this object. The editor interface abstracts the implementation of |
| * updating the SharedPreferences object. |
| */ |
| |
| SharedPreferences.Editor e = p.edit(); |
| |
| /* |
| * Write the keys and values to the Editor |
| */ |
| |
| e.putInt(POSITION_KEY, this.mPos); |
| e.putString(SELECTION_KEY, this.mSelection); |
| |
| /* |
| * Commit the changes. Return the result of the commit. The commit fails if Android |
| * failed to commit the changes to persistent storage. |
| */ |
| |
| return (e.commit()); |
| |
| } |
| |
| public int getSpinnerPosition() { |
| return this.mPos; |
| } |
| |
| public void setSpinnerPosition(int pos) { |
| this.mPos = pos; |
| } |
| |
| public String getSpinnerSelection() { |
| return this.mSelection; |
| } |
| |
| public void setSpinnerSelection(String selection) { |
| this.mSelection = selection; |
| } |
| } |