2013年10月9日水曜日

[Android SDK] ダイアログを自由にカスタマイズする

メモガキの日時設定画面はダイアログをカスタマイズして作成している。Dialogを継承して、onCreateをオーバライドしてsetContentViewを自由なレイアウトを指定します。タイトルバーや境界線を無くし、全画面表示にしています。


public class TestDialog extends Dialog {
 /* 〜〜〜 一部省略 〜〜〜*/
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

                // タイトルバーを非表示にする
  requestWindowFeature(Window.FEATURE_NO_TITLE); 

  setContentView(R.layout.dlg_deadline);

                // ダイアログの背景(境界線)を無くす(透明)
  getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

                // ダイアログの大きさ最大にする(任意のサイズも指定可能)
                getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

 }
 /* 〜〜〜 一部省略 〜〜〜*/
}

2013年10月7日月曜日

[Android SDK] 動的に設定画面(Preference)を作成する

ほとんどのAndroidアプリには設定画面が用意されている。

(例:メモガキの設定画面)

こういった設定画面は、.xmlファイルに記述するケースが多いが動的にプログラミングで作成することもできる。
例えば、デバッグ時、AndroidOSのバージョンに応じて表示する設定項目の場合に使える。

1から作成する場合

まずは設定項目を作成するために、PreferenceManagerを取得する。
// For Activity
PreferenceManager PreferenceActivity::getPreferenceManager()

// For Fragment
PreferenceManager PreferenceFragment::getPreferenceManager()
PreferenceManagerで設定項目のルート項目を作成する。
PreferenceScreen PreferenceManager::createPreferenceScreen(Context context);
以降は、設定項目を作成して追加して行く。
// Context context;
PreferenceScreen root = getPreferenceManager().createPreferenceScreen(context);
PreferenceCategory category = new PreferenceCategory(context);
category.setTitle("Category");
root.addPreference(category);

PreferenceScreen item = getPreferenceManager().createPreferenceScreen(context);
item.setTitle("Item");
category.add(item);
最後に、設定画面に設定する。
// For Activity
// void PreferenceScreen::setPreferenceScreen(PreferenceScreen preferenceScreen)
// 
// For Fragment
// void PreferenceFragment::setPreferenceScreen(PreferenceScreen preferenceScreen)
//
setPreferenceScreen(root);

既存の設定画面に追加する場合

既存の設定項目のルート項目を取得する。
// For Activity
PreferenceScreen PreferenceActivity::getPreferenceScreen()

// For Fragment
PreferenceScreen PreferenceFragment::getPreferenceScreen()
取得したルート項目にさきほどと同様に追加していく。


参考までに

メモガキではアプリの更新履歴を、ファイル(res/raw)から更新履歴を情報を読み込み、動的に設定画面をベースに表示している。

public class RpNoteVersionFragment extends PreferenceListFragment {
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setPreferenceScreen(createReleaseNote());
 }
 public PreferenceScreen createReleaseNote() {
  final Context c = getActivity();
  PreferenceScreen root = getPreferenceManager().createPreferenceScreen(c);
  
  BufferedReader reader = null;
  InputStream stream = null;
  String buffer = null;
  PreferenceCategory category = null;
  try {
   stream = c.getResources().openRawResource(R.raw.release_note);
   reader = new BufferedReader(new InputStreamReader(stream));
   while ((buffer = reader.readLine()) != null) {
    if (category == null) {
     category = new PreferenceCategory(c);
     category.setTitle(buffer);
     root.addPreference(category);
    } else if (buffer.equals("")) {
     category = null;
    } else {
     Preference item = new Preference(c);
     item.setTitle(buffer);
     item.setLayoutResource(R.layout.pref_single_item);
     category.addPreference(item);
    }
   }
  } catch (IOException ioe) {
   
  } finally {
   if (reader != null) {
    try {
     reader.close();
    } catch (IOException ioe) {}
   }
   if (stream != null) {
    try {
     stream.close();
    } catch (IOException ioe2) {}
   }
  }
  return root;
 }
}

// R.raw.release_noteの中身
Ver.0.3.0
Append text to an existing note with share.
Add icons of category.

Ver.0.2.0
Change an order of category display.

Ver.0.1.1
Display a widget, today's number of schedules. 

Ver.0.0.0
First version 

2013年1月6日日曜日

[無印良品] 旅行に便利な消臭効果のある袋

久々に無印良品に行ってきました。
いつ来ても、雰囲気が和みます。お店のレイアウトに、BGMが好きです。

正月バゲーンだから、無印良品も安売り品がないか探していると

消臭巾着というものがありました(写真左のやつ)。
説明書きに、「使用後の衣類等の不快臭を減少させる消臭生地を使用。洗濯後も効果が持続します。」って書かれていました。

これは、旅行、運動に便利ですね。
30%OFFってこともあって、即買っちゃいました(定価1,100円)。


これまるまるしてるけど、収納されている袋を出すと円柱っぽい袋になります(直径18×34cm)。



ついでに、USB端子つきのタップも購入してきました。
USB端子は合計出力1000mAなのでスマホを充電するのに使えそうです。

USBアダプタでこれでごちゃごちゃしてたタップを整理できそうです。

2012年12月9日日曜日

[Wii U] Wii Uが届いたので開封してみた

12月8日(土) ちょうど休日に、任天堂から新しいゲーム機、Wii Uが発売されました。
とりあえず、開封してみました。

Wii U専用段ボールでとどきました。


白色がよかったので、通常版を買いました。

中身は、タンスみたいに2段になっています。


通常版でも、必要最低限ついてるんですね。HDMIケーブルまで。

付属品、並べてみた。
なんで、電源ケーブル2本あるのかと思ったら、1本はGame Pad用だったんですね(笑


さっそく、本体の更新をはじめます。購入元より案内がきてました。
>> この度、お買い上げいただきました、
>> 『Wii U本体』でございますが、
>> 任天堂より、本体の更新に関する重要なお知らせがございました。


うちのインターネットは、テザリングなので3時間くらいかかるのかなぁー
 気長に待ちます

2012年11月13日火曜日

[Android SDK] 設定画面のレイアウトをカスタマイズする

Androidアプリには設定画面がつきものです。標準で設定画面を作るためのクラス(PreferenceActivity)が用意されており、XMLで設定項目を記述するだけで簡単に作れる。

ただ、設定画面のレイアウトをカスタマイズするには特殊なやり方が必要になります。

PreferenceActivityを継承してActivityを作るのは同じですが、setContentViewメソッドでレイアウトファイル(XML)を指定するところがポイント。
public class RpNotePreferenceActivity extends PreferenceActivity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act_preference);
    addPreferencesFromResource(R.xml.preference);
  }
}

単純にレイアウトファイル(XML)を作成するだけではダメで、設定画面に置き換えるListViewを「android:id="@android:id/list"」属性付きで追加する必要があります。
簡単な例ですと次のようにすると、
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:context=".activity.RpNotePreferenceActivity" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1" />
 <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal">
  <Button
      android:id="@+id/button1"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="Button" />
    </LinearLayout>
</LinearLayout>

こんな感じで、画面下側にボタンがあるような設定画面が作れます(実際には、リストが設定項目に置き換わります)。

試してみてください。