Tab を作ってみた その2

XMLリソースを使わずにTabを作る場合(XMLリソース使う場合は Tab を作ってみた)
Intent を指定するか,
TabHost.TabContentFactory インターフェースを使用する.

TabContentFactory の public View createTabContent(String tag) を実装すると,
返り値の View がそのまま Tab の画面に表示される

というわけで,Tab を作ってみる

サンプルコード
  1. public class TabSample extends TabActivity implements TabHost.TabContentFactory {  
  2.   @Override  
  3.   public void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.       
  6.     // TabHost の取得  
  7.     final TabHost tabHost = getTabHost();  
  8.       
  9.     // アイコン付きタブ  
  10.     tabHost.addTab(tabHost.newTabSpec("tab1")  
  11.         .setIndicator("tab1", getResources().getDrawable(R.drawable.icon))  
  12.         .setContent(this));  
  13.       
  14.     // 任意の View  
  15.     tabHost.addTab(tabHost.newTabSpec("tab2")  
  16.         .setIndicator("Views")  
  17.         .setContent(new MyTabContentFactory()));  
  18.   
  19.     // Intent を起動するタブ  
  20.     tabHost.addTab(tabHost.newTabSpec("tab3")  
  21.         .setIndicator("List")  
  22.         .setContent(new Intent(this, ListViewSample.class)));  
  23.   }  
  24.   
  25.   public View createTabContent(String tag) {  
  26.     final TextView tv = new TextView(this);  
  27.     tv.setText("This is " + tag);  
  28.     return tv;  
  29.   }  
  30.   
  31.   // TabContentFactory を実装したクラスの作成  
  32.   class MyTabContentFactory implements TabContentFactory {  
  33.     public View createTabContent(String tag) {  
  34.       // 任意の View を設定  
  35.       View view = LayoutInflater.from(TabSample.this).inflate(R.layout.views, null);  
  36.       return view;  
  37.     }    
  38.   }  
  39. }  

プログラムを実行すると...





こんな感じ!

参考サイト
http://developer.android.com/intl/ja/reference/android/widget/TabHost.TabContentFactory.html

ListPreference を使ってみた

ListPreference は
java.lang.Object
  ↳ android.preference.Preference
    ↳ android.preference.DialogPreference
      ↳ android.preference.ListPreference
を使います

List の Dialog を表示させる Preference の一つで
String型の値を SharedPreferences に保存します

というわけで,ListPreference をいじってみた

サンプルコード
  1. public class EditTextPreferenceSample extends PreferenceActivity {  
  2.   @Override  
  3.   public void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.     // addPreferencesFromResource(R.xml.edittext_preference);  
  6.   
  7.     PreferenceScreen ps = getPreferenceManager().createPreferenceScreen(this);  
  8.   
  9.     PreferenceCategory pc = new PreferenceCategory(this);  
  10.     pc.setTitle(R.string.title_category);  
  11.     ps.addPreference(pc);  
  12.   
  13.     EditTextPreference editTextPreference = new EditTextPreference(this);  
  14.     editTextPreference.setKey(getString(R.string.key_edittext_preference));  
  15.     editTextPreference.setTitle(R.string.title_edittext_preference);  
  16.     editTextPreference.setSummary(R.string.summary_edittext_preference);  
  17.     editTextPreference.setDialogTitle(R.string.dialog_title_edittext_preference);  
  18.     editTextPreference.setDialogMessage(R.string.dialog_message_edittext_preference);  
  19.   
  20.     pc.addPreference(editTextPreference);  
  21.     setPreferenceScreen(ps);  
  22.   }  
  23. }  

プログラムを実行すると...



こんな感じ!

XML で一括で作成することもできます

サンプルコード
  1. public class ListPreferenceSample extends PreferenceActivity {  
  2.   @Override  
  3.   public void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.     // XML で Preference を設定  
  6.     addPreferencesFromResource(R.xml.list_preference);  
  7.   
  8.     // ListPreference の取得  
  9.     ListPreference listPreferrence =   
  10.       (ListPreference) findPreference(  
  11.           getString(R.string.key_list_preference));  
  12.   }    
  13. }  

List_preference.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <PreferenceScreen   
  3.   xmlns:android="http://schemas.android.com/apk/res/android">  
  4.   <PreferenceCategory   
  5.     android:title="@string/title_category">  
  6.     <ListPreference   
  7.       android:key="@string/key_list_preference"  
  8.       android:title="@string/title_list_preference"   
  9.       android:summaryOn="@string/summary_list_preference"  
  10.       android:entries="@array/entries_list_preference"   
  11.       android:entryValues="@array/entryvalues_list_preference"  
  12.       android:dialogTitle="@string/dialog_title_list_preference" />  
  13.   </PreferenceCategory>  
  14. </PreferenceScreen>  


参考サイト
http://developer.android.com/intl/ja/reference/android/preference/ListPreference.html

EditTextPreference を使ってみた

EditTextPreference は
java.lang.Object
  ↳ android.preference.Preference
    ↳ android.preference.DialogPreference
      ↳ android.preference.EditTextPreference
を使います

EditText を Dialog 上で表示させる Preference の一つで
String型の値を SharedPreferences に保存します

というわけで,EditTextPreference をいじってみた

サンプルコード
  1. public class EditTextPreferenceSample extends PreferenceActivity {  
  2.   @Override  
  3.   public void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.   
  6.     PreferenceScreen ps = getPreferenceManager().createPreferenceScreen(this);  
  7.   
  8.     PreferenceCategory pc = new PreferenceCategory(this);  
  9.     pc.setTitle(R.string.title_category);  
  10.     ps.addPreference(pc);  
  11.   
  12.     EditTextPreference editTextPreference = new EditTextPreference(this);  
  13.     editTextPreference.setKey(getString(R.string.key_edittext_preference));  
  14.     editTextPreference.setTitle(R.string.title_edittext_preference);  
  15.     editTextPreference.setSummary(R.string.summary_edittext_preference);  
  16.     editTextPreference.setDialogTitle(R.string.dialog_title_edittext_preference);  
  17.     editTextPreference.setDialogMessage(R.string.dialog_message_edittext_preference);  
  18.   
  19.     pc.addPreference(editTextPreference);  
  20.     setPreferenceScreen(ps);  
  21.   }  
  22. }  

プログラムを実行すると...



こんな感じ!

XML で一括で作成することもできます

サンプルコード
  1. public class EditTextPreferenceSample extends PreferenceActivity {  
  2.   @Override  
  3.   public void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.     // XML で Preference を設定  
  6.     addPreferencesFromResource(R.xml.edittext_preference);  
  7.   
  8.     // EditTextPreference の取得  
  9.     EditTextPreference editTextPreferrence =   
  10.       (EditTextPreference) findPreference(  
  11.           getString(R.string.key_edittext_preference));  
  12.   }    
  13. }  

edittext_preference.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <PreferenceScreen   
  3.   xmlns:android="http://schemas.android.com/apk/res/android">  
  4.   <PreferenceCategory   
  5.     android:title="@string/title_category">  
  6.     <EditTextPreference   
  7.       android:key="@string/key_edittext_preference"  
  8.       android:title="@string/title_edittext_preference"   
  9.       android:summary="@string/summary_edittext_preference"  
  10.       android:dialogTitle="@string/dialog_title_edittext_preference" />  
  11.   </PreferenceCategory>  
  12. </PreferenceScreen>  


参考サイト
http://developer.android.com/intl/ja/reference/android/preference/EditTextPreference.html

CheckBoxPreference を使ってみた

CheckBoxPreference は
java.lang.Object
  ↳ android.preference.Preference
    ↳ android.preference.CheckBoxPreference
を使います

checkbox の機能を持つ Preference の一つで
boolean型の値を SharedPreferences に保存します

というわけで,CheckBoxPreference をいじってみた

サンプルコード
  1. public class CheckBoxPreferenceSample extends PreferenceActivity {  
  2.   @Override  
  3.   public void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.       
  6.     CheckBoxPreference checkBoxPreference = new CheckBoxPreference(this);  
  7.   
  8.     // Key の設定  
  9.     checkBoxPreference.setKey(getString(R.string.key_checkbox_preference));  
  10.     // Title の設定  
  11.     checkBoxPreference.setTitle(R.string.title_checkbox_preference);  
  12.   
  13.     // サマリーを設定  
  14.     //checkBoxPreference.setSummary(R.string.summary_checkbox_preference);  
  15.     // CheckBox が On の時のサマリーを設定  
  16.     checkBoxPreference.setSummaryOn("Summary On");  
  17.     // CheckBox が Off の時のサマリーを設定  
  18.     checkBoxPreference.setSummaryOff("Summary Off");  
  19.   
  20.     // PrefenceScreen & PreferenceCategory  
  21.     PreferenceScreen ps = getPreferenceManager().createPreferenceScreen(this);  
  22.     PreferenceCategory pc = new PreferenceCategory(this);  
  23.     // PreferenceCategory のタイトルを設定  
  24.     pc.setTitle(R.string.title_category);  
  25.     // PreferenceCategory を PreferenceScreen に追加  
  26.     ps.addPreference(pc);  
  27.     // Preference を PreferenceCategory に追加  
  28.     pc.addPreference(checkBoxPreference);  
  29.     // PreferenceScrren の設定  
  30.     setPreferenceScreen(ps);  
  31.   
  32.     // Preference がチェックされているか  
  33.     checkBoxPreference.isChecked();  
  34.     // チェック状態を変更  
  35.     //checkBoxPreference.setChecked(true);  
  36.   
  37.     // Preference が変更されたときに呼び出されるコールバックの登録  
  38.     checkBoxPreference.setOnPreferenceChangeListener(  
  39.         new OnPreferenceChangeListener() {  
  40.           @Override  
  41.           public boolean onPreferenceChange(  
  42.               Preference preference,  
  43.               Object newValue) {  
  44.             // Preference が変更されたときの動作  
  45.             return true;  
  46.           }      
  47.         });  
  48.   }    
  49. }  

プログラムを実行すると...



こんな感じ!

XML で一括で作成することもできます

サンプルコード
  1. public class CheckBoxPreferenceSample extends PreferenceActivity {  
  2.   @Override  
  3.   public void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.     // XML で Preference を設定  
  6.     addPreferencesFromResource(R.xml.checkbox_preference);  
  7.   
  8.     // CheckBoxPreference の取得  
  9.     CheckBoxPreference checkBoxPreferrence =   
  10.       (CheckBoxPreference) findPreference(  
  11.           getString(R.string.key_checkbox_preference));  
  12.   }    
  13. }  

checkbox_preference.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <PreferenceScreen   
  3.   xmlns:android="http://schemas.android.com/apk/res/android">  
  4.   <PreferenceCategory   
  5.     android:title="@string/title_category">  
  6.     <CheckBoxPreference   
  7.       android:key="@string/key_checkbox_preference"  
  8.       android:title="@string/title_checkbox_preference"   
  9.       android:summaryOn="@string/summary_on_checkbox_preference"  
  10.       android:summaryOff="@string/summary_off_checkbox_preference" />  
  11.       <!-- android:summary="@string/summary_checkbox_preference" -->  
  12.   </PreferenceCategory>  
  13. </PreferenceScreen>  


参考サイト
http://developer.android.com/intl/ja/reference/android/preference/CheckBoxPreference.html

SharedPreferences を使ってみた

Preference は Androidアプリでデータを保存する方法のひとつ
データをキーと値の組み合わせで保存します.

ファイルなどに保存するよりも非常に簡単にデータを保存できます

今回は SharedPreferences を...

SharedPreferences はまず
getSharedPreferences(String name, int mode);
でを取得してきます
name は Preference 自体の名前を指定します
mode には
  • Activity.MODE_PRIVATE
  • Activity.MODE_WORLD_READABLE
  • Activity.MODE_WORLD_WRITEABLE
などを指定します.

保存された Preference は data/data/パッケージ名/shared_prefs
の中に xmlファイルとして保存されるようです

取得する時は
  • getString(String key, String defValue);
  • getInt(String key, int defValue);
  • getLong(String key, long defValue);
  • ...
などを使って取得して着ます

というわけで,Preference を使ってみた

サンプルコード
  1. public class PreferencesTest extends Activity implements OnClickListener {  
  2.   private static final String PREF_KEY = "preferenceTest";  
  3.   private static final String KEY_TEXT = "text";  
  4.   
  5.   SharedPreferences pref;  
  6.   SharedPreferences.Editor editor;  
  7.   
  8.   EditText mEditText;  
  9.     
  10.   @Override  
  11.   public void onCreate(Bundle savedInstanceState) {  
  12.     super.onCreate(savedInstanceState);  
  13.     setContentView(R.layout.preferencestest);  
  14.   
  15.     // SharedPrefernces の取得  
  16.     pref = getSharedPreferences(PREF_KEY, Activity.MODE_PRIVATE);  
  17.   
  18.     mEditText = (EditText) findViewById(R.id.EditText);  
  19.   
  20.     Button button;  
  21.     button = (Button) findViewById(R.id.Button);  
  22.     button.setOnClickListener(this);  
  23.       
  24.     TextView textView;  
  25.     textView = (TextView) findViewById(R.id.TextView);  
  26.     // SharedPreferences よりデータを取得  
  27.     textView.setText(pref.getString(KEY_TEXT, "No Data"));  
  28.   }  
  29.   
  30.   public void onClick(View v) {  
  31.     if (v.getId() == R.id.Button) {  
  32.       // Editor の設定  
  33.       editor = pref.edit();  
  34.       // Editor に値を代入  
  35.       editor.putString(  
  36.           KEY_TEXT,  
  37.           mEditText.getText().toString()  
  38.       );  
  39.       // データの保存  
  40.       editor.commit();  
  41.     }  
  42.   }  
  43. }  

プログラムを実行すると...

保存して...

再び起動

こんな感じ!

ちなみに保存された Preference は
preferencetest.xml
  1. <map>  
  2. <string name="text">Test</string>  
  3. </map>  


参考サイト
http://developer.android.com/intl/ja/reference/android/content/SharedPreferences.html

Wallpaper を替えてみた

壁紙を替えるには WallpaperManager を使用します

替え方は
  • setBitmap(Bitmap bitmap)
  • setResource(int resid)
  • setStream(InputStream data)
の三つから指定します

まず AndroidManifest でパーミッションを設定する必要があります

AndroidManifest.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.   ... >  
  4.     ・  
  5.     ・  
  6.     ・  
  7.   <uses-permission   
  8.     android:name="android.permission.SET_WALLPAPER" />  
  9. </manifest>  

サンプルコード
  1. public class WallpaperSample extends Activity implements OnClickListener {  
  2.   WallpaperManager mWM;  
  3.   
  4.   @Override  
  5.   public void onCreate(Bundle savedInstanceState) {  
  6.     super.onCreate(savedInstanceState);  
  7.     setContentView(R.layout.wallpaper_sample);  
  8.   
  9.     Button button;  
  10.     button = (Button) findViewById(R.id.Button_Set);  
  11.     button.setOnClickListener(this);  
  12.     button = (Button) findViewById(R.id.Button_Clear);  
  13.     button.setOnClickListener(this);  
  14.   
  15.     // WindowManager の取得  
  16.     mWM = WallpaperManager.getInstance(this);  
  17.   
  18.     // 壁紙の最小の幅,最小の高さの取得  
  19.     int width = mWM.getDesiredMinimumWidth();  
  20.     int height = mWM.getDesiredMinimumHeight();  
  21.   }  
  22.   
  23.   @Override  
  24.   public void onClick(View v) {  
  25.     switch(v.getId()) {  
  26.     case R.id.Button_Set:  
  27.       try {  
  28.         // 壁紙をリソースから設定  
  29.         mWM.setResource(R.drawable.icon);  
  30.       } catch (IOException e) {  
  31.         e.printStackTrace();  
  32.       }  
  33.       break;  
  34.     case R.id.Button_Clear:  
  35.       try {  
  36.         // 壁紙をデフォルトに戻す  
  37.         mWM.clear();  
  38.       } catch (IOException e) {  
  39.         e.printStackTrace();  
  40.       }  
  41.       break;  
  42.     }  
  43.   }  
  44. }  

プログラムを実行すると...

変更前
変更後

こんな感じ!

Activity の背景を壁紙にしたいときは
  1. <activity   
  2.   android:name=".activity.WallpaperSample"  
  3.   android:theme="@android:style/Theme.Wallpaper">  
とテーマを指定すればOK

ちなみに
API 2.0以前ではできないので注意!
下記の方法で設定するようです
int width = getWallpaperDesiredMinimumWidth();
int height = getWallpaperDesiredMinimumHeight();
setWallpaper(Bitmap or InputStream);
clearWallpaper();


参考サイト
http://developer.android.com/intl/ja/reference/android/app/WallpaperManager.html

ExpandableListView を使ってみた

ExpandableListView は
java.lang.Object
  ↳ android.view.View
    ↳ android.view.ViewGroup
      ↳ android.widget.AdapterView<T extends android.widget.Adapter>
        ↳ android.widget.AbsListView
          ↳ android.widget.ListView
            ↳ android.widget.ExpandableListView
を使用します

Group のリストがありそれぞれが Child のリストを保持しています.
Group をクリックすRと Child のリストが開き,もう一度クリックするとリストが閉じられます.

というわけで,ExpandableListView をいじってみた.

サンプルコード
  1. public class ExpandableListViewSample extends Activity {  
  2.   private static final String KEY1 = "GROUP";  
  3.   private static final String KEY2 = "CHILD";  
  4.   
  5.   // 表示させる文字列  
  6.   private String[] GROUPS = {"Group1""Group2""Group3"};  
  7.   private String[][][] CHILDREN = {  
  8.       {{"Child11""Text11"}},   
  9.       {{"Child21""Text21"}, {"Child22""Text22"}},  
  10.       {{"Child31""Text31"}, {"Child32""Text32"}, {"Child33""Text33"}},   
  11.   };  
  12.   
  13.   @Override  
  14.   public void onCreate(Bundle savedInstanceState) {  
  15.     super.onCreate(savedInstanceState);  
  16.     setContentView(R.layout.expandablelistview_sample);  
  17.   
  18.     // 設定する文字列のリスト  
  19.     List<Map<String, String>> groupData =  
  20.         new ArrayList<Map<String, String>>();  
  21.     List<List<Map<String, String>>> childData =  
  22.         new ArrayList<List<Map<String, String>>>();  
  23.   
  24.     // リストに文字列を設定していく  
  25.     for (int i = 0; i < GROUPS.length; i++) {  
  26.       // 親要素の追加  
  27.       Map<String, String> curGroupMap =  
  28.           new HashMap<String, String>();  
  29.       groupData.add(curGroupMap);  
  30.       curGroupMap.put(KEY1, GROUPS[i]);  
  31.       curGroupMap.put(KEY2, "");  
  32.   
  33.       List<Map<String, String>> children =  
  34.           new ArrayList<Map<String, String>>();  
  35.       if (CHILDREN.length > i) {  
  36.         for (int j = 0; j < CHILDREN[i].length; j++) {  
  37.           // 子要素の追加  
  38.           Map<String, String> curChildMap =  
  39.               new HashMap<String, String>();  
  40.           children.add(curChildMap);  
  41.           curChildMap.put(KEY1, CHILDREN[i][j][0]);  
  42.           curChildMap.put(KEY2, CHILDREN[i][j][1]);  
  43.         }  
  44.       }  
  45.       childData.add(children);  
  46.     }  
  47.   
  48.     // ExpandbleListAdapter の作成  
  49.     ExpandableListAdapter adapter =  
  50.         new SimpleExpandableListAdapter(  
  51.             this,  
  52.             groupData,  
  53.             android.R.layout.simple_expandable_list_item_1,  
  54.             new String[] { KEY1, KEY2 },  
  55.             new int[] { android.R.id.text1, android.R.id.text2 },  
  56.             childData,  
  57.             android.R.layout.simple_expandable_list_item_2,  
  58.             new String[] { KEY1, KEY2 },  
  59.             new int[] { android.R.id.text1, android.R.id.text2 }  
  60.         );  
  61.   
  62.     ExpandableListView listView =   
  63.       (ExpandableListView) findViewById(R.id.ExpandableListView);  
  64.     // Adapter を設定  
  65.     listView.setAdapter(adapter);  
  66.       
  67.     // グループがクリックされた時に呼び出されるコールバックを登録  
  68.     listView.setOnGroupClickListener(new OnGroupClickListener() {  
  69.       @Override  
  70.       public boolean onGroupClick(ExpandableListView parent,  
  71.           View v, int groupPosition, long id) {  
  72.         // クリックされた時の処理  
  73.         return false;  
  74.       }        
  75.     });  
  76.       
  77.     // グループ内の項目がクリックされた時に呼び出されるコールバックを登録  
  78.     listView.setOnChildClickListener(new OnChildClickListener() {  
  79.       @Override  
  80.       public boolean onChildClick(ExpandableListView parent, View v,  
  81.           int groupPosition, int childPosition, long id) {  
  82.         // クリックされた時の処理  
  83.         return false;  
  84.       }        
  85.     });  
  86.   }    
  87. }  

さらに
setOnGroupCollapseListener でグループが閉じた時,
setOnGroupExpandListener でグループが開いた時
の処理もできる模様!

XMLリソース
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.   android:orientation="vertical"   
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="fill_parent">  
  6.   <TextView  
  7.     android:layout_width="fill_parent"  
  8.     android:layout_height="wrap_content"   
  9.     android:text="ExpandableListViewSample" />  
  10.   <ExpandableListView   
  11.     android:layout_width="fill_parent"  
  12.     android:layout_height="0dip"   
  13.     android:layout_weight="1"  
  14.     android:id="@+id/ExpandableListView">  
  15.   </ExpandableListView>  
  16. </LinearLayout>  
プログラムを実行すると...


グループを開いたとき

こんな感じ!


参考サイト http://developer.android.com/intl/ja/reference/android/widget/ExpandableListView.html

ListView で MultipleChoice モード

ListView で複数選択できるような List を作ることができます.

基本的には ListView や SingleChoice と同じ.
Adapter の作成時に Muliple Choice ようのレイアウトを設定するのと
setChoiceMode で ListView.CHOICE_MODE_MULTIPLEを設定するくらい
すると CheckBox 付きのリストが表示されます.

というわけで,MultipleChoiceList をいじってみた.

サンプルコード
  1. public class MultipleChoiceListViewSample extends Activity {  
  2.   @Override  
  3.   public void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.     setContentView(R.layout.listview_sample);  
  6.     ListView listView = (ListView)findViewById(R.id.ListView);  
  7.   
  8.     // アダプタの作成  
  9.     listView.setAdapter(new ArrayAdapter<String>(  
  10.         this,  
  11.         android.R.layout.simple_list_item_multiple_choice,  
  12.         DAYS)  
  13.     );  
  14.   
  15.     // フォーカスが当たらないよう設定  
  16.     listView.setItemsCanFocus(false);  
  17.   
  18.     // 選択の方式の設定  
  19.     listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);  
  20.       
  21.     for (int i = 1; i < 6; i++) {  
  22.       // 指定したアイテムがチェックされているかを設定  
  23.       listView.setItemChecked(i, true);  
  24.     }  
  25.       
  26.     // アイテムがクリックされたときに呼び出されるコールバックを登録  
  27.     listView.setOnItemClickListener(new OnItemClickListener() {  
  28.       @Override  
  29.       public void onItemClick(AdapterView<?> parent,  
  30.               View view, int position, long id) {  
  31.           // クリックされた時の処理  
  32.       }  
  33.     });  
  34.       
  35.     // 現在チェックされているアイテムを取得  
  36.     // チェックされてないアイテムは含まれない模様  
  37.     SparseBooleanArray checked = listView.getCheckedItemPositions();  
  38.     for (int i = 0; i < checked.size(); i++) {  
  39.       // チェックされているアイテムの key の取得  
  40.       int key = checked.keyAt(i);  
  41.       Log.v(getClass().getSimpleName(), "values: " + DAYS[key]);  
  42.     }  
  43.   }  
  44.     
  45.   // ListView に表示させる文字列  
  46.   private static final String[] DAYS = new String[] {  
  47.     "Sunday""Monday""Tuesday""Wednesday",  
  48.     "Thursday""Friday""Saturday"  
  49.   };  
  50. }  
XMLリソース
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.   android:orientation="vertical"   
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="fill_parent">  
  6.   <TextView android:layout_width="fill_parent"  
  7.     android:layout_height="wrap_content"   
  8.     android:text="ListSample" />  
  9.   <ListView   
  10.     android:layout_width="fill_parent"  
  11.     android:layout_height="0dip"   
  12.     android:layout_weight="1"  
  13.     android:id="@+id/ListView">  
  14.   </ListView>  
  15. </LinearLayout>  

実行すると...



こんな感じ!


参考サイト
http://developer.android.com/intl/ja/reference/android/widget/ListView.html

ListView で SingleChoice モード

ListView で一つしか選択できないような List を作ることができます.

基本的には ListView と同じ.
Adapter の作成時に Single Choice ようのレイアウトを設定するのと
setChoiceMode で ListView.CHOICE_MODE_SINGLEを設定するくらい
すると RadioButton 付きのリストが表示されます.

というわけで,SingleChoiceList をいじってみた

サンプルコード
  1. public class SingleChoiceListViewSample extends Activity {  
  2.   @Override  
  3.   public void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.     setContentView(R.layout.listview_sample);  
  6.     ListView listView = (ListView)findViewById(R.id.ListView);  
  7.   
  8.     // アダプタの作成  
  9.     listView.setAdapter(new ArrayAdapter<String>(  
  10.         this,  
  11.         android.R.layout.simple_list_item_single_choice,  
  12.         SIZES)  
  13.     );    
  14.           
  15.     // 選択の方式の設定  
  16.     listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);  
  17.     
  18.     // 指定したアイテムがチェックされているかを設定  
  19.     listView.setItemChecked(0true);  
  20.       
  21.     // アイテムがクリックされた時に呼び出されるコールバックを登録  
  22.     listView.setOnItemClickListener(new OnItemClickListener() {  
  23.         @Override  
  24.         public void onItemClick(AdapterView<?> parent,  
  25.                 View view, int position, long id) {  
  26.             // クリックされた時の処理  
  27.         }  
  28.     });  
  29.     
  30.     // 現在チェックされているアイテムの position を取得  
  31.     listView.getCheckedItemPosition();  
  32.   }  
  33.     
  34.   // ListView に表示させる文字列  
  35.   private static final String[] SIZES = new String[] {  
  36.       "XS(eXtra Small)""S(Small)""M(Medium)",  
  37.    "L(Large)""XL(eXtra Large)"  
  38.   };  
  39. }  

XMLリソース
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.   android:orientation="vertical"   
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="fill_parent">  
  6.   <TextView android:layout_width="fill_parent"  
  7.     android:layout_height="wrap_content"   
  8.     android:text="ListSample" />  
  9.   <ListView   
  10.     android:layout_width="fill_parent"  
  11.     android:layout_height="0dip"   
  12.     android:layout_weight="1"  
  13.     android:id="@+id/ListView">  
  14.   </ListView>  
  15. </LinearLayout>  

実行すると...



こんな感じ!


参考サイト
http://developer.android.com/intl/ja/reference/android/widget/ListView.html

XML で Button 変化

ボタンの変化をXMLで指定するには selector というのを指定してあげます
state_pressed が true なら押されている
state_focused が true ならフォーカスがあたっている
状態になりそれぞれのイメージを指定します

というわけで, XMLでボタンを変化させてみた

XMLリソース
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   <!-- 押されたときの Button -->  
  4.   <item android:drawable="@drawable/icon_pressed"  
  5.         android:state_pressed="true" />  
  6.   <!-- フォーカスがあたっているときの Button -->  
  7.   <item android:drawable="@drawable/icon_focused"  
  8.         android:state_focused="true" />  
  9.   <!-- 通常時の Button -->  
  10.   <item android:drawable="@drawable/icon" />  
  11. </selector>  

んで、メインの方はただバックグラウンドに指定するだけ
XMLで指定してしまってもOK

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.widget.Button;  
  4.   
  5. public class ButtonXMLTest extends Activity {  
  6.   Button button;  
  7.   @Override  
  8.   public void onCreate(Bundle savedInstanceState) {  
  9.     super.onCreate(savedInstanceState);  
  10.     setContentView(R.layout.buttonxmltest);  
  11.       
  12.     button = (Button) findViewById(R.id.Button);  
  13.     button.setBackgroundResource(R.drawable.buttonxml);  
  14.   }      
  15. }  

プログラムを実行すると...

通常時

ボタンにフォーカスがあたったとき

ボタンが押されたとき


こんな感じ!

参考サイト
http://developer.android.com/intl/ja/resources/tutorials/views/hello-formstuff.html

ソフトバンク、『X06HT HTC Desire』発売開始

2010年4月27日より、ソフトバンクモバイル初となるAndroid搭載スマートフォン「HTC Desire SoftBank X06HT」が発売されました。

詳しくはhttp://www.htc.com/jp/product/x06ht/overview.html

MediaPlayer を使ってみた

android で mp3, midi などを再生するには
MediaPlayer を使います

そして drawable/raw を作ってその中にメディアファイルを格納します

その後, MediaPlayer.create(context, resid); で作成します

というわけで, MediaPlayer をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.media.MediaPlayer;  
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7.   
  8. public class MediaPlayerTest extends Activity   
  9.                              implements OnClickListener {  
  10.   private MediaPlayer mediaPlayer = null;  
  11.   private Button button_Play;  
  12.   private Button button_Pause;  
  13.   private Button button_Stop;  
  14.   @Override  
  15.   public void onCreate(Bundle savedInstanceState) {  
  16.     super.onCreate(savedInstanceState);  
  17.     setContentView(R.layout.soundtest);  
  18.       
  19.     button_Play = (Button) findViewById(R.id.Button01);  
  20.     button_Play.setOnClickListener(this);  
  21.     button_Pause = (Button) findViewById(R.id.Button02);  
  22.     button_Pause.setOnClickListener(this);    
  23.     button_Stop = (Button) findViewById(R.id.Button03);  
  24.     button_Stop.setOnClickListener(this);    
  25.   
  26.     // メディアプレイヤーの作成  
  27.     mediaPlayer = MediaPlayer.create(this, R.raw.sample);  
  28.       
  29.     // ループ再生の設定  
  30.     // mediaPlayer.setLooping(true);  
  31.   }  
  32.   @Override  
  33.   public void onClick(View v) {  
  34.     if (v == button_Play) {  
  35.       // 再生してなかったら  
  36.       if (!mediaPlayer.isPlaying()) {  
  37.         // MediaPlayerの再生  
  38.         mediaPlayer.start();  
  39.       }  
  40.     } else if (v == button_Pause) {  
  41.       // MediaPlayerの一時停止  
  42.       mediaPlayer.pause();  
  43.     }  
  44.     else if (v == button_Stop) {  
  45.       // 再生してたら  
  46.       if (mediaPlayer.isPlaying()) {  
  47.         // MediaPlayerの停止  
  48.         mediaPlayer.stop();  
  49.         try {  
  50.           // MediaPlayerの準備  
  51.           mediaPlayer.prepare();  
  52.         } catch (Exception e) {}  
  53.       }  
  54.     }  
  55.   }  
  56. }  

こんな感じ!

参考サイト
http://developer.android.com/intl/ja/reference/android/media/MediaPlayer.html

ToneGenerator を使ってみた

ToneGeneratorを使うと簡単にトーンを鳴らせます
コンストラクタは
ToneGenerator (int streamType, int volume);
第1引数はストリームの種類
第2引数は音量

んで、
startTone(int ToneType) or startTone(int ToneType, int durationMs)
で再生します
後者は再生する時間を指定
Toneの種類に関してはToneGeneratorから

というわけで, ToneGenarator をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.media.AudioManager;  
  3. import android.media.ToneGenerator;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8.   
  9. public class ToneGeneratorTest extends Activity {  
  10.   ToneGenerator toneGenerator;  
  11.   @Override  
  12.   public void onCreate(Bundle savedInstanceState) {  
  13.     super.onCreate(savedInstanceState);  
  14.     setContentView(R.layout.tonegeneratortest);  
  15.   
  16.     // ToneGenerator の作成  
  17.     toneGenerator = new ToneGenerator(  
  18.         AudioManager.STREAM_ALARM,  
  19.         ToneGenerator.MAX_VOLUME  
  20.     );  
  21.   
  22.     ((Button) findViewById(R.id.Button01))  
  23.     .setOnClickListener(new OnClickListener() {  
  24.       public void onClick(View v) {  
  25.         // Tone再生  
  26.         toneGenerator.startTone(ToneGenerator.TONE_CDMA_ABBR_ALERT);  
  27.         // toneGenarator.stratTone(ToneGenerator.TONE_CDMA_ABBR_ALERT, 1000);  
  28.       }  
  29.     });  
  30.     ((Button) findViewById(R.id.Button02))  
  31.     .setOnClickListener(new OnClickListener() {  
  32.       public void onClick(View v) {  
  33.         // Tone停止  
  34.         toneGenerator.stopTone();  
  35.       }  
  36.     });  
  37.   }  
  38.     
  39.   @Override  
  40.   public void onDestroy() {  
  41.     super.onDestroy();  
  42.       
  43.     // ToneGenerator の解放  
  44.     toneGenerator.release();  
  45.   }  
  46. }  

こんな感じ!

参考サイト
http://developer.android.com/intl/ja/reference/android/media/ToneGenerator.html
http://developer.android.com/intl/ja/reference/android/media/AudioManager.html

Tab を作ってみた

Tab を使うには TabHost と TabWidget を使います
そして TabWidget でTabのコンテンツを表示するのに FrameLayout を使います

Tabのコンテンツとして 任意のViewを表示させるのと, Activityを起動する2種類があるようです

というわけで, Tab を作ってみた

注意するのは id として
  • TabHost は @android:id/tabhost
  • TabWidget は @android:id/tabs
  • メインの FrameLayout は @android:id/tabcotent
というのを指定してあげます

XMLリソース
  1. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"  
  2.   android:id="@android:id/tabhost"   
  3.   android:layout_width="fill_parent"  
  4.   android:layout_height="fill_parent">  
  5.   <LinearLayout   
  6.     android:orientation="vertical"  
  7.     android:layout_width="fill_parent"   
  8.     android:layout_height="fill_parent"  
  9.     android:padding="5dp">  
  10.     <TabWidget   
  11.       android:id="@android:id/tabs"  
  12.       ... />  
  13.     <FrameLayout   
  14.       android:id="@android:id/tabcontent"  
  15.       android:padding="5dp"  
  16.       ... >  
  17.       <LinearLayout  
  18.         android:id="@+id/content1"   
  19.         android:orientation="vertical"  
  20.         ... >  
  21.         <TextView   
  22.           ... />  
  23.       </LinearLayout>  
  24.       <LinearLayout  
  25.         android:id="@+id/content2"   
  26.             ・  
  27.             ・  
  28.             ・  
  29.       </LinearLayout>  
  30.     </FrameLayout>  
  31.   </LinearLayout>  
  32. </TabHost>  

また, Tab が切り替わったときのアイコンの切り替えもXMLで指定できます
以下のように作ってres/drawable に置きます
  1. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  2.   <!-- 選択されたときの画像 -->  
  3.   <item android:drawable="@android:drawable/star_big_on"  
  4.         android:state_selected="true" />  
  5.   <!-- 選択されていないときの画像 -->  
  6.   <item android:drawable="@android:drawable/star_big_off" />  
  7. </selector>  
んで, 本体
ここで Activity でなく TabActivity というのを継承させます

サンプルプログラム
  1. import android.app.TabActivity;  
  2. import android.graphics.Color;  
  3. import android.os.Bundle;  
  4. import android.view.Gravity;  
  5. import android.widget.TabHost;  
  6. import android.widget.TextView;  
  7. import android.widget.TabHost.OnTabChangeListener;  
  8.   
  9. public class TabTest extends TabActivity  
  10.                      implements OnTabChangeListener {  
  11.   private static final String TAG[] = {  
  12.     "tag1""tag2""tag3",  
  13.   };  
  14.   private static final String LABEL[] = {  
  15.     "Label1""Label2""Label3",  
  16.   };  
  17.   
  18.   TabHost tabHost;  
  19.   TabHost.TabSpec spec;  
  20.   TextView textView;  
  21.   
  22.   @Override  
  23.   public void onCreate(Bundle savedInstanceState) {  
  24.     super.onCreate(savedInstanceState);  
  25.   
  26.     setContentView(R.layout.tabtest);  
  27.     textView = new TextView(this);  
  28.       
  29.     // TabHost の取得  
  30.     tabHost = getTabHost();  
  31.     // Tab が切り替わったときに呼ばれるコールバックを登録  
  32.     tabHost.setOnTabChangedListener(this);  
  33.   
  34.     /********** Tab その1 **********/  
  35.     // TabSpec の作成  
  36.     spec = tabHost.newTabSpec(TAG[0]);  
  37.     // インジケーターの設定  
  38.     spec.setIndicator(LABEL[0]);  
  39.     // Tab のコンテンツの設定  
  40.     spec.setContent(R.id.content1);  
  41.     // TabHost に Tab を追加  
  42.     tabHost.addTab(spec);  
  43.   
  44.     /********** Tab その2 **********/  
  45.     spec = tabHost.newTabSpec(TAG[1])  
  46.     // アイコン付きインジケーターの設定  
  47.     .setIndicator(LABEL[1], getResources().getDrawable(R.drawable.icon))  
  48.     .setContent(R.id.content2);  
  49.     tabHost.addTab(spec);  
  50.   
  51.     textView.setText("Text");  
  52.     textView.setBackgroundColor(Color.DKGRAY);  
  53.     textView.setTextColor(Color.RED);  
  54.     textView.setGravity(Gravity.CENTER);  
  55.   
  56.     /********** Tab その3 **********/  
  57.     // 起動したいアクティビティのIntent作成  
  58.     Intent intent = new Intent().setClass(this, TabTest.class);  
  59.       
  60.     spec = tabHost.newTabSpec(TAG[2])  
  61.     // インジケーターに任意のビューを設定  
  62.     .setIndicator(textView)  
  63.     // Intent を設定  
  64.     .setContent(intent);  
  65.     tabHost.addTab(spec);  
  66.   
  67.     // 現在の Tab を設定  
  68.     tabHost.setCurrentTab(0);  
  69.   }  
  70.   // Tab が切り替わったときの動作 (引数はTag)  
  71.   public void onTabChanged(String tabId) {  
  72.     if (tabId == TAG[2])  
  73.       textView.setBackgroundColor(Color.LTGRAY);  
  74.     else  
  75.       textView.setBackgroundColor(Color.DKGRAY);  
  76.   }  
  77. }  
これでOK!

プログラムを実行すると...


こんな感じ!

今回は Intent で自分自身を読んでます
当たり前ですが何回も呼ぶとオーバーフローして落ちます

Tab で TabActivity を呼べば多段の Tab ができそう!

参考サイト
http://developer.android.com/intl/ja/resources/tutorials/views/hello-tabwidget.html
http://developer.android.com/intl/ja/reference/android/widget/TabHost.html
http://developer.android.com/intl/ja/reference/android/widget/TabWidget.html

HorizontalScrollView を使ってみた

横方向にスクロールさせるには
HorizontalScrollView を使います
java.lang.Object
  ↳ android.view.View
    ↳ android.view.ViewGroup
      ↳ android.widget.FrameLayout
        ↳ android.widget.HorizontalScrollView

その名の通り ScrollView の横バージョンです

HorizontalScrollView は ScrollView と同様一つしか子ビューを持てないので
LineaLayout などにまとめて入れてやります

というわけで, HorizontalScrollView をいじってみた

XMLリソース
  1. <HorizontalScrollView  
  2.   android:layout_width="fill_parent"  
  3.   android:layout_height="fill_parent"   
  4.   android:id="@+id/HorizontalScrollView">  
  5.   <LinearLayout   
  6.     android:id="@+id/LinearLayout"  
  7.     android:layout_width="wrap_content"   
  8.     android:layout_height="wrap_content">  
  9.     <TextView   
  10.       android:id="@+id/TextView"   
  11.       android:layout_width="wrap_content"  
  12.       android:layout_height="wrap_content"   
  13.       android:text="HorizontalScrollViewTest">  
  14.     </TextView>  
  15.         ・  
  16.         ・  
  17.         ・  
  18.   </LinearLayout>  
  19. </HorizontalScrollView>  
アクティビティー側で setContentView で設定

プログラムを実行すると...


こんな感じ!

一番下にスクロールバーが表示されています

参考サイト
http://developer.android.com/intl/ja/reference/android/widget/HorizontalScrollView.html

XML で Menu

Menu を XML で作成したいときは
/res に menu というフォルダを作成し、その中にxmlファイルを作成します


XML は以下のようにすればOKです
submenu を作りたいときは item の中に menu を入れてあげます。

XML リソース
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   <item   
  4.     android:id="@+id/menu_item01"   
  5.     android:title="Menu01"/>  
  6.   <group   
  7.     android:id="@+id/menu_group01">  
  8.     <item   
  9.       android:icon="@drawable/icon"   
  10.       android:id="@+id/menu_item02"   
  11.       android:title="Menu02"/>  
  12.   </group>  
  13.   <item   
  14.     android:id="@+id/menu_item03"   
  15.     android:title="Menu03">  
  16.     <menu>  
  17.       <item   
  18.         android:id="@+id/submenu_item01"   
  19.         android:title="Sub_Menu01"/>  
  20.       <item   
  21.         android:id="@+id/submenu_item02"   
  22.         android:title="Sub_Menu02/">  
  23.     </menu>  
  24.   </item>  
  25. </menu>  

そして,
MenuInflater というクラスを使ってXMLを取得します

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.Menu;  
  4. import android.view.MenuInflater;  
  5. import android.view.MenuItem;  
  6.   
  7. public class MenuXMLTest extends Activity {  
  8.   @Override  
  9.   public void onCreate(Bundle savedInstanceState) {  
  10.     super.onCreate(savedInstanceState);  
  11.     setContentView(R.layout.main);  
  12.   }  
  13.   
  14.   // Option Menu が最初に表示される時に1度だけ呼び出される  
  15.   @Override  
  16.   public boolean onCreateOptionsMenu(Menu menu) {  
  17.     super.onCreateOptionsMenu(menu);  
  18.     // MenuInflater の取得  
  19.     MenuInflater menuInflater = getMenuInflater();  
  20.     // MenuInflater から XML の取得    
  21.     menuInflater.inflate(R.menu.menutest, menu);  
  22.     return true;  
  23.   }  
  24. }  

あとは普通に onOptionsItemSelected(MenuItem item) などをオーバーライドすればアイテムが選択された際の処理などもできます

プログラムを実行すると...

こんな感じ!

参考サイト
http://developer.android.com/intl/ja/guide/topics/resources/available-resources.html#menus
http://developer.android.com/intl/ja/reference/android/view/MenuInflater.html

Eclipse で Xperia用アプリ開発準備

EclipseでXperia用のアプリを開発するためには、

まず、以下のソニーエリクソンのページ(http://developer.sonyericsson.com/wportal/devworld/downloads)
から, Android の部分にある [All Android Downloads] をクリックし
『Sony Ericsson Xperia X10 add-on for the Android SDK』というのをダウンロード

ダウンロードしたファイルを解凍して [Android SDK]を保存してあるディレクトリを開いて、その中にある [add-ons]ディレクトリの中に置く

そしたら、次は Eclipse を開く

普通のAVDの作成と同じで
[Window] -> [Android SDK and AVD Manager] 移動して [New] をクリック
すると [Target] に『X10 (Sony Erricsson ...』というのがあるのでそれを選択

Skin も『X10』を選択(たぶんデフォルトでなってる)



んで [Create AVD]

そして、プロジェクトの作成

Android 1.6 用のものがあるならわざわざ新しいのを作らなくても大丈夫

こちらも [Target Name] のところに『X10』が現れるので選択



これでOK!

そして、[Run Configurations] で Tagetをさっき作った『X10』のAVDを選んで実行すると...


こんな感じ!

やっぱ Xperia かっこいいですね!

XML で Animation

Animation を XML で作成したいときは

/res に anim というフォルダを作成し、その中にxmlファイルを作成します

アニメーションの要素としては以下のようなものがあります
  • set
  • alpha
  • scale
  • translate
  • rotate
  • interpolator

サイズを指定するものでViewサイズに対する比率を指定できるわけですが
以下の2種類で指定します
%   : View のサイズに対する比率
%p  : 親View のサイズに対する比率

というわけで、アニメーションを作ってみた

下からズームインしてくるアニメーション
zoom_in_from_bottom.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   <scale  
  4.     android:fromXScale="0.0"  
  5.     android:toXScale="1.0"  
  6.     android:fromYScale="0.0"  
  7.     android:toYScale="1.0"  
  8.     android:pivotX="50%"  
  9.     android:duration="1000">  
  10.   </scale>  
  11.   <translate  
  12.     android:fromYDelta="100%p"  
  13.     android:toYDelta="0.0"  
  14.     android:duration="1000">  
  15.   </translate>  
  16. </set>  

こんな感じで作成します

作成したら
AnimationUtilsクラスの
loadAnimation(context, id) メソッドを使ってアニメーションを取得

例えば
AnimationUtils.loadAnimation(context, R.anim.zoom_in_from_bottom);
というふうにすれば取得できます!


参考サイト
http://developer.android.com/intl/ja/guide/topics/resources/available-resources.html#animation
http://developer.android.com/intl/ja/reference/android/view/animation/AnimationUtils.html

XML でカスタムView

既存の View を拡張して新たに自分だけの View を作成したいときは

まず、res/values に attrs.xml を作成します

attrs.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.  <!-- name : custom view class name -->  
  4.   <declare-styleable name="CustomView">  
  5.     <attr name="text" format="string" />  
  6.     <attr name="color" format="color" />  
  7.     <attr name="size" format="dimension" />  
  8.   </declare-styleable>  
  9. </resources>  

declare-styleable の name属性は作成するカスタムビューのクラス名を指定する

次に、レイアウトを作成します

xmlns:app="http://schemas.android.com/apk/res/パッケージの名前"
というのを追加します
app は勝手につけた名前

attrs.xml で作成した属性を指定します

XMLリソース
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   xmlns:app="http://schemas.android.com/apk/res/androidtest.app"  
  5.   android:id="@+id/LinearLayout"  
  6.   android:layout_height="fill_parent"  
  7.   android:layout_width="fill_parent">   
  8.   <androidtest.app.CustomView  
  9.     android:id="@+id/CustomView"   
  10.     android:layout_height="fill_parent"  
  11.     android:layout_width="fill_parent"   
  12.     app:text="CustomViewTest"   
  13.     app:color="#FFFF0000"  
  14.     app:size="32sp" />  
  15. </LinearLayout>  

そしたら、カスタムビューの作成

サンプルプログラム(CustomView)
  1. import android.content.Context;  
  2. import android.content.res.TypedArray;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.Paint;  
  5. import android.util.AttributeSet;  
  6. import android.view.View;  
  7. import androidtest.app.R;  
  8.   
  9. public class CustomView extends View {  
  10.   String str;  
  11.   int color;  
  12.   int size;  
  13.   
  14.   public CustomView(Context context, AttributeSet attrs) {  
  15.     super(context, attrs);  
  16.   
  17.     // styleable から TypedArray の取得  
  18.     TypedArray tArray =   
  19.       context.obtainStyledAttributes(  
  20.         attrs,  
  21.         R.styleable.CustomView  
  22.       );  
  23.     
  24.     // TypedArray から String を取得  
  25.     str = tArray.getString(R.styleable.CustomView_text);  
  26.     // TypedArray から Color を取得  
  27.     color = tArray.getColor(R.styleable.CustomView_color, 0xFFFFFFFF);  
  28.     // TypedArray から Dimension を取得  
  29.     size = tArray.getDimensionPixelSize(R.styleable.CustomView_size, 12);  
  30.   }  
  31.   
  32.   @Override  
  33.   protected void onDraw(Canvas canvas) {  
  34.     super.onDraw(canvas);  
  35.     Paint paint = new Paint();  
  36.     paint.setColor(color);  
  37.     paint.setTextSize(size);  
  38.     canvas.drawText(str, 3264, paint);  
  39.   }  
  40. }  

Activity では setContentView で作成した layout を指定するだけ

サンプルプログラム(Activity)
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import androidtest.app.R;  
  4.   
  5. public class CustomViewTest extends Activity {  
  6.   @Override  
  7.   public void onCreate(Bundle savedInstanceState) {  
  8.     super.onCreate(savedInstanceState);  
  9.     setContentView(R.layout.customviewtest);  
  10.   }  
  11. }  

プログラムを実行すると...


こんな感じ!


参考サイト
http://developer.android.com/intl/ja/guide/topics/resources/available-resources.html#customresources

ToggleButton を使ってみた

ToggleButton は
java.lang.Object
  ↳ android.view.View
    ↳ android.widget.TextView
      ↳ android.widget.Button
        ↳ android.widget.CompoundButton
          ↳ android.widget.ToggleButton
を使います

というわけで、ToggleButton を使ってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.util.Log;  
  4. import android.widget.TextView;  
  5. import android.widget.ToggleButton;  
  6.   
  7. public class ToggleButtonTest extends Activity {  
  8.   ToggleButton toggleButton;  
  9.   @Override  
  10.   public void onCreate(Bundle savedInstanceState) {  
  11.     super.onCreate(savedInstanceState);  
  12.     setContentView(R.layout.togglebuttontest);  
  13.     
  14.     toggleButton = (ToggleButton) findViewById(R.id.ToggleButton01);  
  15.     
  16.     // ToggleButton が On のときのテキストを設定  
  17.     toggleButton.setTextOn("Toggle ON");  
  18.     // ToggleButton が Off のときのテキストを設定  
  19.     toggleButton.setTextOff("Toggle OFF");  
  20.     
  21.     // ToggleButton が On かどうかを設定  
  22.     toggleButton.setChecked(true);  
  23.     
  24.     // ToggleButton が On かどうかを取得  
  25.     boolean checked = toggleButton.isChecked();   
  26.   }  
  27. }  

XMLリソースで設定もできます

XMLリソース
  1. <ToggleButton  
  2.   android:id="@+id/ToggleButton"  
  3.   android:layout_height="wrap_content"  
  4.   android:layout_width="wrap_content"  
  5.   android:textOff="Toggle Off"  
  6.   android:textOn="Toggle On">  
  7. </ToggleButton>  

プログラムを実行すると...



こんな感じ!

参考サイト
http://developer.android.com/intl/ja/reference/android/widget/ToggleButton.html

いろいろな AlertDialog

AlertDialog.Builderクラスを使っていろいろな AlertDialog を作ってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.app.AlertDialog;  
  3. import android.content.DialogInterface;  
  4. import android.content.DialogInterface.OnClickListener;  
  5. import android.content.DialogInterface.OnMultiChoiceClickListener;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10.   
  11. public class AlertDialogTest2 extends Activity implements View.OnClickListener {  
  12.   AlertDialog.Builder alertDialogBuilder;  
  13.   Button button[];  
  14.   
  15.   @Override  
  16.   public void onCreate(Bundle savedInstanceState) {  
  17.     super.onCreate(savedInstanceState);  
  18.     setContentView(R.layout.alertdialogtest2);  
  19.   
  20.     button = new Button[3];  
  21.     for (int i = 0; i < 3; i++) { d.Button01 + i);  
  22.       button[i].setOnClickListener(this);  
  23.     }  
  24.   }  
  25.   
  26.   public void onClick(View v) {  
  27.     if (v == button[0]) {  
  28.       setEditAlertDialog();  
  29.     } else if (v == button[1]) {  
  30.       setSingleChoiceDialog();  
  31.     } else if (v == button[2]) {  
  32.        setMultiChoiceDialog();  
  33.     }  
  34.   }  
  35.   
  36.   /* AlertDialog(EditText) */  
  37.   public void setEditAlertDialog() {  
  38.     EditText editText = new EditText(this);  
  39.     editText.setText("Please fill your name!");  
  40.   
  41.     alertDialogBuilder = new AlertDialog.Builder(this);  
  42.     alertDialogBuilder.setTitle("EditTextDialog");  
  43.   
  44.     // AlertDialog に View を設定  
  45.     alertDialogBuilder.setView(editText);  
  46.   
  47.     // Positive Button を設定  
  48.     alertDialogBuilder.setPositiveButton(  
  49.       "Positive",   
  50.       new DialogInterface.OnClickListener() {  
  51.         public void onClick(DialogInterface dialog, int which) {  
  52.           // Positive Button がクリックされた時の動作  
  53.         }  
  54.       }  
  55.     );  
  56.     alertDialogBuilder.show();  
  57.   }  
  58.    
  59.   /* SingleChoiceDialog */  
  60.   public void setSingleChoiceDialog() {  
  61.     // 表示させるアイテム名  
  62.     final String[] str_items = {  
  63.       "One",  
  64.       "Two",  
  65.       "Three"  
  66.     };  
  67.   
  68.     alertDialogBuilder = new AlertDialog.Builder(this);  
  69.     alertDialogBuilder.setTitle("SingleChoiceDialog");  
  70.   
  71.     // 初めに選ばれているアイテム  
  72.     final int default_item = 0;  
  73.   
  74.     // SingleChoiceDialog の作成  
  75.     alertDialogBuilder.setSingleChoiceItems(  
  76.       str_items,   
  77.       default_item,  
  78.       new OnClickListener() {  
  79.         public void onClick(DialogInterface dialog, int which) {  
  80.           // アイテムが選ばれたときの動作  
  81.         }  
  82.       }  
  83.     );  
  84.     // Positive Button を設定  
  85.     alertDialogBuilder.setPositiveButton(  
  86.       "Positive",   
  87.       new DialogInterface.OnClickListener() {  
  88.         public void onClick(DialogInterface dialog, int which) {  
  89.           // Positive Button がクリックされた時の動作  
  90.         }  
  91.       }  
  92.     );  
  93.     alertDialogBuilder.show();  
  94.   }  
  95.   
  96.   /* MultiChoiceDialog */  
  97.   public void setMultiChoiceDialog() {  
  98.     // 表示させるアイテム名  
  99.     final String[] str_items = {  
  100.       "Red",  
  101.       "Green",  
  102.       "Blue"  
  103.     };  
  104.     // 各アイテムがチェックされている状態かどうか  
  105.     final boolean[] flag_items = {  
  106.       false,  
  107.       true,  
  108.       false  
  109.     };  
  110.   
  111.     alertDialogBuilder = new AlertDialog.Builder(this);  
  112.     alertDialogBuilder.setTitle("MultiChoiceDialog");  
  113.   
  114.     // MultiChoiceDialog の作成  
  115.     alertDialogBuilder.setMultiChoiceItems(  
  116.       str_items,   
  117.       flag_items,  
  118.       new OnMultiChoiceClickListener() {  
  119.         public void onClick(  
  120.             DialogInterface dialog,   
  121.             int which,   
  122.             boolean isChecked) {  
  123.           // アイテムが選ばれたときの動作  
  124.         }  
  125.       }  
  126.     );  
  127.     // Positive Button を設定  
  128.     alertDialogBuilder.setPositiveButton(  
  129.       "Positive",   
  130.       new DialogInterface.OnClickListener() {  
  131.         public void onClick(DialogInterface dialog, int which) {  
  132.           // Positive Button がクリックされた時の動作  
  133.         }  
  134.       }  
  135.     );  
  136.     alertDialogBuilder.show();  
  137.   }  
  138. }  
プログラムを実行すると...

AlertDialog(EditText)

SingleChoiceDialog

MultiChoiceDialog

こんな感じ!


参考サイト
http://developer.android.com/intl/ja/reference/android/app/AlertDialog.html
http://developer.android.com/intl/ja/reference/android/app/AlertDialog.Builder.html

Spannable で文字のマークアップ

Spannable はテキストをマークアップするためのインターフェースです

CharacterStyleなどのクラスを使って文字列の一部を
下線を引いたり、下付き文字にしたり、
上付き文字にしたり、URLを付けたり...
と様々なことができます

CharacterStyle のサブクラスには
  • UnderlineSpan
  • SubscriptSpan
  • SuperscriptSpan
  • URLSpan
  • ScaleXSpan
  • RelativeSizeSpan
  • etc...
といろいろあります

というわけで, Spannable でテキストをいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.text.Spannable;  
  4. import android.text.Spannable.Factory;  
  5. import android.text.style.RelativeSizeSpan;  
  6. import android.text.style.ScaleXSpan;  
  7. import android.text.style.SubscriptSpan;  
  8. import android.text.style.SuperscriptSpan;  
  9. import android.text.style.URLSpan;  
  10. import android.text.style.UnderlineSpan;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.TextView;  
  14.   
  15. public class SpannableTest extends Activity {  
  16.   Spannable spannable;  
  17.   
  18.   UnderlineSpan underline;  
  19.   SubscriptSpan subscript;  
  20.   SuperscriptSpan superscript;  
  21.   URLSpan url;  
  22.   ScaleXSpan scaleX;  
  23.   RelativeSizeSpan relative;  
  24.   
  25.   TextView textView[];  
  26.   
  27.   @Override  
  28.   public void onCreate(Bundle savedInstanceState) {  
  29.     super.onCreate(savedInstanceState);  
  30.     setContentView(R.layout.spannabletest);  
  31.   
  32.     textView = new TextView[4];  
  33.     for (int i = 0; i < 4; i++) {  
  34.       textView[i] = (TextView) findViewById(R.id.TextView01 + i);  
  35.     }  
  36.   
  37.     // UnderlineSpan  
  38.     underline = new UnderlineSpan();  
  39.     // SubscriptSpan  
  40.     subscript = new SubscriptSpan();  
  41.     // SuperscriptSpan  
  42.     superscript = new SuperscriptSpan();  
  43.     // URLSpan  
  44.     url = new URLSpan("http://weide-dev.blogspot.com/");  
  45.     // ScaleXSpan  
  46.     scaleX = new ScaleXSpan(0.5f);  
  47.     // RelativeSizeSpan  
  48.     relative = new RelativeSizeSpan(0.5f);  
  49.   
  50.     // Factory の取得  
  51.     Factory factory = Spannable.Factory.getInstance();  
  52.   
  53.     /* アンダーラインが引かれた文字列 */  
  54.     // Spannable の取得  
  55.     spannable = factory.newSpannable(textView[0].getText());  
  56.     // 0からテキストの長さ分まで下線を引く  
  57.     spannable.setSpan(  
  58.         underline,  
  59.         0,  
  60.         textView[0].getText().length(),  
  61.         spannable.getSpanFlags(underline)  
  62.     );  
  63.     // TextView にテキストを設定  
  64.     textView[0].setText(spannable, TextView.BufferType.SPANNABLE);  
  65.   
  66.     /* 後ろ4文字が下付きの文字列 */  
  67.     spannable = factory.newSpannable(textView[1].getText());  
  68.     // 後ろ4文字を下付き文字にする  
  69.     spannable.setSpan(  
  70.         subscript,  
  71.         textView[1].getText().length() - 4,  
  72.         textView[1].getText().length(),  
  73.         spannable.getSpanFlags(subscript)  
  74.     );  
  75.     // 後ろ4文字のXのスケールを0.5倍する  
  76.     spannable.setSpan(  
  77.         scaleX,  
  78.         textView[1].getText().length() - 4,  
  79.         textView[1].getText().length(),  
  80.         spannable.getSpanFlags(scaleX)  
  81.     );  
  82.     textView[1].setText(spannable, TextView.BufferType.SPANNABLE);  
  83.   
  84.     /* 後ろ4文字が上付きの文字列 */  
  85.     spannable = factory.newSpannable(textView[2].getText());  
  86.     // 後ろ4文字を上付き文字にする  
  87.     spannable.setSpan(  
  88.         superscript,  
  89.         textView[2].getText().length() - 4,  
  90.         textView[2].getText().length(),  
  91.         spannable.getSpanFlags(superscript)  
  92.     );  
  93.     // 後ろ4文字のサイズを0.5倍する  
  94.     spannable.setSpan(  
  95.         relative,  
  96.         textView[2].getText().length() - 4,  
  97.         textView[2].getText().length(),  
  98.         spannable.getSpanFlags(relative)  
  99.     );  
  100.     textView[2].setText(spannable, TextView.BufferType.SPANNABLE);  
  101.   
  102.     /* URL文字列 */  
  103.     spannable = factory.newSpannable(textView[3].getText());  
  104.     // 0からテキストの長さ分までURLタイプにする  
  105.     spannable.setSpan(  
  106.         url,  
  107.         0,  
  108.         textView[3].getText().length(),  
  109.         spannable.getSpanFlags(url)  
  110.     );  
  111.     textView[3].setText(spannable, TextView.BufferType.SPANNABLE);  
  112.     textView[3].setOnClickListener(new OnClickListener() {  
  113.       public void onClick(View v) {  
  114.         // URLを開く  
  115.         url.onClick(textView[3]);  
  116.       }  
  117.     });  
  118.   }  
  119. }  
プログラムを実行すると...


こんな感じ!


参考サイト
http://developer.android.com/intl/ja/reference/android/text/Spannable.html
http://developer.android.com/intl/ja/reference/android/text/style/CharacterStyle.html

Menu を使ってみた

Menu は
android.view.Menu
を使用します

さらに、Activity クラスの
  • public boolean onCreateOptionsMenu(Menu menu)
  • public boolean onPrepareOptionsMenu(Menu menu)
  • public boolean onOptionsItemSelected(MenuItem item)
  • public boolean onMenuOpened(int featureId, Menu menu)
などのメソッドを Override することで使用できます

というわけで、Menu をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.Menu;  
  4. import android.view.MenuItem;  
  5. import android.view.SubMenu;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9.   
  10. public class MenuTest extends Activity {  
  11.   private static final int MENU_ID1 = Menu.FIRST;  
  12.   private static final int MENU_ID2 = Menu.FIRST + 1;  
  13.   private static final int MENU_ID3 = Menu.FIRST + 2;  
  14.   private static final int SUBMENU_ID1 = Menu.FIRST + 21;  
  15.   private static final int SUBMENU_ID2 = Menu.FIRST + 22;  
  16.   
  17.   @Override  
  18.   public void onCreate(Bundle savedInstanceState) {  
  19.     super.onCreate(savedInstanceState);  
  20.     setContentView(R.layout.main);   
  21.     
  22.     ((Button) findViewById(R.id.Button)).setOnClickListener(  
  23.       new OnClickListener() {  
  24.         public void onClick(View v) {  
  25.           // Menu の表示  
  26.           openOptionsMenu();  
  27.         }  
  28.       }  
  29.     );  
  30.   }  
  31.   
  32.   // Option Menu が最初に表示される時に1度だけ呼び出される  
  33.   @Override  
  34.   public boolean onCreateOptionsMenu(Menu menu) {  
  35.     boolean ret = super.onCreateOptionsMenu(menu);  
  36.   
  37.     // Menu にアイテムを追加  
  38.     menu.add(Menu.NONE, MENU_ID1, Menu.NONE, "Menu1");  
  39.     // Menu に Icon 付きアイテムを追加  
  40.     menu.add(Menu.NONE, MENU_ID2, Menu.NONE, "Menu2").setIcon(R.drawable.icon);  
  41.   
  42.     // SubMenu を追加  
  43.     SubMenu sMenu = menu.addSubMenu(Menu.NONE, MENU_ID3, 3"Menu3");  
  44.     sMenu.add(Menu.NONE, SUBMENU_ID1, Menu.NONE, "SubMenu1");  
  45.     sMenu.add(Menu.NONE, SUBMENU_ID2, Menu.NONE, "SubMenu2");  
  46.   
  47.     // Menu にショートカットキーを設定  
  48.     menu.findItem(MENU_ID1).setAlphabeticShortcut('a');  
  49.     menu.findItem(MENU_ID2).setAlphabeticShortcut('1');  
  50.     menu.findItem(MENU_ID3).setAlphabeticShortcut('s');  
  51.   
  52.     return ret;  
  53.   }  
  54.   
  55.   // Option Menu が表示される時の動作  
  56.   @Override  
  57.   public boolean onPrepareOptionsMenu(Menu menu) {  
  58.     return super.onPrepareOptionsMenu(menu);  
  59.   }  
  60.   
  61.   // Option Menu のアイテムが選択された時の動作  
  62.   @Override  
  63.   public boolean onOptionsItemSelected(MenuItem item) {  
  64.     boolean ret = super.onOptionsItemSelected(item);  
  65.     // 選ばれたアイテムの ID を取得  
  66.     switch(item.getItemId()) {  
  67.     case MENU_ID1:   // Menu1  
  68.       return true;  
  69.     case MENU_ID2:   // Menu2  
  70.       return true;  
  71.     case SUBMENU_ID1:   // Submenu1  
  72.       return true;  
  73.     default:  
  74.     }  
  75.     return ret;  
  76.   }  
  77.   
  78.   // Option Menu が開かれた時の動作  
  79.   @Override  
  80.   public boolean onMenuOpened(int featureId, Menu menu) {  
  81.     return super.onMenuOpened(featureId, menu);  
  82.   }  
  83. }  

プログラムを実行すると...


SubMenu は...

こんな感じ!

参考サイト
http://developer.android.com/intl/ja/reference/android/view/Menu.html
http://developer.android.com/intl/ja/reference/android/app/Activity.html

EditText を使ってみた

EditText は
java.lang.Object
   ↳ android.view.View
     ↳ android.widget.TextView
       ↳ android.widget.EditText
を使います

というわけで, EditText を使ってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.text.InputType;  
  4. import android.widget.EditText;  
  5.   
  6. public class EditTextTest extends Activity {  
  7.   EditText editText;  
  8.    
  9.   @Override  
  10.   public void onCreate(Bundle savedInstanceState) {  
  11.     super.onCreate(savedInstanceState);  
  12.     setContentView(R.layout.edittexttest);  
  13.     
  14.     editText = (EditText) findViewById(R.id.EditText01);  
  15.     
  16.     // EditText にテキストを設定  
  17.     editText.setText("EditTextTest");  
  18.     
  19.     // EditText のインプットタイプを設定  
  20.     editText.setInputType(InputType.TYPE_CLASS_TEXT);  
  21.     
  22.     // EditText の最大行の設定  
  23.     editText.setMaxLines(1);  
  24.     
  25.     // EditText が空のときに表示させるヒントを設定  
  26.     editText.setHint("This is Hint");  
  27.     
  28.     // EditText のカーソル位置を設定  
  29.     editText.setSelection(3);  
  30.     // EditText のテキストを全選択  
  31.     // editText.selectAll();  
  32.     
  33.     // EditText のテキストを取得  
  34.     String str = editText.getText().toString();  
  35.   }  
  36. }  

InputType には
  • 数字入力
  • アドレス入力
  • パスワード入力
  • オートコンプリート
  • 入力不可
  • etc...
といろいろあります
詳しくは InputTypeクラス を参照してください

XMLリソースで指定することもできます

XMLリソース
  1. <EditText   
  2.   android:hint="This is Hint"  
  3.   android:id="@+id/EditText"   
  4.   android:inputType="text"   
  5.   android:layout_height="wrap_content"   
  6.   android:layout_width="wrap_content"    
  7.   android:text="EditTextTest">  
  8. </EditText>  

XMLリソースで
InputTypeを指定するときは android:InputType を使います

プログラムを実行すると...



こんな感じ!

また、ヒントは


こんな感じで表示されます!

参考サイト
http://developer.android.com/intl/ja/reference/android/widget/EditText.html

ScrollView を使ってみた

ScrollView を使うには
java.lang.Object
  ↳ android.view.View
    ↳ android.view.ViewGroup
      ↳ android.widget.FrameLayout
        ↳ android.widget.ScrollView
を使います

というわけで、ScrollView をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.widget.Button;  
  4. import android.widget.LinearLayout;  
  5. import android.widget.ScrollView;  
  6.   
  7. public class ScrollViewTest extends Activity {  
  8.   ScrollView scrollView;  
  9.   LinearLayout linearLayout;  
  10.   
  11.   @Override  
  12.   public void onCreate(Bundle savedInstanceState) {  
  13.     super.onCreate(savedInstanceState);  
  14.     scrollView = new ScrollView(this);  
  15.     linearLayout = new LinearLayout(this);  
  16.     linearLayout.setOrientation(LinearLayout.VERTICAL);  
  17.     
  18.     for (int i = 0; i < 12; i++) {  
  19.       Button button = new Button(this);  
  20.       button.setText("Button" + (i+1));  
  21.       linearLayout.addView(button);  
  22.     }  
  23.   
  24.     // ScrollView に View を追加  
  25.     scrollView.addView(linearLayout);  
  26.   
  27.     setContentView(scrollView);  
  28.   }  
  29. }  

ScrollView は1つしか View を設定できないので LinearLayout などにまとめる必要があります XMLでまとめて設定することもできます XMLリソース
  1. <ScrollView  
  2.   android:id="@+id/ScrollView"  
  3.   android:layout_height="fill_parent"  
  4.   android:layout_width="fill_parent">  
  5.   <LinearLayout   
  6.     android:id="@+id/LinearLayout"  
  7.     android:orientation="vertical"  
  8.     android:layout_height="fill_parent"  
  9.     android:layout_width="fill_parent">  
  10.     <!-- 追加したいView -->  
  11.     <Button .../>  
  12.         ・  
  13.         ・  
  14.         ・  
  15.   </LinearLayout>  
  16. </ScrollView>  

プログラムを実行すると...



こんな感じ!

右にスクロールバーが表示されて、上下に続きがあると少し暗くなっています

参考サイト
http://developer.android.com/intl/ja/reference/android/widget/ScrollView.html

SurfaceView を使ってみた

SurfaceView は
java.lang.Object
  ↳ android.view.View
    ↳ android.view.SurfaceView
を使用します

また、Surfaceの変更などを取得するために
SurfaceHolder.Callback
を使用します
このインターフェースは
  • public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
  • public void surfaceCreated(SurfaceHolder holder)
  • public void surfaceDestroyed(SurfaceHolder holder)
の3つのメソッドを実装する必要があります

というわけで、SurfaceView をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.BitmapFactory;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.drawable.BitmapDrawable;  
  8. import android.os.Bundle;  
  9. import android.view.SurfaceHolder;  
  10. import android.view.SurfaceView;  
  11.   
  12. public class SurfaceViewTest extends Activity {  
  13.   @Override  
  14.   public void onCreate(Bundle savedInstanceState) {  
  15.     super.onCreate(savedInstanceState);  
  16.   
  17.     setContentView(new SurfaceTestView(this));  
  18.   }  
  19.    
  20.   class SurfaceTestView extends SurfaceView   
  21.         implements SurfaceHolder.Callback, Runnable {  
  22.     private Thread thread;  
  23.     private BitmapDrawable bitmapDrawable;  
  24.     
  25.     public SurfaceTestView(Context context) {  
  26.       super(context);  
  27.      
  28.       // SurfaceHolder の取得  
  29.       SurfaceHolder holder = getHolder();  
  30.      
  31.       // SurfaceHolder に コールバックを設定  
  32.       holder.addCallback(this);  
  33.       holder.setFixedSize(getWidth(), getHeight());  
  34.      
  35.       // フォーカスをあてる  
  36.       setFocusable(true);  
  37.      
  38.       bitmapDrawable = new BitmapDrawable(  
  39.         context.getResources(),  
  40.         BitmapFactory.decodeResource(  
  41.           context.getResources(),   
  42.           R.drawable.icon)  
  43.       );  
  44.     }  
  45.   
  46.     // Surface が変更されたときの動作  
  47.     public void surfaceChanged(SurfaceHolder holder,  
  48.         int format, int width, int height) {  
  49.     }  
  50.   
  51.     // Surface が作成されたときの動作  
  52.     public void surfaceCreated(SurfaceHolder holder) {  
  53.       thread = new Thread(this);  
  54.       thread.start();  
  55.     }  
  56.   
  57.     // Surface が削除されたときの動作  
  58.     public void surfaceDestroyed(SurfaceHolder holder) {  
  59.       thread = null;  
  60.     }  
  61.   
  62.     public void run() {  
  63.       while (thread != null) {  
  64.         // 描画の開始  
  65.         Canvas canvas = getHolder().lockCanvas();  
  66.       
  67.         draw(canvas);  
  68.       
  69.         // 描画の終了  
  70.         getHolder().unlockCanvasAndPost(canvas);  
  71.       }  
  72.     }  
  73.   
  74.     @Override  
  75.     public void draw(Canvas canvas) {  
  76.       // 現在の状態を保存  
  77.       canvas.save();  
  78.      
  79.       Paint paint = new Paint();  
  80.       paint.setColor(Color.RED);  
  81.       paint.setTextSize(32);  
  82.      
  83.       bitmapDrawable.setBounds(009696);  
  84.       bitmapDrawable.draw(canvas);  
  85.       canvas.drawText("SurfaceViewTest"0128, paint);  
  86.   
  87.       paint.setAntiAlias(true);  
  88.       bitmapDrawable.setBounds(016096256);  
  89.       bitmapDrawable.draw(canvas);  
  90.       canvas.drawText("SurfaceViewTest2"0288, paint);  
  91.   
  92.       // 現在の状態の変更  
  93.       canvas.restore();  
  94.     }  
  95.   }  
  96. }  

プログラムを実行すると...


こんな感じ!(上:アンチエイリアスなし, 下:あり)

アンチエイリアスは時間がかかるが場合によってはかけた方が良さそう

参考サイト
http://developer.android.com/intl/ja/reference/android/view/SurfaceView.html
http://developer.android.com/intl/ja/reference/android/view/SurfaceHolder.Callback.html

Drawable を使ってみた

Drawableクラスは abstract class で
サブクラスには
  • BitmapDrawable
  • ColorDrawable
  • RotateDrawable
  • ScaleDrawable
  • etc...
といろいろあります

今回は BitmapDrawable クラスを使ってみた

BitmapDrawable は
java.lang.Object
  ↳ android.graphics.drawable.Drawable
    ↳ android.graphics.drawable.BitmapDrawable
を使用します

というわけで BitmapDrawable をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.BitmapFactory;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.drawable.BitmapDrawable;  
  6. import android.os.Bundle;  
  7. import android.view.Gravity;  
  8. import android.view.View;  
  9.   
  10. public class DrawableTest extends Activity {  
  11.   BitmapDrawable bitmapDrawable;  
  12.   @Override  
  13.   public void onCreate(Bundle savedInstanceState) {  
  14.     super.onCreate(savedInstanceState);  
  15.     setContentView(new DrawableTestView(this));  
  16.   }  
  17.   
  18.   class DrawableTestView extends View {  
  19.     public DrawableTestView(Context context) {  
  20.       super(context);  
  21.       // BitmapDrawable を作成  
  22.       bitmapDrawable = (BitmapDrawable) context.getResources().getDrawable(R.drawable.icon);  
  23.     }  
  24.     @Override  
  25.     public void onDraw(Canvas canvas) {  
  26.       // BitmapDrawable の範囲を設定  
  27.       bitmapDrawable.setBounds(004848);  
  28.       // BitmapDrawable の描画  
  29.       bitmapDrawable.draw(canvas);  
  30.      
  31.       // BitmapDrawable のアルファ値を設定  
  32.       bitmapDrawable.setAlpha(128);  
  33.       bitmapDrawable.setBounds(4809648);  
  34.       bitmapDrawable.draw(canvas);  
  35.       bitmapDrawable.setAlpha(255);     
  36.   
  37.       // BitmapDrawable にアンチエイリアスを設定  
  38.       bitmapDrawable.setAntiAlias(true);  
  39.       bitmapDrawable.setBounds(048240288);  
  40.       bitmapDrawable.draw(canvas);  
  41.      
  42.       bitmapDrawable.setAntiAlias(false);  
  43.       bitmapDrawable.setBounds(24048480288);  
  44.       bitmapDrawable.draw(canvas);  
  45.      
  46.       bitmapDrawable.setBounds(00, getWidth(), getHeight());  
  47.       // BitmapDrawable にグラビティを設定  
  48.       bitmapDrawable.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);  
  49.       bitmapDrawable.draw(canvas);  
  50.     }  
  51.   }  
  52. }  

プログラムを実行してみると...


こんな感じ!(左:アンチエイリアスあり, 右:なし)

この画像だとアンチエイリアスの違いはよく分からないですね
状況によって使い分けるのが良さそう

参考サイト
http://developer.android.com/intl/ja/reference/android/graphics/drawable/Drawable.html
http://developer.android.com/intl/ja/reference/android/graphics/drawable/BitmapDrawable.html