@blog.justoneplanet.info

日々勉強

androidで設定画面を作る

■設定画面

SettingActivity.java

以下のようにしてActivityを定義する。

package info.justoneplanet.android.sample.preference;

import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;
import android.util.Log;

public class SettingActivity extends PreferenceActivity implements OnPreferenceChangeListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.setting);
    }
    
    /**
     * 設定が変更された時
     */
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        Log.e("preference changed - " + preference.toString(), newValue.toString());
        return false;
    }
}

驚くことに保存するロジックは書かなくて良い。以下のXMLを定義すればkeyを元にして自動的に保存される。

res/xml/setting.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="@string/group1">
        <CheckBoxPreference
            android:key="@string/item1_key" 
            android:title="@string/item1" 
            android:summary="@string/item1_summary" 
            android:summaryOn="@string/item1_summary_on" 
            android:summaryOff="@string/item1_summary_off" 
            android:defaultValue="true" />
    </PreferenceCategory>
    <PreferenceCategory android:title="@string/group1">
        <ListPreference 
            android:key="@string/item2_key" 
            android:title="@string/item2"
            android:summary="@string/item2_summary" 
            android:dialogTitle="@string/item2" 
            android:entries="@array/list_entries" 
            android:entryValues="@array/list_entryvalues" 
            android:selectable="true"
            android:enabled="true" 
            android:positiveButtonText="OK" 
            android:negativeButtonText="Cancel" 
            android:defaultValue="2nd">
            </ListPreference>
        <RingtonePreference
            android:key="@string/melody_key"
            android:title="@string/melody"
            android:summary="@string/melody_summary"
            android:showDefault="true" />
    </PreferenceCategory>
</PreferenceScreen>

■設定呼び出し画面

以下のようにして通常のSharedPreferenceから読み出しできる。PreferenceManager.getDefaultSharedPreferences(this);だけが設定画面用の呼び出しである。

package info.justoneplanet.android.sample.preference;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity {
    
    private static final int REQUEST_CODE = 200;
    private SharedPreferences sharedPreferences;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // sharedpreferenceの呼び出し
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    }
    
    @Override
    public void onResume() {
        super.onResume();
        
        // 設定から戻ってきたときに反映されているように
        // 設定1
        TextView textView1 = (TextView) findViewById(R.id.item1);
        textView1.setText(String.valueOf(sharedPreferences.getBoolean(getString(R.string.item1_key), true)));
        
        // 設定2
        TextView textView2 = (TextView) findViewById(R.id.item2);
        textView2.setText(String.valueOf(sharedPreferences.getString(getString(R.string.item2_key), getString(R.string.not_set))));
        
        // 設定3
        TextView textView3 = (TextView) findViewById(R.id.item3);
        textView3.setText(String.valueOf(sharedPreferences.getString(getString(R.string.melody_key), getString(R.string.not_set))));
    }
    
    /**
     * メニューボタンが押された時
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        boolean result = super.onCreateOptionsMenu(menu);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return result;
    }
    
    /**
     * メニューが選択された時
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch(item.getItemId()){
        case R.id.menu_setting:
            Intent intent = new Intent(this, SettingActivity.class);
            startActivityForResult(intent, REQUEST_CODE);
            return true;
        }
        return false;
    }
}

ロジックには関係しないが後でコピーする為にリソースも残しておく。

res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Preference</string>
    <string name="menu_setting">Setting</string>
    <string name="not_set">Not set, yet.</string>
    <string name="group1">group 1</string>
    <string name="item1">item 1</string>
    <string name="item1_key">item1</string>
    <string name="item1_summary_on">it is on</string>
    <string name="item1_summary_off">it is off</string>
    <string name="item1_summary">summary1</string>
        
    <string name="group2">group 2</string>
    <string name="item2">item 2</string>
    <string name="item2_key">item2</string>
    <string name="item2_summary">summary1</string>
    
    <string name="melody">melody</string>
    <string name="melody_key">melody</string>
    <string name="melody_summary">melody</string>
</resources>

res/values/array.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string-array name="list_entries">
    <item>Item 1</item>
    <item>Item 2</item>
    <item>Item 3</item>
  </string-array>
  <string-array name="list_entryvalues">
    <item>1</item>
    <item>2</item>
    <item>3</item>
  </string-array>
</resources>

ちなみに属性値を誤って入力しなかったりするとR.javaが崩れる。

res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/app_name" />
    <TextView
        android:id="@+id/item1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/app_name" />
    <TextView
        android:id="@+id/item2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/app_name" />
    <TextView
        android:id="@+id/item3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/app_name" />
</LinearLayout>

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment