tag:blogger.com,1999:blog-48457297889568072192024-02-08T06:03:04.543+09:00トライウェアのスタッフブログトライウェアスタッフhttp://www.blogger.com/profile/01779644185222037078noreply@blogger.comBlogger66125tag:blogger.com,1999:blog-4845729788956807219.post-27781439867591036752012-11-25T09:30:00.000+09:002012-11-25T09:30:02.824+09:00Androidアプリ プロジェクトの作成(Eclipse 4.2 & SDK r20)<a href="http://triware.blogspot.jp/2012/11/android-sdk.html" target="_blank">前回</a>、SDKのインストールを紹介しましたので、今回はEclipse環境(<a href="http://mergedoc.sourceforge.jp/index.html#/pleiades_distros4.2.html" target="_blank">Eclipse 4.2 Juno</a>)でのプロジェクト作成方法について紹介します。なお、Eclipseのインストールについては<a href="http://triware.blogspot.jp/2011/08/android.html" target="_blank">以前の記事</a>をご覧下さい。<br />
<br />
<div align="center"><table border="1" cellspacing="0" cellpadding="0"><tbody>
<tr align="center"><td colspan="2">今回使用した環境</td></tr>
<tr><td>Eclipse</td><td>4.2 Juno (Pleiades All in One)</td></tr>
<tr><td>Andriod SDK</td><td>20.0.3</td></tr>
<tr><td>ADT</td><td>20.0.3</td></tr>
</tbody></table></div><a name='more'></a><br />
<ol><li>プロジェクトの作成<br />
Eclipseを起動し、新規のプロジェクトを作成します。<br />
メニューの「ファイル」→「新規」→「プロジェクト」を選択します。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY816zy6FGU0NPVrZyjNatR_PYs5Oy5HubGU5Ev-ShFEpwyhgSiMIN4QGh2sHlZ6XXUFoMXwKmrueWYXcttiPNgoJHmKYz8FxNUtLwjwXxaSmNiBc_fe3EBFU1HoieTYGqGlM8DqD4b49h/s1600/01%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588%25E3%2583%25A1%25E3%2583%258B%25E3%2583%25A5%25E3%2583%25BC%25EF%25BC%2589.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="256" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY816zy6FGU0NPVrZyjNatR_PYs5Oy5HubGU5Ev-ShFEpwyhgSiMIN4QGh2sHlZ6XXUFoMXwKmrueWYXcttiPNgoJHmKYz8FxNUtLwjwXxaSmNiBc_fe3EBFU1HoieTYGqGlM8DqD4b49h/s320/01%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588%25E3%2583%25A1%25E3%2583%258B%25E3%2583%25A5%25E3%2583%25BC%25EF%25BC%2589.png" /></a></div><br />
<li>ウィザードの選択<br />
以下の画面で、「Android」の「Android Application Project」を選択し、「次へ」ボタンをクリックします。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9ABLhxvkDFWfmj9V1boGTHVPdM2eyTdZpxqqYIk-Q3dzmKFZ0Emz5szSc_DMh0uimB_13jXwoJpaUw7F_yHSNKseSkp2FNOvMy1znOgukUtrvhYsgE1bVtswGkVy44-pwan6QpfI8Kq6h/s1600/02%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588%25E3%2583%25A1%25E3%2583%258B%25E3%2583%25A5%25E3%2583%25BC%25EF%25BC%2589.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="167" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9ABLhxvkDFWfmj9V1boGTHVPdM2eyTdZpxqqYIk-Q3dzmKFZ0Emz5szSc_DMh0uimB_13jXwoJpaUw7F_yHSNKseSkp2FNOvMy1znOgukUtrvhYsgE1bVtswGkVy44-pwan6QpfI8Kq6h/s320/02%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588%25E3%2583%25A1%25E3%2583%258B%25E3%2583%25A5%25E3%2583%25BC%25EF%25BC%2589.png" /></a></div><br />
<li>New Android Application<br />
新規のプロジェクトを作成する画面が表示されます。<br />
<br />
以下の画面で「Application Name:」と「Project Name:」に「TestActivity」、「Package Name:」に「jp.co.triware.samples.Test」と入力します。<br />
<br />
「Build SDK:」は、開発対象のSDKのバージョンを選択します。<br />
<br />
また、アプリケーションのアイコン画像を後で設定する場合、「Create custom launcher icon」のチェックをはずし、「次へ」ボタンをクリックします。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM6YJyxtE6uYdbUTJmPBSRwZr1-AtvUpVqiZNxNeJ7sapbGpA-q5px0jkWyiR968-L-NzJxlwkuDNcrhgbF8aRHJMS_2X-rEno67zDER30jCcAsXjjmACvVsycdKhdobK4INQvhds9COYC/s1600/03%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588%25E5%2585%25A5%25E5%258A%259B%25EF%25BC%2589.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="215" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM6YJyxtE6uYdbUTJmPBSRwZr1-AtvUpVqiZNxNeJ7sapbGpA-q5px0jkWyiR968-L-NzJxlwkuDNcrhgbF8aRHJMS_2X-rEno67zDER30jCcAsXjjmACvVsycdKhdobK4INQvhds9COYC/s320/03%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588%25E5%2585%25A5%25E5%258A%259B%25EF%25BC%2589.png" /></a></div><table border="1" width="100%" cellspacing="0" cellpadding="0"><tbody>
<tr align="center"><td>画面項目名</td><td>説明</td></tr>
<tr><td>Application Name:</td><td>アプリケーション名</td></tr>
<tr><td>Project Name:</td><td>プロジェクト名(ワークスペース内にプロジェクトとして表示)</td></tr>
<tr><td>Package Name:</td><td>パッケージ名(最初に動作するプログラムのパッケージ)</td></tr>
<tr><td>Build SDK:</td><td>開発に使用するAndroid SDKバージョン</td></tr>
<tr><td>Minimum Required SDK:</td><td>動作するために必要な最低限のAndroid SDKバージョン</td></tr>
<tr><td>Create custom launcher icon:</td><td>起動用アイコン画像を設定するか否か(チェックを入れるとアイコン画像設定画面が次に表示)</td></tr>
<tr><td>Mark this project as a library:</td><td>このプロジェクトをライブラリとするか否か</td></tr>
<tr><td>Create Project in Workspace:</td><td>プロジェクトをワークスペースに作成するか否か</td></tr>
</tbody></table><br />
<li>Configure Launcher Icon<br />
「次へ」ボタンをクリックします。<br />
ランチャーアイコンを独自のアイコンに変更したい場合は、ここで設定を行ってください。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgZPN7cA4oY-Zae8Eq-MXYIMEnWp6eJWMKa4PQlucN6EeFULyRw56Jy_z3lGt79NScg0aYsld422dVLTtokBsGU9NAq1Xhrk2PDJygn3yQWnJgodbEpVA8Cbb5bpZVbB30CbUkXHeACRWF/s1600/04%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588Icon%25EF%25BC%2589.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="215" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgZPN7cA4oY-Zae8Eq-MXYIMEnWp6eJWMKa4PQlucN6EeFULyRw56Jy_z3lGt79NScg0aYsld422dVLTtokBsGU9NAq1Xhrk2PDJygn3yQWnJgodbEpVA8Cbb5bpZVbB30CbUkXHeACRWF/s320/04%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588Icon%25EF%25BC%2589.png" /></a></div><br />
<li>Create Activity<br />
「Create Activity」チェックボックスにチェックが入り、<br />
「Blank Activity」が選択されている事を確認し、「次へ」ボタンをクリックします。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipfj2_2nvzA8Pe0EIX0N__J4ksgcZA_dVWxtFQLTG1O0MPwFQR5Nr3tfagGd7o9GcK6RWMw4fwDaf2Ck_6jofNlk-vfq3zFnFSdupBUZTL97k4AQJj7M6YZ3_6rejfXcGEzka1rKMHdh3q/s1600/05%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588CreateActivity%25EF%25BC%2589.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="215" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipfj2_2nvzA8Pe0EIX0N__J4ksgcZA_dVWxtFQLTG1O0MPwFQR5Nr3tfagGd7o9GcK6RWMw4fwDaf2Ck_6jofNlk-vfq3zFnFSdupBUZTL97k4AQJj7M6YZ3_6rejfXcGEzka1rKMHdh3q/s320/05%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588CreateActivity%25EF%25BC%2589.png" /></a></div><table border="1" width="100%" cellspacing="0" cellpadding="0"><tbody>
<tr align="center"><td>画面項目名</td><td>説明</td></tr>
<tr><td>Create Activity:</td><td>アクティビティクラスを作成するか否か</td></tr>
<tr><td>BlankActivity:</td><td>通常のアクティビティ</td></tr>
<tr><td>MasterDetailFlow:</td><td>フラグメント(画面分割用)を使ったアクティビティ</td></tr>
</tbody></table><br />
<li>New Blank Activity<br />
以下の画面で、「Activity Name」に「TestActivity」、「Layout Name」に「main」、「Navigation Type」に「None」、「Title」に「TestActivity」を入力し、「完了」ボタンをクリックします。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Xm17L8TGDy1W3UIzU2wqlIxnK1NlSQi1a8Ts-qn94qpC2row7VGGjjhJu6qo93_IPHtpqklR4bU_SIVKfkiRXdGSsAQGb1jDWlUbNIDRJRMFaAsn0ht6v8cdvsHKhyXK_OeVCHwuhZo-/s1600/06%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588NewBlankActivity%25EF%25BC%2589.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="215" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Xm17L8TGDy1W3UIzU2wqlIxnK1NlSQi1a8Ts-qn94qpC2row7VGGjjhJu6qo93_IPHtpqklR4bU_SIVKfkiRXdGSsAQGb1jDWlUbNIDRJRMFaAsn0ht6v8cdvsHKhyXK_OeVCHwuhZo-/s320/06%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E4%25BD%259C%25E6%2588%2590%25EF%25BC%2588NewBlankActivity%25EF%25BC%2589.png" /></a></div><table border="1" width="100%" cellspacing="0" cellpadding="0"><tbody>
<tr align="center"><td>画面項目名</td><td>説明</td></tr>
<tr><td>Activity Name:</td><td>最初のアクティビティクラス名</td></tr>
<tr><td>Layout Name:</td><td>最初のレイアウト設定ファイル名</td></tr>
<tr><td>Navigation Type:</td><td>ナビゲーションタイプ(タブやドロップダウンなど)</td></tr>
<tr><td>Hierarchical Parent:</td><td>アクティビティクラスの継承元クラス</td></tr>
<tr><td>Title:</td><td>アプリケーションのタイトル</td></tr>
</tbody></table><br />
<li>プロジェクト作成完了<br />
以上で、新規のAndroidプロジェクトの作成は、完了です。<br />
Eclipseのプロジェクト・エクスプローラ上に、作成したプロジェクトが以下のように追加されたことを確認しましょう。<br />
あとは、ソースファイル、レイアウトファイル等を編集し、アプリケーションを作成します。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8hktgQCSsBJXex1AlREv7X4C4Byr-Jtwkxb9p7glr4vg8bhMJ8PnRO1fEP69aT2B2YQcSlfEo9cpbZ2TQ2hz-XXOB-sAHjtdSNGARj0feAr8QBl_Voafd2rY9Soh2G9-8qBHcGu7X1EUT/s1600/07%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E3%2583%25BB%25E3%2582%25A8%25E3%2582%25AF%25E3%2582%25B9%25E3%2583%2597%25E3%2583%25AD%25E3%2583%25BC%25E3%2583%25A9%25E3%2583%25BC.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="256" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8hktgQCSsBJXex1AlREv7X4C4Byr-Jtwkxb9p7glr4vg8bhMJ8PnRO1fEP69aT2B2YQcSlfEo9cpbZ2TQ2hz-XXOB-sAHjtdSNGARj0feAr8QBl_Voafd2rY9Soh2G9-8qBHcGu7X1EUT/s320/07%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E3%2583%25BB%25E3%2582%25A8%25E3%2582%25AF%25E3%2582%25B9%25E3%2583%2597%25E3%2583%25AD%25E3%2583%25BC%25E3%2583%25A9%25E3%2583%25BC.png" /></a></div></ol>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-59239894988567782012012-11-16T16:00:00.000+09:002012-11-23T11:40:38.131+09:00インストーラーを使ったAndroid SDKインストール以前、<a href="http://triware.blogspot.jp/2011/08/android.html" target="_blank">Android開発環境インストール手順</a>の記事中で、Android SDKのインストール手順を説明しました。<br />
その時はZIPファイルを使いましたが、今回はインストーラーを使った手順を説明します。<br />
<a name='more'></a><br />
<ol><li>Android SDK インストーラーのダウンロード<br />
下記サイトを開いて、Android SDKインストーラーをダウンロードします。<br />
<a href="http://developer.android.com/sdk/index.html" target="_blank">http://developer.android.com/sdk/index.html</a><br />
(従来通りzip形式を使用する場合は、「Other platform」リンクからダウンロードしてください。設定方法は<a href="http://triware.blogspot.jp/2011/08/android.html" target="_blank">過去の記事</a>をご覧ください。)</li>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8qDlfdavr9N4R5FJnrfDpQp_8_coEPccSAnYLBUWyQbUYYz0ntqTLZWxdgnEYdq6K2KpqI2oWYQjjcjlN4nnplnIhyphenhyphen8yh-P-ETpTIIv0BQRRm5wp2J_TNUEy61h62BcY-mE9rk5fEQX5h/s1600/01download.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="183" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8qDlfdavr9N4R5FJnrfDpQp_8_coEPccSAnYLBUWyQbUYYz0ntqTLZWxdgnEYdq6K2KpqI2oWYQjjcjlN4nnplnIhyphenhyphen8yh-P-ETpTIIv0BQRRm5wp2J_TNUEy61h62BcY-mE9rk5fEQX5h/s320/01download.png" /></a></div><li>Android SDK インストール<br />
ダウンロードしたinstaller_r20.0.3-windows.exeをダブルクリックしてインストールを開始します。<br />
[Next>]をクリックしてください。</li>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFyguZdP7tacDkj1upgYBOOCoK5xNPwblLkHrlaN39fuoGVLfiBEhBf5UV8nJsBBQrkqPZl_O3s7-IO5EJBQi4iFjZJMDX3cfkdmpVhKr1qrwPkunkdwql9-gp-zmSCVV9DKdjtN2f0p_K/s1600/02%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="248" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFyguZdP7tacDkj1upgYBOOCoK5xNPwblLkHrlaN39fuoGVLfiBEhBf5UV8nJsBBQrkqPZl_O3s7-IO5EJBQi4iFjZJMDX3cfkdmpVhKr1qrwPkunkdwql9-gp-zmSCVV9DKdjtN2f0p_K/s320/02%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" /></a></div><li>JDK有無の確認<br />
JDKがインストール済みである旨が表示されます。<br />
[Next>]をクリックしてください。<br />
(JDKがインストールされていない場合は、インストールが促されますので、指示に従いJDKのインストールを完了させてください。)</li>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg07k2DKTy8QpS7s2BnrcGBvvBoommJW4HxvHeJ-8yogXOpJdnUVVN1XPTSmbxO2io3tKpI7MJd3b3q10nYzHubMCAwmFP6BCHn7vSLzzj1sbpquDy6zro9k9K-HFgM48QwjdagcyJgTeEJ/s1600/03%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="249" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg07k2DKTy8QpS7s2BnrcGBvvBoommJW4HxvHeJ-8yogXOpJdnUVVN1XPTSmbxO2io3tKpI7MJd3b3q10nYzHubMCAwmFP6BCHn7vSLzzj1sbpquDy6zro9k9K-HFgM48QwjdagcyJgTeEJ/s320/03%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" /></a></div><li>使用ユーザーの決定<br />
使用するユーザーを選択して、[Next>]をクリックしてください。<br />
Install for anyone using this conmputer を選択した場合は、以下のフォルダにインストールされます。<br />
C:\Program Files (x86)\Android\android-sdk<br />
Install jsut for me を選択した場合は、以下のフォルダにインストールされます。<br />
C:\Users\[ユーザー名]\AppData\Local\Android\android-sdk<br />
(次の画面でインストールフォルダは変更できます。)</li>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFVts7Ce1m8TZWE7Sv6WkCmURluUOX49kULG9hObA19l9Uy56pzkpKYZFM4T-EBezf8AvDXTJuWz88VEmPfBIsBgz_4-owaTpzhtIgU2ipIlYblJKEyi7iHjRDhQ2XKBtBHCAP2OLnR_8m/s1600/04%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="248" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFVts7Ce1m8TZWE7Sv6WkCmURluUOX49kULG9hObA19l9Uy56pzkpKYZFM4T-EBezf8AvDXTJuWz88VEmPfBIsBgz_4-owaTpzhtIgU2ipIlYblJKEyi7iHjRDhQ2XKBtBHCAP2OLnR_8m/s320/04%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" /></a></div><li>インストールフォルダの決定<br />
インストールフォルダを決定します。[Next>]をクリックしてください。<br />
(ここで任意のインストールフォルダ名に変更すると、異なるバージョンのSDKを複数インストールすることが出来ます。しかし、コントロールパネルからのアンインストールの選択では、最後にインストールしたパスに切り替わっているので注意してください。)</li>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcqw9ml8bYWVeiQyvaTLxTTMLDyY4fB0pFlHKQK769zmhOIiJSnUhpXnB0KxgVFKLEsimQypVhCETOHi5CqfKjZYh2fKv_K8UKmmOmW-cm8yagOmFrdJAcdP9IKbCqqtpRp9y17U7AXUg0/s1600/05%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="249" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcqw9ml8bYWVeiQyvaTLxTTMLDyY4fB0pFlHKQK769zmhOIiJSnUhpXnB0KxgVFKLEsimQypVhCETOHi5CqfKjZYh2fKv_K8UKmmOmW-cm8yagOmFrdJAcdP9IKbCqqtpRp9y17U7AXUg0/s320/05%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" /></a></div><li>スタートメニュー名の決定<br />
スタートメニューに登録する名前を決定します。[Next>]をクリックしてください。<br />
(ここで名前を変えておけば、指定したバージョンのSDKの起動、アンインストールが可能です。)</li>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsF0v1Vel_BV5ip0LfjvSUt2mFoMzG41CzGRelCMBCP1QCqBxIPenfIG3TqxB5cPXSPbX_G094FqRKs3NV7ppwyCF10SqZSZaMz1UhdcWRC98Akq73oqB3IDVpOZhZcsvtS8az_uumgv7L/s1600/06%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="249" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsF0v1Vel_BV5ip0LfjvSUt2mFoMzG41CzGRelCMBCP1QCqBxIPenfIG3TqxB5cPXSPbX_G094FqRKs3NV7ppwyCF10SqZSZaMz1UhdcWRC98Akq73oqB3IDVpOZhZcsvtS8az_uumgv7L/s320/06%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" /></a></div><li>インストール開始<br />
インストールが開始されます。終了後、[Next>]をクリックしてください。</li>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7e0gCht7NiA9hlgsMhyphenhyphenLQhG2cQ6w6WjeWlmz-GNwLGIdy4IYt7UiPuKwkU1rkQCVIi_G0EVOtztL7bswuTZxXvkLSW0eSYdUmThZFx_bF0ugZ54KczIhMLvdYICbUzIevwxJXlQ2mx1YP/s1600/07%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="248" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7e0gCht7NiA9hlgsMhyphenhyphenLQhG2cQ6w6WjeWlmz-GNwLGIdy4IYt7UiPuKwkU1rkQCVIi_G0EVOtztL7bswuTZxXvkLSW0eSYdUmThZFx_bF0ugZ54KczIhMLvdYICbUzIevwxJXlQ2mx1YP/s320/07%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" /></a></div><li>インストール完了<br />
そのまま、[Finish]をクリックしてください。</li>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4gnUlvRZ6UBtx2sQ-rdEe7A36bCudkOHfP6LYBwd7DhNWeNfPCDLw5G_yE1jb6pvEuMFL4qPKITR-22VcZxnvaEVqOs6_SDI2CuyaBtgneOD5unUJQE6sRn3_eLPZE8AJphYXpDs1tcME/s1600/08%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="249" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4gnUlvRZ6UBtx2sQ-rdEe7A36bCudkOHfP6LYBwd7DhNWeNfPCDLw5G_yE1jb6pvEuMFL4qPKITR-22VcZxnvaEVqOs6_SDI2CuyaBtgneOD5unUJQE6sRn3_eLPZE8AJphYXpDs1tcME/s320/08%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB.png" /></a></div><li>Android SDK Managerの起動<br />
[Finish]をクリックすると、SDK Managerが自動的に起動します。<br />
「Android 4.1.2 (API 16)」だけが選択されています。<br />
必要なパッケージを選択して、[Install # packages] (#は選択したパッケージ数)をクリックしてください。<br />
[Install]をクリックしてください。</li>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqwg4t8bYqFTD-62Xn20RF83u6kzSD9wWdPZOQRBT6YonoiAtkki0is4p56eKh7gBABMArHuhXkHTmpee14fTL2ZUaetfGKHxhtSRjE9kNLxWpYSfdEp0CqfeuJx63ha_emnpf4XabscZS/s1600/09SDK.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="209" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqwg4t8bYqFTD-62Xn20RF83u6kzSD9wWdPZOQRBT6YonoiAtkki0is4p56eKh7gBABMArHuhXkHTmpee14fTL2ZUaetfGKHxhtSRjE9kNLxWpYSfdEp0CqfeuJx63ha_emnpf4XabscZS/s320/09SDK.png" /></a></div>インストールするパッケージの内容とライセンスが表示されます。 確認後、[Accept]または[Accept All]を選択して、[Install]をクリックしてください。 インストールが完了するまでしばらく待ちます。インストール完了後、[Close]をクリックしてください。 <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRjYYxQCChOfR0esy-oqbpPa7Y1Kdla2AVRp3PvYUg1uzzkC2T8CcFRKgWNdh1gcDUZbNxuNEOaj3fJ8YF7EBAFm6GrODyfgaqR41LXTvdbANQha2IK5ipywt_y6luIMNgHhc84Ik6E15b/s1600/10SDK.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="209" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRjYYxQCChOfR0esy-oqbpPa7Y1Kdla2AVRp3PvYUg1uzzkC2T8CcFRKgWNdh1gcDUZbNxuNEOaj3fJ8YF7EBAFm6GrODyfgaqR41LXTvdbANQha2IK5ipywt_y6luIMNgHhc84Ik6E15b/s320/10SDK.png" /></a></div><li><span style="text-align: center;">EclipseでのSDKの関連付け</span><br />
<span style="text-align: center;">Eclipseを起動してAndroid SDKを関連付けます。<br />
[ウィンドウ]→[設定]→[Android]→[SDK ロケーション]にSDK Manager.exeが格納されているパスを設定し、[適用]をクリックします。<br />
</span></li>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbBFDtCGMR5ca3K9g4JGqo2I9kBeN2wbIluARm4w9jigsVoNy7Z2JdsAB8wPv1y51h-TxKOYOZKVCk5XtPMLAiBwD86f6u71g4cCMMonNqyQ-3aM_d-vl3mqyrBVnYlqRBtOISXD0UzDQd/s1600/11Eclipse%25E3%2581%25A7%25E3%2581%25AESDK%25E3%2581%25AE%25E5%258F%2582%25E7%2585%25A7.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="179" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbBFDtCGMR5ca3K9g4JGqo2I9kBeN2wbIluARm4w9jigsVoNy7Z2JdsAB8wPv1y51h-TxKOYOZKVCk5XtPMLAiBwD86f6u71g4cCMMonNqyQ-3aM_d-vl3mqyrBVnYlqRBtOISXD0UzDQd/s320/11Eclipse%25E3%2581%25A7%25E3%2581%25AESDK%25E3%2581%25AE%25E5%258F%2582%25E7%2585%25A7.png" /></a></div>設定画面にターゲット名が表示されます。内容を確認して、[適用]または[OK]をクリックします。 </ol><div><div class="separator" style="clear: both; text-align: center;"></div><div style="text-align: center;"><br />
</div></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-56932137406675851672012-11-07T13:15:00.000+09:002012-11-07T13:15:00.745+09:00通知(Notification) #7 (プログレスバー)今回は通知エリアにプログレスバーを表示します。プログレスバーがあると、ユーザーがいつまで待てばいいのかわかりますので有効な方法ですね。<br />
<br />
なお、今回のサンプルプログラムはAPI Level 14 (Android 4.0)以降を対象としています。<br />
<a name='more'></a><br />
<b>NotificationTest7aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.NotificationTest7a;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class NotificationTest7aActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final NotificationManager notifMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
final Notification.Builder notifBuilder = new Notification.Builder(this); // API Level 11
final EditText etTickerText = (EditText)findViewById(R.id.tickerText_et);
final EditText etContentText = (EditText)findViewById(R.id.contentText_et);
Button btnNotify = (Button)findViewById(R.id.notify_btn);
btnNotify.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// ステータスバーと通知エリアに表示する内容を取得
int icon = R.drawable.ic_launcher; // アイコン
String tickerText = etTickerText.getText().toString(); // テキスト(ステータスバー)
long when = System.currentTimeMillis(); // 時刻
String contentTitle = getString(R.string.app_name); // タイトル
String contentText = etContentText.getText().toString(); // 完了時の通知メッセージ
// 取得した値をセット
notifBuilder.setSmallIcon(icon);
notifBuilder.setTicker(tickerText);
notifBuilder.setWhen(when);
notifBuilder.setContentTitle(contentTitle);
notifBuilder.setContentText(contentText);
// プログレスバー表示用のスレッド
new Thread(new Runnable() {
@Override
public void run() {
// バーの表示
for (int i = 0; i <= 100; i ++) {
notifBuilder.setProgress(100, i, false); // API Level 14
notifMgr.notify(R.string.app_name, notifBuilder.getNotification());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
;
}
}
// 完了時の通知
notifBuilder.setProgress(0, 0, false); // API Level 14
notifMgr.notify(R.string.app_name, notifBuilder.getNotification());
}
}).start();
}
});
}
}
</pre><br />
19行目のNotification.BuilderはAndroid 3.0 (API Level 11)で追加されました。また、46行目と55行目のsetProgress()メソッドはAndroid 4.0 (API Level 14)で追加されました。これらを使うために、今回はAndroid 4.0以降を対象としています。<br />
<br />
46行目のsetProgress()で、0~100%のプログレスバーを表示します。処理が終わったら、55行目でプログレスバーを消します。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<EditText
android:id="@+id/tickerText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Ticker Text"
/>
<EditText
android:id="@+id/contentText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Content Text"
/>
<Button
android:id="@+id/notify_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Notify"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>NotificationTest7a</td></tr>
<tr><td>アプリケーション名:</td><td>NotificationTest7a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.NotificationTest7a</td></tr>
<tr><td>アクティビティーの作成:</td><td>NotificationTest7aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、『Android 4.0 (API Level 14)以降』を指定してください。<br />
<br />
<b>実行結果</b><br />
<br />
いつものようにテキストを入力してNotifyボタンをクリックします。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyufwyyh5BBpVDsQGHedqGOD8uKrwqvZS83JSi98ACAvGHUBBSrPD1w_-ciWw-I7Cf-_Y97OhWCOJ5dHE0YfJDM28UOacKdDh2EtXJKi3JTs5CR_YCw8OQ0NmX_onl4_fdjtKGwfhoGfzJ/s1600/NotificationTest7a-1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyufwyyh5BBpVDsQGHedqGOD8uKrwqvZS83JSi98ACAvGHUBBSrPD1w_-ciWw-I7Cf-_Y97OhWCOJ5dHE0YfJDM28UOacKdDh2EtXJKi3JTs5CR_YCw8OQ0NmX_onl4_fdjtKGwfhoGfzJ/s320/NotificationTest7a-1.png" /></a></div><br />
ステータスバーにアイコンが表示されたので、、、<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLRGmxFfSQmc5jgbbzgN_EU2_vlHwqcWyLu4YCn28P2W02PTSOLpEYJHS-0z3yr7-NMUMTbc_zB-UucWMHtKTvLIdTwLacDOapfsHY7a268777SqDL__vEAjBN4nh2jP7_JhlPHjC1YjbW/s1600/NotificationTest7a-2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLRGmxFfSQmc5jgbbzgN_EU2_vlHwqcWyLu4YCn28P2W02PTSOLpEYJHS-0z3yr7-NMUMTbc_zB-UucWMHtKTvLIdTwLacDOapfsHY7a268777SqDL__vEAjBN4nh2jP7_JhlPHjC1YjbW/s320/NotificationTest7a-2.png" /></a></div><br />
通知エリアを開くと、プログレスバーが表示されて、バーが進んでいます。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgy2Jnpu8BkDUFetk3zrgL82m6ZgSVnh3B439jqChrT50NeUWeQ0cspl4Qwzu7hEqj8LLeOmyX7l0TI308XCmgjl1bZ3r5W49MTwN28D5pqQ9B9KoujaXCzlCu7C3o7BItSAwJaCMH46JS/s1600/NotificationTest7a-3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgy2Jnpu8BkDUFetk3zrgL82m6ZgSVnh3B439jqChrT50NeUWeQ0cspl4Qwzu7hEqj8LLeOmyX7l0TI308XCmgjl1bZ3r5W49MTwN28D5pqQ9B9KoujaXCzlCu7C3o7BItSAwJaCMH46JS/s320/NotificationTest7a-3.png" /></a></div><br />
処理が終わるとプログレスバーが消えました。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZjmISAzv-Qddh0m7eHz1TLbiGiedpa90hWUnoGyitvyvVnPqsog_dGc20EO2GiiWz6-4Hj36SDUa2R04ifOrMYr4XsR_BNcWfeipUyhUQPBXMVGMMpJrow4pILUIt3Fn71nnEDhDSnC4o/s1600/NotificationTest7a-4.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZjmISAzv-Qddh0m7eHz1TLbiGiedpa90hWUnoGyitvyvVnPqsog_dGc20EO2GiiWz6-4Hj36SDUa2R04ifOrMYr4XsR_BNcWfeipUyhUQPBXMVGMMpJrow4pILUIt3Fn71nnEDhDSnC4o/s320/NotificationTest7a-4.png" /></a></div><br />
<br />
今回はAndroid 4.0用のサンプルでしたが、実はそれ以前のバージョンでも実現できます。これについてはまた別の機会にご紹介する予定です。<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-79832756888166703142012-10-18T18:53:00.000+09:002012-10-18T18:53:00.265+09:00通知(Notification) #6 (アクティビティ呼出)これまでNotificationを使って、アプリケーションの情報をユーザーに通知する方法を説明してきました。<br />
今回は通知エリアに表示された通知をクリックしてアクティビティを呼び出すようにしてみます。<br />
<br />
以下は、自アクティビティを呼ぶサンプルです。<br />
<br />
「<a href="http://triware.blogspot.jp/2012/09/notification.html" target="_blank">通知(Notification)</a>」のサンプル、NotificationTest1aActivity.javaをベースに作りました。<br />
<a name='more'></a><br />
<b>NotificationTest6aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.NotificationTest6a;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class NotificationTest6aActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final NotificationManager notifMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
final EditText etTickerText = (EditText)findViewById(R.id.tickerText_et);
final EditText etContentText = (EditText)findViewById(R.id.contentText_et);
Button btnNotify = (Button)findViewById(R.id.notify_btn);
btnNotify.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// ステータスバーと通知エリアに表示する内容をセット
int icon = R.drawable.ic_launcher; // アイコン
String tickerText = etTickerText.getText().toString(); // テキスト(ステータスバー)
long when = System.currentTimeMillis(); // 時刻
Notification notif = new Notification(icon, tickerText, when);
// 通知エリアに表示する内容をセット
String contentTitle = getString(R.string.app_name); // タイトル
String contentText = etContentText.getText().toString(); // 通知メッセージ
Intent intent = getIntent(); // 自アクティビティ
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
notif.setLatestEventInfo(getApplicationContext(), contentTitle, contentText, contentIntent);
// 通知
notifMgr.notify(R.string.app_name, notif);
}
});
}
}</pre><br />
変更箇所は36行目だけです。<br />
<br />
変更前: Intent intent = null; // タップ時の処理(今回は何もしない)<br />
変更後: Intent intent = getIntent(); // 自アクティビティ<br />
<br />
36行目で自分のインテントを取得して、それを37行目で、遷移先としてセットしています。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<EditText
android:id="@+id/tickerText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Ticker Text"
/>
<EditText
android:id="@+id/contentText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Content Text"
/>
<Button
android:id="@+id/notify_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Notify"
/>
</LinearLayout>
</pre><br />
こちらは変更なし、<a href="http://triware.blogspot.jp/2012/09/notification.html">NotificationTest1a</a>のmain.xmlと全く同じです。<br />
<br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>NotificationTest6a</td></tr>
<tr><td>アプリケーション名:</td><td>NotificationTest6a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.NotificationTest6a</td></tr>
<tr><td>アクティビティーの作成:</td><td>NotificationTest6aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<br />
<a href="http://triware.blogspot.jp/2012/09/notification.html">NotificationTest1a</a>と同様、TickerTextとContentTextを入力して、Notifyボタンをクリックします。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiscFzath04JH3cnUs3eo9a-GT_xeNmKNkLtsbClwntPoTpN_kYrqCdbAkBUl1ZrbWv5OGP7NpYeF71iNp6BIhm86GB5y7xVr7CgKF-2jyhqKQfTYtH_0nigpBsCashMYom4jomTJV0TVPq/s1600/NotificationTest6a-1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiscFzath04JH3cnUs3eo9a-GT_xeNmKNkLtsbClwntPoTpN_kYrqCdbAkBUl1ZrbWv5OGP7NpYeF71iNp6BIhm86GB5y7xVr7CgKF-2jyhqKQfTYtH_0nigpBsCashMYom4jomTJV0TVPq/s320/NotificationTest6a-1.png" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7Yg1RyGemg2HcdevPhonU0RxZO__O9_Gpu884Uya_-n0IxVsQXhDi9Z8hbe8BvKRgLuEU8ItWhubBJkLXwamkuJn3HBhKzc10y89YAv24vP5OaSF9a2aBT8566I4n2QYEHC_umBLlQN7C/s1600/NotificationTest6a-2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7Yg1RyGemg2HcdevPhonU0RxZO__O9_Gpu884Uya_-n0IxVsQXhDi9Z8hbe8BvKRgLuEU8ItWhubBJkLXwamkuJn3HBhKzc10y89YAv24vP5OaSF9a2aBT8566I4n2QYEHC_umBLlQN7C/s320/NotificationTest6a-2.png" /></a></div>通知エリアが消えた際、本当に自アクティビティに戻っているかどうか確認するために、ホームキーを押してホーム画面に遷移しておきます。<a href="http://triware.blogspot.jp/2012/09/notification.html">NotificationTest1a</a>で試すとわかると思いますが、インテントをセットしていない場合は、通知エリアを閉じるだけになります。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVKNqbRXWEQ3GMcN2siicLyfysyiVYdwg_wNvPycHf0LkJJNxtEtoksu1Ka_pqAGVZ4dFRmScZiEhm8Z8zwaE7w6xTsmYFAGShryb9Us__ItnEP68KE-gDf2wPK8gffImB2J5-s4TTjh2X/s1600/NotificationTest6a-3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVKNqbRXWEQ3GMcN2siicLyfysyiVYdwg_wNvPycHf0LkJJNxtEtoksu1Ka_pqAGVZ4dFRmScZiEhm8Z8zwaE7w6xTsmYFAGShryb9Us__ItnEP68KE-gDf2wPK8gffImB2J5-s4TTjh2X/s320/NotificationTest6a-3.png" /></a></div>通知エリアを開いて「NotificationTest6a」をクリックすると、NotificationTest6aに戻りました。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqwV4A5CYyvWDwogAhS4fBdkVlg6Qs1iLLt6qLiLYQbyqBaHOlk-xmk2RbbLz2TKUXw1YRdIR9MnULYD77s0PVuxraFuRZbgGs749dfqEukfCouh_AmOCCdKHVIgFWoWTvpjcXFnWXEpxg/s1600/NotificationTest6a-4.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqwV4A5CYyvWDwogAhS4fBdkVlg6Qs1iLLt6qLiLYQbyqBaHOlk-xmk2RbbLz2TKUXw1YRdIR9MnULYD77s0PVuxraFuRZbgGs749dfqEukfCouh_AmOCCdKHVIgFWoWTvpjcXFnWXEpxg/s320/NotificationTest6a-4.png" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSKzch9T7AuTTyYejw7IapqAgGBskwuFhLUPre-0t9ET00fERnpfshNyBvwL5sm-r6Ezc61ARTXFtDCJ2xcKBF2jm0Bm7rGeURwTLGpW9C3hLEoWl0qqp4aNHRyDsUN2Odem8jIyYHREb_/s1600/NotificationTest6a-5.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSKzch9T7AuTTyYejw7IapqAgGBskwuFhLUPre-0t9ET00fERnpfshNyBvwL5sm-r6Ezc61ARTXFtDCJ2xcKBF2jm0Bm7rGeURwTLGpW9C3hLEoWl0qqp4aNHRyDsUN2Odem8jIyYHREb_/s320/NotificationTest6a-5.png" /></a></div><br />
<br />
<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-71939225678032343452012-10-12T11:00:00.000+09:002012-10-13T12:29:49.693+09:00タイトルバーの文字列をセンタリング通常タイトルバーは左寄せで表示されることが多いですが、タイトルバーのレイアウトを XML で定義して変更することが可能です。今回は、タイトルバーの文字列をセンタリングしてみましょう。<br />
<a name='more'></a><br />
<b>CustomTitleBarTest1aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.CustomTitleBarTest1a;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
public class CustomTitleBarTest1aActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// タイトルにレイアウトを指定する
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.main);
// カスタマイズしたレイアウトファイルを指定
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);
}
}
</pre>14行目の<blockquote>requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);</blockquote>で任意のレイアウトファイルを設定します。<br />
<br />
設定するレイアウトファイルは18行目の<blockquote>getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);</blockquote>で指定しています。<br />
<br />
requestWindowFeatureメソッドはsetContentViewメソッドの前に設定してください。順番を入れ替えると設定値が反映されません。<br />
<br />
<b>titlebar.xml</b><br />
<pre class="brush: 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="horizontal"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@android:color/white"
/>
</LinearLayout>
</pre><br />
タイトルを表示させるTextViewを画面の横幅いっぱいに表示させて、TextView内で文字列をセンタリングしています。<br />
色を指定しないと背景色に似た色で見づらいため、12行目で白色を指定しています。<blockquote>android:textColor="@android:color/white"</blockquote><br />
<b>main.xml</b><br />
<pre class="brush: 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/hello"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>CustomTitleBarTest1a</td></tr>
<tr><td>アプリケーション名:</td><td>CustomTitleBarTest1a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.CustomTitleBarTest1a</td></tr>
<tr><td>アクティビティーの作成:</td><td>CustomTitleBarTest1aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJdIOUvA-y_3hfdc4WU-AsMP3HmlT-IRpDYIckBZe7AYg-TV2VWFAUlGXGP7Xp3Twhl2gGT4rfR-tsMfSP0BmSECGJCSpJiKEMLsG9OEivKQ8ghx6t4HHlUwaqhdLvKMIS9scCqGr-oks9/s1600/%25E3%2582%25BF%25E3%2582%25A4%25E3%2583%2588%25E3%2583%25AB%25E3%2582%25BB%25E3%2583%25B3%25E3%2582%25BF%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25B0Black.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="78" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJdIOUvA-y_3hfdc4WU-AsMP3HmlT-IRpDYIckBZe7AYg-TV2VWFAUlGXGP7Xp3Twhl2gGT4rfR-tsMfSP0BmSECGJCSpJiKEMLsG9OEivKQ8ghx6t4HHlUwaqhdLvKMIS9scCqGr-oks9/s320/%25E3%2582%25BF%25E3%2582%25A4%25E3%2583%2588%25E3%2583%25AB%25E3%2582%25BB%25E3%2583%25B3%25E3%2582%25BF%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25B0Black.png" width="320" /></a></div>タイトルの文字列がセンタリングされています。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-49893601358931350452012-10-01T18:05:00.000+09:002012-10-16T23:55:21.978+09:00通知(Notification) #5 (Clear対象外)通知エリアの「Clear」ボタンを押すと、「通知」はすべて消去されてしまいます。ユーザーに確実に知ってもらいたいような重要な通知は、ユーザーがそれをクリックするまで残しておきたいものです。<br />
<br />
そこで今回は通知エリアの「Clear」ボタンを押しても通知が消去されないようにするサンプルプログラムを紹介します。<br />
<br />
<hr size="1" /><span style="color: orange;">◆</span> 通知(Notification) #5 (Clear対象外)<br />
<br />
前回に引き続き、今回も主役はNotificationのフラグです。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBxHOJpoVXKVvarsJJUKeKoZEipcAf35M0gQIVbgAsT0K_fujueNVauGkYT6zazu0nBORNVI8hes7HpLFFWRH90PPLHRYZ78MRwjh3yox9lZuMs_uFnIzeSC-ktpbTE1UrxCNrUYrwLH5f/s1600/NotificationTest5a-0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="72" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBxHOJpoVXKVvarsJJUKeKoZEipcAf35M0gQIVbgAsT0K_fujueNVauGkYT6zazu0nBORNVI8hes7HpLFFWRH90PPLHRYZ78MRwjh3yox9lZuMs_uFnIzeSC-ktpbTE1UrxCNrUYrwLH5f/s320/NotificationTest5a-0.png" width="320" /></a></div>Notify #1はこれまでと同じで、通知エリアの「Clear」ボタンで消去されます。<br />
Notify #2が選択された場合は、フラグ(FLAG_NO_CLEAR)をセットして、消去されないようにします。<br />
<a name='more'></a><br />
<b>NotificationTest5aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.NotificationTest5a;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
public class NotificationTest5aActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final NotificationManager notifMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
final EditText etTickerText = (EditText)findViewById(R.id.tickerText_et);
final EditText etContentText = (EditText)findViewById(R.id.contentText_et);
final RadioGroup rgSelect = (RadioGroup)findViewById(R.id.group_rg);
// Notifyボタン
Button btnNotify = (Button)findViewById(R.id.notify_btn);
btnNotify.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// ステータスバーと通知エリアに表示する内容をセット
int icon = R.drawable.ic_launcher; // アイコン
String tickerText = etTickerText.getText().toString(); // テキスト(ステータスバー)
long when = System.currentTimeMillis(); // 時刻
Notification notif = new Notification(icon, tickerText, when);
// ラジオボタンのIDを通知のIDとして使用する
int id = rgSelect.getCheckedRadioButtonId();
// フラグの設定
notif.flags |= Notification.FLAG_AUTO_CANCEL; // クリックでキャンセル
if (id == R.id.select2_rb) {
notif.flags |= Notification.FLAG_NO_CLEAR; // 通知エリアの「Clear」でキャンセルしない
}
// 通知エリアに表示する内容をセット
String contentTitle = getString(R.string.app_name); // タイトル
String contentText = etContentText.getText().toString(); // 通知メッセージ
Intent intent = null; // タップ時の処理(今回は何もしない)
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
notif.setLatestEventInfo(getApplicationContext(), contentTitle, contentText, contentIntent);
// 通知
notifMgr.notify(id, notif);
}
});
// Clearボタン
Button btnClear = (Button)findViewById(R.id.clear_btn);
btnClear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// ID取得
int id = rgSelect.getCheckedRadioButtonId();
// キャンセル
notifMgr.cancel(id);
}
});
}
}
</pre><br />
42行目の<br />
<blockquote>notif.flags |= Notification.FLAG_NO_CLEAR;</blockquote>で、通知エリアの「Clear」ボタンで消去されないようにフラグ(FLAG_NO_CLEAR)をセットしています。<br />
この通知を消すために40行目でクリックしてキャンセルするためのフラグ(FLAG_AUTO_CANCEL)をセットしています。<br />
<blockquote>notif.flags |= Notification.FLAG_AUTO_CANCEL;</blockquote><br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<RadioGroup
android:id="@+id/group_rg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<RadioButton
android:id="@+id/select1_rb"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Notify #1"
android:checked="true"
/>
<RadioButton
android:id="@+id/select2_rb"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Notify #2"
/>
</RadioGroup>
<EditText
android:id="@+id/tickerText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Ticker Text"
/>
<EditText
android:id="@+id/contentText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Content Text"
/>
<Button
android:id="@+id/notify_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Notify"
/>
<Button
android:id="@+id/clear_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Clear"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>NotificationTest5a</td></tr>
<tr><td>アプリケーション名:</td><td>NotificationTest5a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.NotificationTest5a</td></tr>
<tr><td>アクティビティーの作成:</td><td>NotificationTest5aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<br />
「Notify #1」と「Notify #2」を通知します。#1が従来通りで、#2が消えないようにフラグをセットしている方です。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWuTg3_nkp4NETXmUKztBg34JQ6_GE6XKWH-GKl9F2A8JPfZLMVcSpwU5EyJ9E3h6QrsH67UqjCScCjUMB-Ct6YNTpmgN-WcDDvs-wptcynWu0zTJbRinBY14UGhML547T_44ghY8MoU1o/s1600/NotificationTest5a-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWuTg3_nkp4NETXmUKztBg34JQ6_GE6XKWH-GKl9F2A8JPfZLMVcSpwU5EyJ9E3h6QrsH67UqjCScCjUMB-Ct6YNTpmgN-WcDDvs-wptcynWu0zTJbRinBY14UGhML547T_44ghY8MoU1o/s320/NotificationTest5a-1.png" width="192" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin9UV6XsyhPJ4k1MiulNU0H3VbZFfcxvA7dxaeg2XO451TqyJozILPXm0qh7bNuauJY9U2ymV1xlQChlxdT1hJ-Bqg9qhcA56ZFzehlHKnK_tbfAu44xb1rxmQzznHY_Ir-zCHF7qi4Z0x/s1600/NotificationTest5a-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin9UV6XsyhPJ4k1MiulNU0H3VbZFfcxvA7dxaeg2XO451TqyJozILPXm0qh7bNuauJY9U2ymV1xlQChlxdT1hJ-Bqg9qhcA56ZFzehlHKnK_tbfAu44xb1rxmQzznHY_Ir-zCHF7qi4Z0x/s320/NotificationTest5a-2.png" width="192" /></a></div><br />
通知エリアを開くと、通知が2つ表示されています。ここで通知エリアの「Clear」ボタンを押すと、これまでのサンプルではすべての「通知」が消えていましたが、Notify #2の「No Clear」は消去されていませんね。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPwoyI_ZTAGa0LPMR04FgJt8FAXng-NWGuePir14owQ7evMMFozWGF7nt1dHHq29aXCRji3vvtgk24fOhiRDkJUYJcPJgM_MF4lo3Zc40Cx_KjTANQOR0rhEKvv56L4vydNn7eGAk4TM-e/s1600/NotificationTest5a-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPwoyI_ZTAGa0LPMR04FgJt8FAXng-NWGuePir14owQ7evMMFozWGF7nt1dHHq29aXCRji3vvtgk24fOhiRDkJUYJcPJgM_MF4lo3Zc40Cx_KjTANQOR0rhEKvv56L4vydNn7eGAk4TM-e/s320/NotificationTest5a-3.png" width="192" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ3gOUWR025BIl_C6JBRgnSXee35j6ziSu5jo3YX0lskYaIv0I0DbPG9d4udNCmYDEqLoFPF8TOkCGlOWpm1P2FgW_fioMOkT7NaCpLyEpwQ97Si9TNCBUuXNt1baTfr0SHOcF47mbRObD/s1600/NotificationTest5a-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ3gOUWR025BIl_C6JBRgnSXee35j6ziSu5jo3YX0lskYaIv0I0DbPG9d4udNCmYDEqLoFPF8TOkCGlOWpm1P2FgW_fioMOkT7NaCpLyEpwQ97Si9TNCBUuXNt1baTfr0SHOcF47mbRObD/s320/NotificationTest5a-4.png" width="192" /></a></div><br />
この通知を消すには、通知をクリックするか、アプリの「Clear」ボタンを押してください。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-34795900163892501202012-09-26T15:15:00.000+09:002012-10-16T23:55:38.595+09:00通知(Notification) #4 (クリックでキャンセル)<a href="http://triware.blogspot.jp/2012/09/notification-3.html">前回</a>は、通知エリアの「Clear」ボタンの他に、アプリケーションから通知を消去する方法について説明しました。プログラムからタイミングを見計らって消去するにはこの方法でいいのですが、実際にはユーザーが「確認したので消したい」というケースも多いはずです。<br />
<br />
今回は、通知エリアに表示された通知をクリックすることで、その通知を消去するサンプルプログラムを紹介します。<br />
<br />
<hr size="1" /><span style="color: orange;">◆</span> 通知(Notification) #4 (クリックでキャンセル)<br />
<br />
前回、通知を「実行中」にするために、Notificationのフラグを変更しました。今回もこのフラグを変更することで、通知をクリックするとキャンセルできるようになります。<br />
<a name='more'></a><br />
<b>NotificationTest4aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.NotificationTest4a;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
public class NotificationTest4aActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final NotificationManager notifMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
final EditText etTickerText = (EditText)findViewById(R.id.tickerText_et);
final EditText etContentText = (EditText)findViewById(R.id.contentText_et);
final RadioGroup rgSelect = (RadioGroup)findViewById(R.id.group_rg);
// Notifyボタン
Button btnNotify = (Button)findViewById(R.id.notify_btn);
btnNotify.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// ステータスバーと通知エリアに表示する内容をセット
int icon = R.drawable.ic_launcher; // アイコン
String tickerText = etTickerText.getText().toString(); // テキスト(ステータスバー)
long when = System.currentTimeMillis(); // 時刻
Notification notif = new Notification(icon, tickerText, when);
// ラジオボタンのIDを通知のIDとして使用する
int id = rgSelect.getCheckedRadioButtonId();
// フラグの設定
notif.flags |= Notification.FLAG_AUTO_CANCEL; // クリックでキャンセル
if (id == R.id.select2_rb) {
notif.flags |= Notification.FLAG_ONGOING_EVENT; // 「実行中」
}
// 通知エリアに表示する内容をセット
String contentTitle = getString(R.string.app_name); // タイトル
String contentText = etContentText.getText().toString(); // 通知メッセージ
Intent intent = null; // タップ時の処理(今回は何もしない)
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
notif.setLatestEventInfo(getApplicationContext(), contentTitle, contentText, contentIntent);
// 通知
notifMgr.notify(id, notif);
}
});
// Clearボタン
Button btnClear = (Button)findViewById(R.id.clear_btn);
btnClear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// ID取得
int id = rgSelect.getCheckedRadioButtonId();
// キャンセル
notifMgr.cancel(id);
}
});
}
}
</pre><br />
必要なコードは、40行目の<br />
<blockquote>notif.flags |= Notification.FLAG_AUTO_CANCEL;</blockquote>これだけです。このフラグ(FLAG_AUTO_CANCEL)を追加することで、通知をタップして消去することができるようになります。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<RadioGroup
android:id="@+id/group_rg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<RadioButton
android:id="@+id/select1_rb"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Notify"
android:checked="true"
/>
<RadioButton
android:id="@+id/select2_rb"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Ongoing"
/>
</RadioGroup>
<EditText
android:id="@+id/tickerText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Ticker Text"
/>
<EditText
android:id="@+id/contentText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Content Text"
/>
<Button
android:id="@+id/notify_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Notify"
/>
<Button
android:id="@+id/clear_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Clear"
/>
</LinearLayout>
</pre><b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>NotificationTest4a</td></tr>
<tr><td>アプリケーション名:</td><td>NotificationTest4a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.NotificationTest4a</td></tr>
<tr><td>アクティビティーの作成:</td><td>NotificationTest4aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<br />
「Notify」と「Ongoing」を通知します。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDom7sIeqSeoIS6ZNKRaJesp1ZVpA2zczIKEPzUGxigdgkmDasBlBjfCjvy7s9peeVi0fmWr32YySo8o-dBmo2xIL_8V_aGv-6TbXdBbBrn93A24XuHspyAsJ8eOEt9kqT8u3TXcfWB3GT/s1600/NotificationTest4a-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDom7sIeqSeoIS6ZNKRaJesp1ZVpA2zczIKEPzUGxigdgkmDasBlBjfCjvy7s9peeVi0fmWr32YySo8o-dBmo2xIL_8V_aGv-6TbXdBbBrn93A24XuHspyAsJ8eOEt9kqT8u3TXcfWB3GT/s320/NotificationTest4a-1.png" width="192" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHbR18y4P9HEKQi-eWv4Wus0uLqo6BJns7qtkImklHz5kMaIC5D19SHTF92HCUN-EaFhyphenhyphenVrglUh6333RrMnSzgbA1EABwJC4H-YVXwVVK3Lx2j4x502N1GQjKBuMoA-v5pRTWZkRAyC7qM/s1600/NotificationTest4a-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHbR18y4P9HEKQi-eWv4Wus0uLqo6BJns7qtkImklHz5kMaIC5D19SHTF92HCUN-EaFhyphenhyphenVrglUh6333RrMnSzgbA1EABwJC4H-YVXwVVK3Lx2j4x502N1GQjKBuMoA-v5pRTWZkRAyC7qM/s320/NotificationTest4a-2.png" width="192" /></a></div><br />
通知エリアを開くと両方表示されています。まず「*** Ongoing ***」をタップすると、「実行中」の通知が消えました。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXOkr8448PbfBY2KocO82e3AHqWRw0PrE1Ac5rf2wjo0pKhyphenhypheni3Imiek_LSc4RtAZsN0OYJzoD57xNytMp16VKW66q8r0GijEg2z6yt6URuxmtIKZy9UrKVnpqmFHiHQWXmGftx2GBGXyAc/s1600/NotificationTest4a-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXOkr8448PbfBY2KocO82e3AHqWRw0PrE1Ac5rf2wjo0pKhyphenhypheni3Imiek_LSc4RtAZsN0OYJzoD57xNytMp16VKW66q8r0GijEg2z6yt6URuxmtIKZy9UrKVnpqmFHiHQWXmGftx2GBGXyAc/s320/NotificationTest4a-3.png" width="192" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd7zvOwm3Q8X8iHMQ3cFG3wk5jSSnGnqnWuQjRleaczxgNpkzmM7l0Oc8r1rq1c79YXo1zWD6yw1KgkmN17vNc9rzoNsclDouQg0zrdpuffKLGYgxDpen19dd12wNEse1xCMjFJKcAAU_o/s1600/NotificationTest4a-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd7zvOwm3Q8X8iHMQ3cFG3wk5jSSnGnqnWuQjRleaczxgNpkzmM7l0Oc8r1rq1c79YXo1zWD6yw1KgkmN17vNc9rzoNsclDouQg0zrdpuffKLGYgxDpen19dd12wNEse1xCMjFJKcAAU_o/s320/NotificationTest4a-4.png" width="192" /></a></div><br />
引き続き「*** Notify ***」をタップすると、こちらの通知も消えました。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhqOZJZYJfZgLnIvHYOx4zvwG66Cql1wVxgqekpBE2he9r1bAfChqrGGnGSN7dLbEsbRaiYUmKtiIwhkHt1JreiSieBG3FVHUhjSn88eOhBm1UB3l-7gjEpMC2Frciu1FNPDxEZRDeneUe/s1600/NotificationTest4a-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhqOZJZYJfZgLnIvHYOx4zvwG66Cql1wVxgqekpBE2he9r1bAfChqrGGnGSN7dLbEsbRaiYUmKtiIwhkHt1JreiSieBG3FVHUhjSn88eOhBm1UB3l-7gjEpMC2Frciu1FNPDxEZRDeneUe/s320/NotificationTest4a-5.png" width="192" /></a></div><br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-3079717744389049432012-09-18T13:27:00.000+09:002012-10-16T23:55:48.105+09:00通知(Notification) #3 (実行中/キャンセル)Notificationは、実行結果を「通知」する以外に、「実行中」であることを示すこともできます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJez_aD8d9xer88BA9WCDuDJ64UhWzHu1Q55LclHbeNbsI4hzwOY8JEQutzu1NGNURWBST91jMKmRprIxDNq44qjkYJW8e0AkF0oB8nKSutynP6JSY9Gv_smYcCP_AyYHu8cylN854YaT-/s1600/NotificationTest3a-0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJez_aD8d9xer88BA9WCDuDJ64UhWzHu1Q55LclHbeNbsI4hzwOY8JEQutzu1NGNURWBST91jMKmRprIxDNq44qjkYJW8e0AkF0oB8nKSutynP6JSY9Gv_smYcCP_AyYHu8cylN854YaT-/s320/NotificationTest3a-0.png" width="320" /></a></div>これはAndroid 2.2英語版での例です。"Ongoing"が「実行中」、"Notifications"が「通知」です。<br />
<a name='more'></a><br />
<hr size="1" /><span style="color: orange;">◆</span> 通知(Notification) #3 (実行中/キャンセル)<br />
<br />
<a href="http://triware.blogspot.jp/2012/09/notification-2.html">前回</a>のサンプルではラジオボタンを使って通知のIDを変更しました。今回はそれに加えて通知の種類も変えてみましょう。<br />
<br />
これまで通知を削除する方法は説明しませんでしたが、通知エリアの「Clear」ボタンで消すことができます。当然プログラム内からも削除できます。アプリケーションで通知を消すための「Clear」ボタンも今回のサンプルに追加します。<br />
<br />
<b>NotificationTest3aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.NotificationTest3a;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
public class NotificationTest3aActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final NotificationManager notifMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
final EditText etTickerText = (EditText)findViewById(R.id.tickerText_et);
final EditText etContentText = (EditText)findViewById(R.id.contentText_et);
final RadioGroup rgSelect = (RadioGroup)findViewById(R.id.group_rg);
// Notifyボタン
Button btnNotify = (Button)findViewById(R.id.notify_btn);
btnNotify.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// ステータスバーと通知エリアに表示する内容をセット
int icon = R.drawable.ic_launcher; // アイコン
String tickerText = etTickerText.getText().toString(); // テキスト(ステータスバー)
long when = System.currentTimeMillis(); // 時刻
Notification notif = new Notification(icon, tickerText, when);
// ラジオボタンのIDを通知のIDとして使用する
int id = rgSelect.getCheckedRadioButtonId();
if (id == R.id.select2_rb) {
notif.flags |= Notification.FLAG_ONGOING_EVENT; // 「実行中」
}
// 通知エリアに表示する内容をセット
String contentTitle = getString(R.string.app_name); // タイトル
String contentText = etContentText.getText().toString(); // 通知メッセージ
Intent intent = null; // タップ時の処理(今回は何もしない)
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
notif.setLatestEventInfo(getApplicationContext(), contentTitle, contentText, contentIntent);
// 通知
notifMgr.notify(id, notif);
}
});
// Clearボタン
Button btnClear = (Button)findViewById(R.id.clear_btn);
btnClear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// ID取得
int id = rgSelect.getCheckedRadioButtonId();
// キャンセル
notifMgr.cancel(id);
}
});
}
}
</pre><br />
前回とほとんど同じですが、「Ongoing」ボタンがクリックされた場合はNotificationのフラグを変更しています(39-41行目)。<br />
また、「Clear」ボタンがクリックされたときは、NotificationManagerのcancel()メソッドを呼び出しています(64行目)。通知のIDとしてラジオボタンのリソースIDを使っていますので、cancel()メソッドの引数で渡すIDはラジオボタンのリソースIDとなります。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<RadioGroup
android:id="@+id/group_rg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<RadioButton
android:id="@+id/select1_rb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Notify"
android:checked="true"
/>
<RadioButton
android:id="@+id/select2_rb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ongoing"
/>
</RadioGroup>
<EditText
android:id="@+id/tickerText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Ticker Text"
/>
<EditText
android:id="@+id/contentText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Content Text"
/>
<Button
android:id="@+id/notify_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Notify"
/>
<Button
android:id="@+id/clear_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Clear"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>NotificationTest3a</td></tr>
<tr><td>アプリケーション名:</td><td>NotificationTest3a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.NotificationTest3a</td></tr>
<tr><td>アクティビティーの作成:</td><td>NotificationTest3aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<br />
アプリケーション起動直後の画面です。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOTtKun2e1Ewd6aO9UTcYyHr9V1QBs5PEiyaWsbVhwSbQlR5ZhfgbT7F-mTcFPIGtyStJeDZLKvGt05pQKswIuXWhfMVwqD4AioLYcFZYJ-R6YVoxJonAaWcbf-4IseNwKuk9xFjconxM4/s1600/NotificationTest3a-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOTtKun2e1Ewd6aO9UTcYyHr9V1QBs5PEiyaWsbVhwSbQlR5ZhfgbT7F-mTcFPIGtyStJeDZLKvGt05pQKswIuXWhfMVwqD4AioLYcFZYJ-R6YVoxJonAaWcbf-4IseNwKuk9xFjconxM4/s320/NotificationTest3a-1.png" width="192" /></a></div><br />
最初に「Notify」のラジオボタンを選択、テキストを入力して、「Notify」ボタンを押して・・・<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjx7J2ey5CT6xEVn6mJgALtx2AuuQ3P9QSs9FTjpaf6Ps7glTUy18J9iEADre0_Yayb_AG3rikAjXav9lZmBzydLzlx2j-cG1uzlpP-D7EK76bbDIbQ_sMOrsK6xVKq2-0IQmypnsfKAl3/s1600/NotificationTest3a-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjx7J2ey5CT6xEVn6mJgALtx2AuuQ3P9QSs9FTjpaf6Ps7glTUy18J9iEADre0_Yayb_AG3rikAjXav9lZmBzydLzlx2j-cG1uzlpP-D7EK76bbDIbQ_sMOrsK6xVKq2-0IQmypnsfKAl3/s320/NotificationTest3a-2.png" width="192" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4IYX6rdSHV1BLU4FMhCo9J0Q86KFbeNLlfsXt8T7Hehu-runHS9LiRkNs-Ej3usN9GmhR_GAGlGUOUZRdoUFy3AQ8cCFsAydnpDduZmaQOb__rpJfF3KJ9_V8kTV5ATWJBbGQ0l7vYb7L/s1600/NotificationTest3a-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4IYX6rdSHV1BLU4FMhCo9J0Q86KFbeNLlfsXt8T7Hehu-runHS9LiRkNs-Ej3usN9GmhR_GAGlGUOUZRdoUFy3AQ8cCFsAydnpDduZmaQOb__rpJfF3KJ9_V8kTV5ATWJBbGQ0l7vYb7L/s320/NotificationTest3a-3.png" width="192" /></a></div><br />
通知エリアを確認します。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvF-0z48HffLmPCdp-CtdFIsPlZ8JgOgCuprZAvyqYF6NMlowgk5tVq2iWRFbgZcgA13Fb3MM5CuJLRWMWQZUt0y_plRvgwM2EYesULa5apKb-nEc1MAhlSr6Jt8xrGAZfLFERefQwgtrC/s1600/NotificationTest3a-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvF-0z48HffLmPCdp-CtdFIsPlZ8JgOgCuprZAvyqYF6NMlowgk5tVq2iWRFbgZcgA13Fb3MM5CuJLRWMWQZUt0y_plRvgwM2EYesULa5apKb-nEc1MAhlSr6Jt8xrGAZfLFERefQwgtrC/s320/NotificationTest3a-4.png" width="192" /></a></div><br />
次は「Ongoing」のラジオボタンを選んで、テキストを入力、そして「Notify」ボタンを押します。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuI0rD2EojrFn1MFPK4Z2cdACL960ctRpPHrj0QCzu0LhSZHsOKRVnwt7KX_pq7ukUa6i5ivbdutWnwZjAUmAP0UR3kk5vJmzzKpiJ0k0oPxGHkDXYuMBeMA5V-KFsfiTxERYrZ_O9SwN4/s1600/NotificationTest3a-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuI0rD2EojrFn1MFPK4Z2cdACL960ctRpPHrj0QCzu0LhSZHsOKRVnwt7KX_pq7ukUa6i5ivbdutWnwZjAUmAP0UR3kk5vJmzzKpiJ0k0oPxGHkDXYuMBeMA5V-KFsfiTxERYrZ_O9SwN4/s320/NotificationTest3a-5.png" width="192" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivLqNY5e1x9NKGQwH_iDD5EuJEVDbHfu8y4z1GWsKUlxzxMvh-5E8Ylbkw3D4DQx_iUTBgDeTByT-e5E_Rz9E3rYCBdeqQ265o69woMYiimkbRUCgKhySHk0E2uXUFm4FrKbBnQAY3RhlU/s1600/NotificationTest3a-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivLqNY5e1x9NKGQwH_iDD5EuJEVDbHfu8y4z1GWsKUlxzxMvh-5E8Ylbkw3D4DQx_iUTBgDeTByT-e5E_Rz9E3rYCBdeqQ265o69woMYiimkbRUCgKhySHk0E2uXUFm4FrKbBnQAY3RhlU/s320/NotificationTest3a-6.png" width="192" /></a></div><br />
通知エリアを見ると、「実行中」を示す「Ongoing」のエリアが表示されていますね。ここで「Clear」ボタンを押してみましょう。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7QgVy0tocVb9GJ5hMWnXv3m4VtGAhtCJIykfercy_uxOhseFzQ9XRt2fb_wGyb66nXM8Uexer5S5ouKyXbN34kEJVb5hUhjALYMZT_Cj3d30xQb9zQcLmMIj6osGCxIQbuLCiA9y9USDC/s1600/NotificationTest3a-7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7QgVy0tocVb9GJ5hMWnXv3m4VtGAhtCJIykfercy_uxOhseFzQ9XRt2fb_wGyb66nXM8Uexer5S5ouKyXbN34kEJVb5hUhjALYMZT_Cj3d30xQb9zQcLmMIj6osGCxIQbuLCiA9y9USDC/s320/NotificationTest3a-7.png" width="192" /></a></div><br />
通知エリアが消えて、サンプルアプリが表示されますので、もう一度通知エリアを見てみます。すると「Notifications」は消えていますが「Ongoing」は残ったままですね。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4ziW5B_VpXrkpwXvL80OHjSYqi2788TXXbp0wCMYLS3ujmoMyFYnODIj8KMW7KAtIAN8VrJ1Q7DajBpvStPmbPIWTDM50-8dlHkN0OgZv19sSzbhTl_4hnnus-rzVXmDSy860cwhEn9Ev/s1600/NotificationTest3a-8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4ziW5B_VpXrkpwXvL80OHjSYqi2788TXXbp0wCMYLS3ujmoMyFYnODIj8KMW7KAtIAN8VrJ1Q7DajBpvStPmbPIWTDM50-8dlHkN0OgZv19sSzbhTl_4hnnus-rzVXmDSy860cwhEn9Ev/s320/NotificationTest3a-8.png" width="192" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrv7ycOwtQRONsV9i6VRswOZDFhbcBngXjjHt5Or-0aj3s9OHEgm9apLY0WV4NjSlRlXEhFTrIHtK1gTIy1M95swuuG8dbvch9YKkgfvEwEbl9LmCGSt-kDfZgqn8Zw9NkJRhc1bnofwaQ/s1600/NotificationTest3a-9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrv7ycOwtQRONsV9i6VRswOZDFhbcBngXjjHt5Or-0aj3s9OHEgm9apLY0WV4NjSlRlXEhFTrIHtK1gTIy1M95swuuG8dbvch9YKkgfvEwEbl9LmCGSt-kDfZgqn8Zw9NkJRhc1bnofwaQ/s320/NotificationTest3a-9.png" width="192" /></a></div><br />
アプリに戻って「Clear」ボタンを押すと(ラジオボタンは「Ongoing」のまま)ステータスバーのアイコンが消えて、通知エリアからも「Ongoing」が消えました。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBHDiYO4CKb_wUIrnoOFKp2R4W2_J9HQefZYGHNTplee2XP46KL4sfL9hNNrCcuUpHB_aHQ7xS1tIk59NrcAFzwKEzv7oG9cGYrZTHW1rOB8_zLvqwWWXaCJ6XIi6I_CzDMRYgoaqtoNnk/s1600/NotificationTest3a-10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBHDiYO4CKb_wUIrnoOFKp2R4W2_J9HQefZYGHNTplee2XP46KL4sfL9hNNrCcuUpHB_aHQ7xS1tIk59NrcAFzwKEzv7oG9cGYrZTHW1rOB8_zLvqwWWXaCJ6XIi6I_CzDMRYgoaqtoNnk/s320/NotificationTest3a-10.png" width="192" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisOEQCT15BwyKSZN-qksZ8ujRs4_SMgMIrePM7tpnRkTVnbNM1WQY9HrYSio9jCBYGIwDFJ0UZWiermjFytho1d0rWUi7AMwZhPLQBBtBMO5vQyaM-P2N3AuW2jm0YKz7ScIH4PnToAWSV/s1600/NotificationTest3a-11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisOEQCT15BwyKSZN-qksZ8ujRs4_SMgMIrePM7tpnRkTVnbNM1WQY9HrYSio9jCBYGIwDFJ0UZWiermjFytho1d0rWUi7AMwZhPLQBBtBMO5vQyaM-P2N3AuW2jm0YKz7ScIH4PnToAWSV/s320/NotificationTest3a-11.png" width="192" /></a></div><br />
Ongoing(実行中)だけでなく、Notifications(通知)もアプリから削除できることを確認しておきましょう。<br />
ラジオボタンは「Notify」を選びます。テキストを入力して、「Notify」ボタンを押します。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRwwoqsRBqDcY_11hw0Ez4o_gmDGrINB-gUXz5pJStl1wQJ1da9fbTl9Xl-ixWVrCXThKBdoCKV_A4qPkMkW0YQvajFrGxTsajp7Rb4tdETOmHwC5YfRV1TpxAfFDr0zp5iSG1sS5dwQnT/s1600/NotificationTest3a-12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRwwoqsRBqDcY_11hw0Ez4o_gmDGrINB-gUXz5pJStl1wQJ1da9fbTl9Xl-ixWVrCXThKBdoCKV_A4qPkMkW0YQvajFrGxTsajp7Rb4tdETOmHwC5YfRV1TpxAfFDr0zp5iSG1sS5dwQnT/s320/NotificationTest3a-12.png" width="192" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ5eInM7lW7LX1F9HMSJyjZ6ed_e6rXoUOOrRdKIAAeDvjD98vdc9ARkHNuuBhnswr8YOo7O3tbsFRsvzbwJYPDJt1Z_L7RFfcpMWONKT5MKcBGDr22F7V3bTbGxd7Lq41iNDGuhDvMMfU/s1600/NotificationTest3a-13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ5eInM7lW7LX1F9HMSJyjZ6ed_e6rXoUOOrRdKIAAeDvjD98vdc9ARkHNuuBhnswr8YOo7O3tbsFRsvzbwJYPDJt1Z_L7RFfcpMWONKT5MKcBGDr22F7V3bTbGxd7Lq41iNDGuhDvMMfU/s320/NotificationTest3a-13.png" width="192" /></a></div><br />
そしてサンプルアプリの「Clear」ボタンを押すと、ちゃんと「Notifications」も消えました。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje1O7JS1Z2x47vrB6r4IXDsOYTAyDrldvDao9c5aIKcwybcYnbs7yPfZ6cBvS5R7-XwTn7Qu717HH0HH17AK5lbCEn_EJ4gZBPjnBGY-nnvDSivCMabvVz_k4rP0KP-cHHxP7nmtDIYm2J/s1600/NotificationTest3a-14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje1O7JS1Z2x47vrB6r4IXDsOYTAyDrldvDao9c5aIKcwybcYnbs7yPfZ6cBvS5R7-XwTn7Qu717HH0HH17AK5lbCEn_EJ4gZBPjnBGY-nnvDSivCMabvVz_k4rP0KP-cHHxP7nmtDIYm2J/s320/NotificationTest3a-14.png" width="192" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyOhA_m4hoBYk2TgDm9_uRaOxOwYuOS6xf__eRpHmtlIAjajXnaqpfDiXpELJyhIzHDfBYcBETYxBSYzM7gQRXr56MdI8z2waAI3C635fTQ63lJc4_o1qN3r4KSaklvg7n95faaVntg_Gy/s1600/NotificationTest3a-15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyOhA_m4hoBYk2TgDm9_uRaOxOwYuOS6xf__eRpHmtlIAjajXnaqpfDiXpELJyhIzHDfBYcBETYxBSYzM7gQRXr56MdI8z2waAI3C635fTQ63lJc4_o1qN3r4KSaklvg7n95faaVntg_Gy/s320/NotificationTest3a-15.png" width="192" /></a></div><br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-81997690079662854632012-09-11T12:02:00.000+09:002012-10-16T23:55:55.698+09:00通知(Notification) #2<a href="http://triware.blogspot.jp/2012/09/notification.html">前回の記事</a>で、複数の通知について少しだけ触れました。今回はその確認をしてみましょう。<br />
<br />
通常はひとつのアプリケーションでは最新の通知だけを表示する場合が多いと思いますが、例えばGoogle Playのように、インストールやアップデートした結果をアプリケーションごとに表示したい場合は、複数の通知を行います。<br />
<br />
<hr size="1" /><span style="color: orange;">◆</span> 通知(Notification) #2<br />
<br />
複数の通知はIDをユニークにすれば可能です。以下のサンプルプログラムでは、2つの通知ができるように、IDを2種類用意します。どちらの通知を使うかは<a href="http://triware.blogspot.jp/2011/10/radiogroup-radiobutton.html">ラジオボタン</a>で選択して、通知のIDには選択したラジオボタンのリソースIDを流用します。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcj8jvQZF8VxfVgiqoFYRHvshgC3b-Vxi789KWmj6M8Lskz1JKJTwnBWPnBdbhjuWfJiSlGhtf3HRDjHe8RUD9S17w_DyJcIGmgHZFZPTbn6A7P8AW0d6Zf_FIwJ-zM7aqpjPKCq__KNN5/s1600/NotificationTest2a-0.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="254" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcj8jvQZF8VxfVgiqoFYRHvshgC3b-Vxi789KWmj6M8Lskz1JKJTwnBWPnBdbhjuWfJiSlGhtf3HRDjHe8RUD9S17w_DyJcIGmgHZFZPTbn6A7P8AW0d6Zf_FIwJ-zM7aqpjPKCq__KNN5/s320/NotificationTest2a-0.png" /></a></div><a name='more'></a><br />
<b>NotificationTest2aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.NotificationTest2a;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
public class NotificationTest2aActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final NotificationManager notifMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
final EditText etTickerText = (EditText)findViewById(R.id.tickerText_et);
final EditText etContentText = (EditText)findViewById(R.id.contentText_et);
final RadioGroup rgSelect = (RadioGroup)findViewById(R.id.group_rg);
Button btnNotify = (Button)findViewById(R.id.notify_btn);
btnNotify.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// ステータスバーと通知エリアに表示する内容をセット
int icon = R.drawable.ic_launcher; // アイコン
String tickerText = etTickerText.getText().toString(); // テキスト(ステータスバー)
long when = System.currentTimeMillis(); // 時刻
Notification notif = new Notification(icon, tickerText, when);
// ラジオボタンのIDを通知のIDとして使用する
int id = rgSelect.getCheckedRadioButtonId();
// 通知エリアに表示する内容をセット
String contentTitle = getString(R.string.app_name); // タイトル
String contentText = etContentText.getText().toString(); // 通知メッセージ
Intent intent = null; // タップ時の処理(今回は何もしない)
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
notif.setLatestEventInfo(getApplicationContext(), contentTitle, contentText, contentIntent);
// 通知
notifMgr.notify(id, notif);
}
});
}
}
</pre><br />
37行目で選択したラジオボタンのリソースIDを取得し、それを通知のIDとして使用しています(47行目)。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<RadioGroup
android:id="@+id/group_rg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<RadioButton
android:id="@+id/select1_rb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Notify #1"
android:checked="true"
/>
<RadioButton
android:id="@+id/select2_rb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Notify #2"
/>
</RadioGroup>
<EditText
android:id="@+id/tickerText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Ticker Text"
/>
<EditText
android:id="@+id/contentText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Content Text"
/>
<Button
android:id="@+id/notify_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Notify"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>NotificationTest2a</td></tr>
<tr><td>アプリケーション名:</td><td>NotificationTest2a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.NotificationTest2a</td></tr>
<tr><td>アクティビティーの作成:</td><td>NotificationTest2aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgymGvcThNzEHONTzpS-WAzqZ2rsjYTHXzH2mWCzTW8_MZzyTGZMwCaC-GDTOMO7pMZCagFa6vECzGRT06EgxtMWyiUknIe8F0VeuIC5p_e-yGpVo5z1R8mLItkfQSQ5qvlCDt-WvQbkY08/s1600/NotificationTest2a-1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgymGvcThNzEHONTzpS-WAzqZ2rsjYTHXzH2mWCzTW8_MZzyTGZMwCaC-GDTOMO7pMZCagFa6vECzGRT06EgxtMWyiUknIe8F0VeuIC5p_e-yGpVo5z1R8mLItkfQSQ5qvlCDt-WvQbkY08/s320/NotificationTest2a-1.png" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsQmGpmpboeIidZBgRwUwg66nuEjF1NA-7wSj74s54VKEzZ8902c2jJBWcGhlGaT3uI5xjaYhLg_cvxTx6bZYiDu1bdxtHBuvNiFL1dpNY3XgS7uvoJLV4I6Ozgo4aKrHs_XkP9Hnn2gWP/s1600/NotificationTest2a-2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsQmGpmpboeIidZBgRwUwg66nuEjF1NA-7wSj74s54VKEzZ8902c2jJBWcGhlGaT3uI5xjaYhLg_cvxTx6bZYiDu1bdxtHBuvNiFL1dpNY3XgS7uvoJLV4I6Ozgo4aKrHs_XkP9Hnn2gWP/s320/NotificationTest2a-2.png" /></a></div>まず、「Notify #1」を選択して、テキストを入力します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizlkAFQzpM8OrJXXWz5EHC_w2pZjf9JQHeU_XaVYMH15R1F904XDUyRvQZnAC4quOFzbeYcyimDr_BsMviUTwcPZ6YkRexn7jRcX2sCzQ8umlglhP3fD2MHdeyT3nxq97KthPbsHPqaYDC/s1600/NotificationTest2a-3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizlkAFQzpM8OrJXXWz5EHC_w2pZjf9JQHeU_XaVYMH15R1F904XDUyRvQZnAC4quOFzbeYcyimDr_BsMviUTwcPZ6YkRexn7jRcX2sCzQ8umlglhP3fD2MHdeyT3nxq97KthPbsHPqaYDC/s320/NotificationTest2a-3.png" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKn4UWYRlhcZtzQWFOX1nb_EFhp5J0615Ptk4fObwvuPIXlpUp7FZnduBbIkTP2TZ8MFXpuGZ_9Jg_Fg8nxrGX1sMzOz0yTmmohAFPSRneXCuY1u7QWFXgR3IlVf-5fwx_mnJDyrg89KJu/s1600/NotificationTest2a-4.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKn4UWYRlhcZtzQWFOX1nb_EFhp5J0615Ptk4fObwvuPIXlpUp7FZnduBbIkTP2TZ8MFXpuGZ_9Jg_Fg8nxrGX1sMzOz0yTmmohAFPSRneXCuY1u7QWFXgR3IlVf-5fwx_mnJDyrg89KJu/s320/NotificationTest2a-4.png" /></a></div>Notifyボタンで通知します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijtI2obwKZUj0qoB1EnhEAF3ejz_4zY-3VIUbImkebQzqMoTAGINSlyzg28znqknvzdMFFS0qdc0Gul9AfHWai5ykrIZWSpykDdisscgAkJI6Hw7VO52DxHDpyMR-YtWYvFuQ0Y9lxiwqi/s1600/NotificationTest2a-5.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijtI2obwKZUj0qoB1EnhEAF3ejz_4zY-3VIUbImkebQzqMoTAGINSlyzg28znqknvzdMFFS0qdc0Gul9AfHWai5ykrIZWSpykDdisscgAkJI6Hw7VO52DxHDpyMR-YtWYvFuQ0Y9lxiwqi/s320/NotificationTest2a-5.png" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYjlUSoXEmqldg1DN0xGhW52XD_iOUBC2GlNETWMfHj5L1BSQx21YkUYe_Yh50Pj8Ys6oihzVg41yF7iEijjOGYXcLooEECwiZ7PUYMFTHBhol5h4ICRkUDjrw4LUkBnRbJjpnQQ7fEdtw/s1600/NotificationTest2a-6.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYjlUSoXEmqldg1DN0xGhW52XD_iOUBC2GlNETWMfHj5L1BSQx21YkUYe_Yh50Pj8Ys6oihzVg41yF7iEijjOGYXcLooEECwiZ7PUYMFTHBhol5h4ICRkUDjrw4LUkBnRbJjpnQQ7fEdtw/s320/NotificationTest2a-6.png" /></a></div>次に「Notify #2」を選択して、テキストを入力したあと、Notifyボタンで通知します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcw0oF4L_b_d1RyHUgmi9LL1xV0mIA1h72bHcqPytcy48RirCyy8ZvsJr1Ea2AQHCo-Ft8_uSRQ20QIAihTTlOy-GlOztvXDfQOUjCL-S-TGC3lv71uk8plvLU6Aibv07_RjOnMZdqVgfk/s1600/NotificationTest2a-7.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcw0oF4L_b_d1RyHUgmi9LL1xV0mIA1h72bHcqPytcy48RirCyy8ZvsJr1Ea2AQHCo-Ft8_uSRQ20QIAihTTlOy-GlOztvXDfQOUjCL-S-TGC3lv71uk8plvLU6Aibv07_RjOnMZdqVgfk/s320/NotificationTest2a-7.png" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCy5o7DhR35glag958xleMOREKTsn_nUQ3RlPRpFr1k5tp_HzpDqb2JjSew7D7YKL29CSgjbTn-_qtPZgOTcE43PVaTc-5oD86AKv0Snh6b37vOrfGFjxfgxTt1kOPs4rTkd6TfNbFuhq3/s1600/NotificationTest2a-8.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCy5o7DhR35glag958xleMOREKTsn_nUQ3RlPRpFr1k5tp_HzpDqb2JjSew7D7YKL29CSgjbTn-_qtPZgOTcE43PVaTc-5oD86AKv0Snh6b37vOrfGFjxfgxTt1kOPs4rTkd6TfNbFuhq3/s320/NotificationTest2a-8.png" /></a></div>ステータスバーにはアイコンが2つ並び、通知エリアには通知が2つ表示されます。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-35444466282196245292012-09-03T18:37:00.002+09:002012-10-16T23:56:04.985+09:00通知(Notification)ステータスバーや通知エリアに通知を表示するには、NofiticationクラスとNotificationManagerクラスを使います。<br />
<br />
<hr size="1" /><span style="color: orange;">◆</span> 通知(Notification)<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYs7YbLfk6Nyqs5Jq48wmsSx8qxH_RWZk1KVh3f4i5hGe7Kz5hQ0Rt2JtpQw9vpOkL_UOws7XOnaAcCeADRQzJKgfygHsHXbMmKru8CluHV4lwqAwIAoQ1eNwNJMAiOTMxCmFCx5L3OT9X/s1600/NotificationTest1a-0.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="163" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYs7YbLfk6Nyqs5Jq48wmsSx8qxH_RWZk1KVh3f4i5hGe7Kz5hQ0Rt2JtpQw9vpOkL_UOws7XOnaAcCeADRQzJKgfygHsHXbMmKru8CluHV4lwqAwIAoQ1eNwNJMAiOTMxCmFCx5L3OT9X/s320/NotificationTest1a-0.png" /></a></div>以下は、入力したテキストを通知するサンプルプログラムです。<br />
<a name='more'></a><br />
<b>NotificationTest1aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.NotificationTest1a;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class NotificationTest1aActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final NotificationManager notifMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
final EditText etTickerText = (EditText)findViewById(R.id.tickerText_et);
final EditText etContentText = (EditText)findViewById(R.id.contentText_et);
Button btnNotify = (Button)findViewById(R.id.notify_btn);
btnNotify.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// ステータスバーと通知エリアに表示する内容をセット
int icon = R.drawable.ic_launcher; // アイコン
String tickerText = etTickerText.getText().toString(); // テキスト(ステータスバー)
long when = System.currentTimeMillis(); // 時刻
Notification notif = new Notification(icon, tickerText, when);
// 通知エリアに表示する内容をセット
String contentTitle = getString(R.string.app_name); // タイトル
String contentText = etContentText.getText().toString(); // 通知メッセージ
Intent intent = null; // タップ時の処理(今回は何もしない)
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
notif.setLatestEventInfo(getApplicationContext(), contentTitle, contentText, contentIntent);
// 通知
notifMgr.notify(R.string.app_name, notif);
}
});
}
}
</pre><br />
20行目のgetSystemService()で通知サービスのインスタンスを取得します。<br />
<br />
28~31行目は、ステータスバーや通知エリアに表示する内容(アイコン、ティッカー文字列、通知時刻)を設定します。ティッカー文字列は、通知した際にステータスバーの表示領域に短時間表示される文字列です。<br />
<br />
34~38行目で、タイトル(アプリ名称)や通知内容(メッセージ)を設定します。通知エリアに表示される内容です。通知エリアをタップした際に別のアクティビティを呼び出す場合はインテントにセットしますが、今回は何も実行しませんのでintent = nullとします。<br />
<br />
41行目のnotify()で通知します。第1引数はIDです。このIDを固定にすることで、通知が複数回行われても、最後のものだけを表示できるようになります。逆に、同じアプリで複数種類の通知を表示させたい場合はIDを変更します。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<EditText
android:id="@+id/tickerText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Ticker Text"
/>
<EditText
android:id="@+id/contentText_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Content Text"
/>
<Button
android:id="@+id/notify_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Notify"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>NotificationTest1a</td></tr>
<tr><td>アプリケーション名:</td><td>NotificationTest1a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.NotificationTest1a</td></tr>
<tr><td>アクティビティーの作成:</td><td>NotificationTest1aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDrZx0ohCwHfO8XB-PpfUZRXlsacXNeT8boGpSfoLDM4cS5JwqZ19ZVNWzPuUt6zFhC4oo5TgziQsffYa_Glzg1vK4btq17xlt_79cYWA9ifaNWzYKxVIzavSb8epBA_oBUU287VO7Ibxy/s1600/NotificationTest1a-1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDrZx0ohCwHfO8XB-PpfUZRXlsacXNeT8boGpSfoLDM4cS5JwqZ19ZVNWzPuUt6zFhC4oo5TgziQsffYa_Glzg1vK4btq17xlt_79cYWA9ifaNWzYKxVIzavSb8epBA_oBUU287VO7Ibxy/s320/NotificationTest1a-1.png" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOYtrb7C6gm5-TbdjUVaRkviFcJ7k8e3yNGHQn24rSzMZ4feQuIucO8Z3Va8tXhALgLWFbiQJtjvm9AwzsktvwODXMu9z0xBItKwWsm30bhrfuFiTFDwgrwbmeINCBpQfhSm7cTiGkAVOa/s1600/NotificationTest1a-2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOYtrb7C6gm5-TbdjUVaRkviFcJ7k8e3yNGHQn24rSzMZ4feQuIucO8Z3Va8tXhALgLWFbiQJtjvm9AwzsktvwODXMu9z0xBItKwWsm30bhrfuFiTFDwgrwbmeINCBpQfhSm7cTiGkAVOa/s320/NotificationTest1a-2.png" /></a></div>アプリを起動して、メッセージを入力します。上の入力欄はステータスバーに表示するテキスト、下の入力欄は通知エリアに表示するテキストです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVHTeqbM4XhUNgnknDFdbAzjg5ZGuocjyIlAuUO2vOntoA4VVJSyHzqB1AT7G7FGo6dEEYYhKODA0CG8i5TQ70BPLioioqlsj1UCf7cZT1uD4dEJSuAN7o9KDhAUKMrKKVlIA0Lsm_fNpV/s1600/NotificationTest1a-3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVHTeqbM4XhUNgnknDFdbAzjg5ZGuocjyIlAuUO2vOntoA4VVJSyHzqB1AT7G7FGo6dEEYYhKODA0CG8i5TQ70BPLioioqlsj1UCf7cZT1uD4dEJSuAN7o9KDhAUKMrKKVlIA0Lsm_fNpV/s320/NotificationTest1a-3.png" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFUfp4DQqZ6RHyCC9mhC-goBKO3baMIc1B3x5ynz6qmj3fHkfuiJlqZ4HRwtK-eJj8p0Aj7Ws2cP0AJBl5lv537m_ILwyYN059SCx4VJHy9ags6GKrTyPo7N2-YDLn2UxCI2SBfbjyXF7d/s1600/NotificationTest1a-4.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFUfp4DQqZ6RHyCC9mhC-goBKO3baMIc1B3x5ynz6qmj3fHkfuiJlqZ4HRwtK-eJj8p0Aj7Ws2cP0AJBl5lv537m_ILwyYN059SCx4VJHy9ags6GKrTyPo7N2-YDLn2UxCI2SBfbjyXF7d/s320/NotificationTest1a-4.png" /></a></div>Notifyボタンをクリックすると、ステータスバーの領域にアイコンとメッセージを表示した後、ステータスバーの表示に戻ります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7WYgFXmenFUw6t4EpM9t_mMz5mQxz3cvWQsQsBy3mmzORbaUiqud5SncbkWx1AtT3DDlUFwLzerlQBG5JL-uDeaqzFMaz77fp_9fYoOtNuQkGEfOcGnpwID9-G52R-NKkMppp8S0nfura/s1600/NotificationTest1a-5.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7WYgFXmenFUw6t4EpM9t_mMz5mQxz3cvWQsQsBy3mmzORbaUiqud5SncbkWx1AtT3DDlUFwLzerlQBG5JL-uDeaqzFMaz77fp_9fYoOtNuQkGEfOcGnpwID9-G52R-NKkMppp8S0nfura/s320/NotificationTest1a-5.png" /></a></div>ステータスバーを下にドラッグすると、通知エリアが現れます。アイコンとタイトル(アプリ名)、通知内容、通知時刻が表示されています。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-29394484554730724152012-08-24T10:41:00.000+09:002012-10-16T23:59:49.992+09:00タイトルバー文字列の変更通常タイトルバーにはstrings.xml内のapp_nameに指定されている文字列(アプリケーション名)が表示されますが、この文字列の変更が可能です。今回はタイトルバーの文字列を一時的に変更してみることにします。<br />
<br />
<hr size="1" /><span style="color: orange;">◆</span> タイトルバー文字列の変更<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQJi9PQZwwsOqmk3pLbjGn7GPCZQ0FazuwrMnqumQfnvHhI9nizIgnUwmnak_FBXD91B-JHCs6fBtR88yCZJq-F495fJPjHfB6tbVQLMWiSro_EDDKkezmhA-IeGxuLpsoZr56WhYRpbAa/s1600/titlebar01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="62" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQJi9PQZwwsOqmk3pLbjGn7GPCZQ0FazuwrMnqumQfnvHhI9nizIgnUwmnak_FBXD91B-JHCs6fBtR88yCZJq-F495fJPjHfB6tbVQLMWiSro_EDDKkezmhA-IeGxuLpsoZr56WhYRpbAa/s200/titlebar01.png" width="200" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><br />
<br />
サンプルプログラムは<a href="http://triware.blogspot.jp/2012/08/blog-post.html">「タイトルバーにプログレス(バー)の表示」</a>で作成したプログラムをもとに作成します。当該プログラムではタイトルバーにプログレスバーを表示しますが、その間にタイトルバー文字列の後に続けて進捗率を示すパーセンテージを表示します。<br />
<br />
<a name='more'></a><br />
<b>TitleBarStringTest1aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.TitleBarStringTest1a;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;
public class TitleBarStringTest1aActivity extends Activity {
// プログレスバーの更新周期(100)から増分値を設定
private static final int prograssPeriod = (Window.PROGRESS_END - Window.PROGRESS_START) / 100;
private int progressUpdate;
private int percentage;
private CharSequence titleString;
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// タイトルバーにプログレスバーを設定する
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main);
handler = new Handler();
Button btnStart = (Button)findViewById(R.id.start_btn);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
progressUpdate = 0;
// タイトル文字列の保存
titleString = getTitle();
// プログレスバー表示開始
setProgressBarVisibility(true);
Toast.makeText(getApplicationContext(), "Processing....", Toast.LENGTH_LONG).show();
// プログレスバー表示中の処理(別スレッドで実行)
(new Thread(runnable)).start();
}
});
}
// 10秒後にダイアログを閉じる
private Runnable runnable = new Runnable() {
@Override
public void run() {
for (percentage = 1; percentage <= 100; percentage ++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
;
}
// プログレスバーの進捗率計算
progressUpdate += prograssPeriod;
handler.post(new Runnable() {
public void run() {
// プログレスバーを更新する
setProgress(progressUpdate);
// 進捗率をタイトルバーに表示する
setTitle(titleString + " " + Integer.toString(percentage) + "%");
}
});
}
handler.post(new Runnable() {
public void run() {
// タイトルバーを元に戻す
setTitle(titleString);
// プログレスバー表示終了
setProgressBarVisibility(false);
Toast.makeText(getApplicationContext(), "Done.", Toast.LENGTH_SHORT).show();
}
});
}
};
}
</pre><br />
プログレスを10秒間表示して終了することにします。プログレスの進捗状況の更新は100ms毎に100回行うことによって0~100%までを表します。<br />
<br />
先ず、現在のタイトルバーの文字列を取得します。35行目のgetTitle();でこの処理を行っています。<br />
<br />
処理中に進捗率を数値で表示している箇所が67行目setTitle(titleString + ...);です。今回のサンプルプログラムではプログレスバーの更新回数が100回なので、このカウンタをパーセンテージとして表示しています。<br />
※パーセンテージの表示位置は動作確認に使用した機種(MEDIAS N-04C)で調整しています。実際のアプリケーションに組み込む場合は表示方法に工夫が必要です。<br />
<br />
処理が終了してタイトルバーの文字列を元に戻しているのは、75行目のsetTitle(titleString);です。<br />
<br />
画面レイアウトは<a href="http://triware.blogspot.jp/2012/08/blog-post.html">「タイトルバーにプログレス(バー)の表示」</a>のレイアウトと同じです。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/start_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start ProgressBar on TitleBar"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>TitleBarStringTest1a</td></tr>
<tr><td>アプリケーション名:</td><td>TitleBarStringTest1a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.TitleBarStringTest1a</td></tr>
<tr><td>アクティビティーの作成:</td><td>TitleBarStringTest1aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<b><br />
</b> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxZdhWdeZCPqHm4Vfa9JKKAErGeQDy29bT_70iQAuNJelr6sf8jX_C5H8Fiwnvpt5o5C9RvPwzPMuS2HoxBiN0zQf4lp1H24PSqFvDuHl7epBxLWdJ451kihT9yOsncqqmaPedxcpDR2xc/s1600/picture01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxZdhWdeZCPqHm4Vfa9JKKAErGeQDy29bT_70iQAuNJelr6sf8jX_C5H8Fiwnvpt5o5C9RvPwzPMuS2HoxBiN0zQf4lp1H24PSqFvDuHl7epBxLWdJ451kihT9yOsncqqmaPedxcpDR2xc/s320/picture01.png" width="180" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRUVBuk680LvJa2jXw2fbGztXpo_bC6y99ymdUn1W-gMdFxdVEX3MyX0Kby_bpdgwYAHo2513c5rUME9XF5EbbDP4LjgfDUuc-Hpdbb_NQipkXL-T0Byh0-RvS8v3zgPTA7JcT0SxHHEY6/s1600/picture02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRUVBuk680LvJa2jXw2fbGztXpo_bC6y99ymdUn1W-gMdFxdVEX3MyX0Kby_bpdgwYAHo2513c5rUME9XF5EbbDP4LjgfDUuc-Hpdbb_NQipkXL-T0Byh0-RvS8v3zgPTA7JcT0SxHHEY6/s320/picture02.png" width="180" /></a></div><br />
プログレス表示中、タイトルバーに数値で進捗率が表示されます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7AuP0kTxQQbFKGy_fgA0dszu9xjN9iivK4UOzU8ijBKwhu_neHedzQ9KWtC4aU34ef0TKItS0BYgXYnjOB9u3qsZStReh6pnpxmlOJNIrGHorVf1BPJtMVC25y6e-iLDxCoJaH-RtjMBT/s1600/picture03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7AuP0kTxQQbFKGy_fgA0dszu9xjN9iivK4UOzU8ijBKwhu_neHedzQ9KWtC4aU34ef0TKItS0BYgXYnjOB9u3qsZStReh6pnpxmlOJNIrGHorVf1BPJtMVC25y6e-iLDxCoJaH-RtjMBT/s320/picture03.png" width="180" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><br />
10秒間待つとプログレスバーがフェードアウトして消えます。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-46673610525953322852012-08-17T18:27:00.003+09:002012-10-16T23:59:34.983+09:00タイトルバーにプログレス(縞模様バー)の表示タイトルバーへのプログレス表示の初回タイトルバーにプログレス(円)の表示で、時間や処理量が不確定の場合の表示に使用するサンプルを紹介しましたが、この場合の表示としてもう一つ別の表現方法があります。<br />
同様にタイトルバーに表示を行うのですが、円ではなく縞模様のバーで表示する方法です。<br />
<br />
<hr size="1" /><span style="color: orange;">◆</span> プログレス(縞模様バー)の表示<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjofbgMbvPG96gu88BKk4j816aBGxdm8RXldYhS85Vsoq1sp3CxbfYDz7qaALM7g7GefBdFHYZjXDg2eEaFyCSDYjnFn3ryL5KgYr8VOgZiCbdH2KEcRcPMcydEre169dUAvvQAUdV-SMTK/s1600/titlebar04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjofbgMbvPG96gu88BKk4j816aBGxdm8RXldYhS85Vsoq1sp3CxbfYDz7qaALM7g7GefBdFHYZjXDg2eEaFyCSDYjnFn3ryL5KgYr8VOgZiCbdH2KEcRcPMcydEre169dUAvvQAUdV-SMTK/s200/titlebar04.png" width="200" /></a></div><br />
それではこのサンプルを作成してみましょう。<br />
<br />
<a name='more'></a><br />
<b>ProgressBarOnTitleBarTest1cActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ProgressBarOnTitleBarTest1c;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;
public class ProgressBarOnTitleBarTest1cActivity extends Activity {
// プログレスバーの更新周期(100)から増分値を設定
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// タイトルバーにプログレスバーを設定する
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main);
handler = new Handler();
Button btnStart = (Button)findViewById(R.id.start_btn);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// プログレスバー表示開始
setProgressBarVisibility(true);
// プログレスバーを縞模様バーに設定
setProgressBarIndeterminate(true);
Toast.makeText(getApplicationContext(), "Processing....", Toast.LENGTH_LONG).show();
// プログレスバー表示中の処理(別スレッドで実行)
(new Thread(runnable)).start();
}
});
}
// 10秒後にプログレスバーの表示を終了する
private Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i ++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
;
}
}
handler.post(new Runnable() {
public void run() {
// プログレスバー表示終了
setProgressBarVisibility(false);
setProgressBarIndeterminate(false);
Toast.makeText(getApplicationContext(), "Done.", Toast.LENGTH_SHORT).show();
}
});
}
};
}
</pre>時間あるいは処理量が未定のサンプルですが、他のサンプルと同様にプログレスバーを10秒間表示して終了することにします。<br />
<br />
最初に、タイトルバーにプログレスを設定している箇所が19行目です。<br />
requestWindowFeature(Window.FEATURE_PROGRESS);<br />
このAPIはsetContentView()の前に呼び出す必要があります。<br />
<br />
次に設定したプログレスを表示しているのが29行目です。<br />
setProgressBarVisibility(true);<br />
<br />
そしてその次の行がプログレスバーを縞模様にするAPIの呼び出しです。<br />
setProgressBarIndeterminate(true);<br />
<br />
処理が終了してプログレスの表示を消しているのは、55行目です。<br />
setProgressBarVisibility(false);<br />
<br />
そしてその次の行で縞模様の設定を解除しています。<br />
setProgressBarIndeterminate(false);<br />
<br />
<b>main.xml</b><br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/start_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start ProgressBar on TitleBar"
/>
</LinearLayout>
</pre><pre class="brush: xml"></pre><b>Androidプロジェクトの設定</b> <br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>ProgressBarOnTitleBarTest1c</td></tr>
<tr><td>アプリケーション名:</td><td>ProgressBarOnTitleBarTest1c</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.ProgressBarOnTitleBarTest1c</td></tr>
<tr><td>アクティビティーの作成:</td><td>ProgressBarOnTitleBarTest1cActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk_HXadntmNm6H8E8CPDx8c00fyd_PFUj0hCtYMjMrf8SKCmOgWnYDF7sohXk8w2_QRpqGHd7Zs3rpgRvo6kF9pniiR-5dxOSBU7Btye-UM-g2VRs43GcI4_mreVOgLK0i8pj31_RadM7o/s1600/picture01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk_HXadntmNm6H8E8CPDx8c00fyd_PFUj0hCtYMjMrf8SKCmOgWnYDF7sohXk8w2_QRpqGHd7Zs3rpgRvo6kF9pniiR-5dxOSBU7Btye-UM-g2VRs43GcI4_mreVOgLK0i8pj31_RadM7o/s320/picture01.png" width="179" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPPazdqPyF86RiYJ5XlhIUK6u-UJ09Uk8gM4VndwI50UX1D_SKLlGcjPzkUsL1lX3XQ5eZpXHAbtHCSrg9xl27tO4vK3nRtX5IcLnVB7BxmuCojn_lApI37nEkDHHronzAJYPsYQqtTYaj/s1600/picture02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPPazdqPyF86RiYJ5XlhIUK6u-UJ09Uk8gM4VndwI50UX1D_SKLlGcjPzkUsL1lX3XQ5eZpXHAbtHCSrg9xl27tO4vK3nRtX5IcLnVB7BxmuCojn_lApI37nEkDHHronzAJYPsYQqtTYaj/s320/picture02.png" width="179" /></a></div><br />
プログレス表示中、タイトルバーの上で縞模様のバーが表示されます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmfnQhOB0-U-5SEVPyRyPAJfq8-O0y5ev9GQVG4rwMyArrInVdoD4XOOFtBOXf237ygPInM3ajpJmvCdEc2RiKZmXrPnDUiyXq6eYdR4q8uJSbu3Mf0qtInd0C8CF_MbMudCSx5aFZR8NH/s1600/picture03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmfnQhOB0-U-5SEVPyRyPAJfq8-O0y5ev9GQVG4rwMyArrInVdoD4XOOFtBOXf237ygPInM3ajpJmvCdEc2RiKZmXrPnDUiyXq6eYdR4q8uJSbu3Mf0qtInd0C8CF_MbMudCSx5aFZR8NH/s320/picture03.png" width="179" /></a></div><br />
10秒間待つとプログレスの表示が消えます。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-14402659073461062282012-08-09T19:02:00.012+09:002012-10-16T23:59:24.369+09:00タイトルバーにプログレス(バー)の表示(セカンダリ)前回からの続きです。<br />
<br />
前回は進捗率を示して表示を行う「バー」のプログレスを紹介しました。こちらはセカンダリプログレスバーを使ったサンプルです。プログレスバーに加え、セカンダリプログレスバーを表示しています。先行して処理しているものの進捗状況について、セカンダリ値に指定すると、プログレスバーより薄めの色で進捗状況を表示します。<br />
<br />
<hr size="1" /><span style="color: orange;">◆</span> プログレス(バー)の表示(セカンダリ)<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHZL8ls6db49juIdRFPMK_zEv_2DMQ0edloaS3ykT3PjyULNcgfYz8bDQjsEKJ79lHBpQeIbFjua5lNiYbisYQCO7VIOJm-RWvnfWn24pU82B_FxfWavbltC4Yx0rQpQq1prvVcX78Ls-2/s1600/titlebar03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHZL8ls6db49juIdRFPMK_zEv_2DMQ0edloaS3ykT3PjyULNcgfYz8bDQjsEKJ79lHBpQeIbFjua5lNiYbisYQCO7VIOJm-RWvnfWn24pU82B_FxfWavbltC4Yx0rQpQq1prvVcX78Ls-2/s200/titlebar03.png" width="200" /></a></div><br />
<a name='more'></a><br />
<b>ProgressBarOnTitleBarTest1bActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ProgressBarOnTitleBarTest1b;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;
public class ProgressBarOnTitleBarTest1bActivity extends Activity {
// プログレスバーの更新周期(100)から増分値を設定
private static final int progressPeriod = (Window.PROGRESS_END - Window.PROGRESS_START) / 100;
private int progressUpdate;
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// タイトルバーにプログレスバーを設定する
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main);
handler = new Handler();
Button btnStart = (Button)findViewById(R.id.start_btn);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
progressUpdate = 0;
// プログレスバー表示開始
setProgressBarVisibility(true);
Toast.makeText(getApplicationContext(), "Processing....", Toast.LENGTH_LONG).show();
// プログレスバー表示中の処理(別スレッドで実行)
(new Thread(runnable)).start();
}
});
}
// 10秒後にプログレスバーの表示を終了する
private Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i ++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
;
}
// プログレスバーの進捗率計算
progressUpdate += progressPeriod;
handler.post(new Runnable() {
public void run() {
// セカンダリプログレスバーを更新する
setSecondaryProgress(progressUpdate * 2);
// プログレスバーを更新する
setProgress(progressUpdate);
}
});
}
handler.post(new Runnable() {
public void run() {
// プログレスバー表示終了
setProgressBarVisibility(false);
Toast.makeText(getApplicationContext(), "Done.", Toast.LENGTH_SHORT).show();
}
});
}
};
}
</pre><br />
基本的には、前回のブログ「タイトルバーにプログレス(バー)の表示」で紹介したコードと同じで、タイトルバーへのプログレスバー設定はrequestWindowFeature(Window.FEATURE_PROGRESS)、プログレスバーの表示はsetProgressBarVisibility(true)、プログレスバーの非表示がsetProgressBarVisibility(false)です。<br />
<br />
セカンダリプログレスバーは、先行して進む処理に割り当てます。これはセカンダリ部分の進捗を設定する処理を追加するのみで59行目で行っています。他の処理や注意事項なども前回と全く同様です。<br />
setSecondaryProgress(progressUpdate * 2);<br />
<br />
画面レイアウトも前回と同じです。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/start_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start ProgressBar on TitleBar"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b> <br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>ProgressBarOnTitleBarTest1b</td></tr>
<tr><td>アプリケーション名:</td><td>ProgressBarOnTitleBarTest1b</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.ProgressBarOnTitleBarTest1b</td></tr>
<tr><td>アクティビティーの作成:</td><td>ProgressBarOnTitleBarTest1bActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNS98NcfxkOuXVOCrztrA3-0ncweILfH6FwGjX6nXlPoiK_hxBn8B53vqmzRcUWNe058hrKk9ljH2_Q03hiL3KesiIDkxeH5h519bdJYdZowQ6ajgmPwsRTKAsYaGrPtLXxR6MHip2fKMD/s1600/picture01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNS98NcfxkOuXVOCrztrA3-0ncweILfH6FwGjX6nXlPoiK_hxBn8B53vqmzRcUWNe058hrKk9ljH2_Q03hiL3KesiIDkxeH5h519bdJYdZowQ6ajgmPwsRTKAsYaGrPtLXxR6MHip2fKMD/s320/picture01.png" width="179" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQo6-LDe1RuM-m49PyKisq0vVo5G68tK_m1p19Baqp83SU7zPQ6GlZK1zDQUY5UIgsPU5bjZwp-RsU8MUV9mVzYXZlvhfZpqGH-Ijz2pFlrg1NkGUmzkxF5y8Z96zmwyTRyWypi628-LVb/s1600/picture02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQo6-LDe1RuM-m49PyKisq0vVo5G68tK_m1p19Baqp83SU7zPQ6GlZK1zDQUY5UIgsPU5bjZwp-RsU8MUV9mVzYXZlvhfZpqGH-Ijz2pFlrg1NkGUmzkxF5y8Z96zmwyTRyWypi628-LVb/s320/picture02.png" width="179" /></a></div><br />
プログレスバーは100回更新されます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbkh9HRUGLHBGZwavO5XBGECw7yujAbmKyhT28NEVRcBgKHJ_xlp1cPnee1yFc1F6PV-Y3ywRdWMsZ7y443jiIJlFHOPAy5NwwoarfXv7neJJO0DD1Nd4NTUxH8SDGfhrJ1o8KKAdZ5CJ-/s1600/picture03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbkh9HRUGLHBGZwavO5XBGECw7yujAbmKyhT28NEVRcBgKHJ_xlp1cPnee1yFc1F6PV-Y3ywRdWMsZ7y443jiIJlFHOPAy5NwwoarfXv7neJJO0DD1Nd4NTUxH8SDGfhrJ1o8KKAdZ5CJ-/s320/picture03.png" width="179" /></a></div><br />
10秒間待つとプログレスバーがフェードアウトして消えます。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-18661801408265429952012-08-02T18:16:00.024+09:002012-10-16T23:59:13.367+09:00タイトルバーにプログレス(バー)の表示前回からの続きです。<br />
<br />
前回は時間や処理量が不確定の場合に使用する「円」のプログレスをご紹介しました。今回は進捗率を示して表示を行う「バー」のプログレスをタイトルバーに表示してみます。<br />
<br />
<hr size="1" /><span style="color: orange;">◆</span> プログレス(バー)の表示<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTaDFAEX-bY7Rl_MWr1jTO5AMy5r2NqhfxctKLPuVKBT69wdPIcEfHzbGYrHiMRiojwdwbtQMvl5inrUixZiGWoKNWgIhtHcwYBEVBZz7p3hvUmck-DAvA7LtCixBPvm6-qXz77YXC96CB/s1600/titlebar02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTaDFAEX-bY7Rl_MWr1jTO5AMy5r2NqhfxctKLPuVKBT69wdPIcEfHzbGYrHiMRiojwdwbtQMvl5inrUixZiGWoKNWgIhtHcwYBEVBZz7p3hvUmck-DAvA7LtCixBPvm6-qXz77YXC96CB/s200/titlebar02.png" width="200" /></a></div><br />
<a name='more'></a><br />
<b>ProgressBarOnTitleBarTest1aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ProgressBarOnTitleBarTest1a;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;
public class ProgressBarOnTitleBarTest1aActivity extends Activity {
// プログレスバーの更新周期(100)から増分値を設定
private static final int progressPeriod = (Window.PROGRESS_END - Window.PROGRESS_START) / 100;
private int progressUpdate;
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// タイトルバーにプログレスバーを設定する
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main);
handler = new Handler();
Button btnStart = (Button)findViewById(R.id.start_btn);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
progressUpdate = 0;
// プログレスバー表示開始
setProgressBarVisibility(true);
Toast.makeText(getApplicationContext(), "Processing....", Toast.LENGTH_LONG).show();
// プログレスバー表示中の処理(別スレッドで実行)
(new Thread(runnable)).start();
}
});
}
// 10秒後にプログレスバーの表示を終了する
private Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i ++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
;
}
// プログレスバーの進捗率計算
progressUpdate += progressPeriod;
handler.post(new Runnable() {
public void run() {
// プログレスバーを更新する
setProgress(progressUpdate);
}
});
}
handler.post(new Runnable() {
public void run() {
// プログレスバー表示終了
setProgressBarVisibility(false);
Toast.makeText(getApplicationContext(), "Done.", Toast.LENGTH_SHORT).show();
}
});
}
};
}
</pre><br />
今回も、プログレスを10秒間表示して終了することにします。プログレスの進捗状況の更新は100ms毎に100回行うことによって0~100%までを表すことにします。<br />
<br />
プログレスへの設定値ですが、これはWindowクラスの定数PROGRESS_STARTとPROGRESS_ENDで定義されています。この差を更新回数で割った値が1回にプログレスに設定する値となります。13行目で、progressPeriodにこの値を定義しています。<br />
<br />
タイトルバーにプログレスバーを設定している箇所が21行目です。<br />
requestWindowFeature(Window.FEATURE_PROGRESS);<br />
前回同様に、このAPI、requestWindowFeature()は、setContentView()の前に呼び出す必要があります。<br />
<br />
次に設定したプログレスバーを表示しているのが33行目です。setProgressBarVisibility(true);<br />
これ以降、タイトルバーにバーのプログレスが表示されます。<br />
<br />
処理が終了してプログレスの表示を消しているのは、67行目です。<br />
setProgressBarVisibility(false);<br />
<br />
プログレスバーの更新は、59行目のsetProgress(progressUpdate);で行っています。更新で注意して頂きたいのは、一番最後のsetProgressの呼び出しにおいてPROGRESS_STARTとPROGRESS_ENDの差である10000がセットされるようにすることです。この値が設定されるとプログレスバーはフェードアウトして消えていきます。もし10000より小さい値でsetProgressを呼び出した後に、setProgressBarVisibility(false);を呼び出すと、プログレスバーは瞬時に消えてしまいます。フェードアウトしたほうが綺麗ですよね。<br />
<br />
それと、今回のサンプルだけでなくUIに影響を与える処理についてはUIを処理しているスレッドで行うようにしてください。もし別スレッドからUIを触るような処理をした場合、例外が発生してしまいます。幾つかの方法がありますが、プログレス関連のサンプルではハンドラを使用して、各APIがUIスレッドで実行されるようにしています。<br />
<br />
画面レイアウトはボタンのラベル(テキスト)を除いて前回と同じです。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/start_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start ProgressBar on TitleBar"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>ProgressBarOnTitleBarTest1a</td></tr>
<tr><td>アプリケーション名:</td><td>ProgressBarOnTitleBarTest1a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.ProgressBarOnTitleBarTest1a</td></tr>
<tr><td>アクティビティーの作成:</td><td>ProgressBarOnTitleBarTest1aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnMKB3tIUIBTL1rj0bTfVdIMuONL1RI5KOUocR3m1LIS2jROkrYWWCUOGjkhlrdFWXIUpuhFsAjArYZ8ONVLopGs1JdD6JyY8iSrnWDtQnZfGd3v-rEKyJDYKFGy4utbrMMyQPO_6kK3N6/s1600/picture01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnMKB3tIUIBTL1rj0bTfVdIMuONL1RI5KOUocR3m1LIS2jROkrYWWCUOGjkhlrdFWXIUpuhFsAjArYZ8ONVLopGs1JdD6JyY8iSrnWDtQnZfGd3v-rEKyJDYKFGy4utbrMMyQPO_6kK3N6/s320/picture01.png" width="179" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyEh7AWSvFkC8htVmN4hFiQ9K3C6WDkKASsHYVOYj5SjN8XTg4VIytjwWX8-_MxzXjYzBgZ47BU7vxM_mGo0kHZPsxonvhcuZ-npsnwJOWUcIfZzPVi1f_CWgCe3Fr7TpMEY6eUhysAOF-/s1600/picture02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyEh7AWSvFkC8htVmN4hFiQ9K3C6WDkKASsHYVOYj5SjN8XTg4VIytjwWX8-_MxzXjYzBgZ47BU7vxM_mGo0kHZPsxonvhcuZ-npsnwJOWUcIfZzPVi1f_CWgCe3Fr7TpMEY6eUhysAOF-/s320/picture02.png" width="179" /></a></div><br />
<br />
プログレスバーは100回更新されます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggcj7APGj1_qBmmeDnOdtalumR_x4wMu3vl4nVXl99YTyU-uNOjIIANIvuHmYVZLv90FRnDYULNUSuJNIjR6hSZRXGJNcGhJ1wGT1t-N5LE_-5i_I9ZzLE7vWqt6C9qF2C1XDmp_IAcARe/s1600/picture03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggcj7APGj1_qBmmeDnOdtalumR_x4wMu3vl4nVXl99YTyU-uNOjIIANIvuHmYVZLv90FRnDYULNUSuJNIjR6hSZRXGJNcGhJ1wGT1t-N5LE_-5i_I9ZzLE7vWqt6C9qF2C1XDmp_IAcARe/s320/picture03.png" width="179" /></a></div><br />
10秒間待つとプログレスバーがフェードアウトして消えます。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-984747786679518672012-07-26T18:36:00.022+09:002012-10-16T23:58:50.587+09:00タイトルバーにプログレス(円)の表示以前に作業中であることを示すための方法として「<a href="http://triware.blogspot.jp/2011/12/progressdialog.html">ProgressDialog(円)</a>」と「<a href="http://triware.blogspot.jp/2011/12/progressdialog_09.html">ProgressDialog(バー)</a>」を紹介しました。<br />
<br />
今回はこれらの情報をタイトルバーに表示してみることにします。<br />
タイトルバーへのプログレス表示ですが、ProgressDialogでも説明しましたように、作業中であることを表現する方法は2つあります。時間や処理量が不確定の場合に表示するもの、もうひとつは進捗率を示して表示するものです。これからこれらそれぞれの場合について4種類のサンプルを作成していきたいと思います。<br />
<br />
<blockquote><table border="1" cellpadding="0" cellspacing="0"><tbody>
<tr><td> 円</td><td><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii2Te5uMtX-5RsOkHLRsaMaoI5X1yaaSiDT3d7ZqoC5pEW_5NvNWf3w4C4cyIJG0DVMbx2MBdJ2PXLtlqC-FfPr1xc4o0MJlnXHp-rO9fU2c9N2GHJwbQGgxFSj6Z1_67z_ITez4VUaatt/s1600/titlebar01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii2Te5uMtX-5RsOkHLRsaMaoI5X1yaaSiDT3d7ZqoC5pEW_5NvNWf3w4C4cyIJG0DVMbx2MBdJ2PXLtlqC-FfPr1xc4o0MJlnXHp-rO9fU2c9N2GHJwbQGgxFSj6Z1_67z_ITez4VUaatt/s200/titlebar01.png" width="200" /></a></div></td><td> 時間や処理量が不確定</td></tr>
<tr><td> バー</td><td><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN3jx6Ua9Y5W8ZydbS9OoGcR0D_Y3UFeGe27DbwdQZTS7G0rG9gjtyQhupO6bB2BWm5BffhU9KQoqR5yLQsiWyv7GGncHg0GU21Vj1OjMiZkTMXkPAV0OKDBFUl-bCf8IJfPbETnFmle1J/s1600/titlebar02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN3jx6Ua9Y5W8ZydbS9OoGcR0D_Y3UFeGe27DbwdQZTS7G0rG9gjtyQhupO6bB2BWm5BffhU9KQoqR5yLQsiWyv7GGncHg0GU21Vj1OjMiZkTMXkPAV0OKDBFUl-bCf8IJfPbETnFmle1J/s200/titlebar02.png" width="200" /></a></div></td><td> 進捗率を示す</td></tr>
<tr><td> バー(セカンダリ) </td><td><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgITe6OeFXt70BFf9PbBvMiCOepQNEBHqSbq9ougf9GQDyerLiBXB8fvQF3jubdH1Ejy1jF9DUNCb47QRcExP66ppz3t6Ou8VHd6FFM1P63aUMWdxpZhZS0igeBlP9Tu3SE9kUG7PGWjPfx/s1600/titlebar03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgITe6OeFXt70BFf9PbBvMiCOepQNEBHqSbq9ougf9GQDyerLiBXB8fvQF3jubdH1Ejy1jF9DUNCb47QRcExP66ppz3t6Ou8VHd6FFM1P63aUMWdxpZhZS0igeBlP9Tu3SE9kUG7PGWjPfx/s200/titlebar03.png" width="200" /></a></div></td><td> 進捗率を示す</td></tr>
<tr><td> バー(縞模様)</td><td><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLM5jHc7iQGPIbVAIulCOAat1mxSRyec1xuzVPOtQq6oozCDP2YC10iky_VG80_JFAIyRArsbmA_xAPbCfee7yGgI7VbGsj7oz3D8wNiOYTmg95I_XAHJYK6NztRKr7xvbTLbUHYj6sc4x/s1600/titlebar04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLM5jHc7iQGPIbVAIulCOAat1mxSRyec1xuzVPOtQq6oozCDP2YC10iky_VG80_JFAIyRArsbmA_xAPbCfee7yGgI7VbGsj7oz3D8wNiOYTmg95I_XAHJYK6NztRKr7xvbTLbUHYj6sc4x/s200/titlebar04.png" width="200" /></a></div></td><td> 時間や処理量が不確定</td></tr>
</tbody></table></blockquote><br />
一つ目として、今回は時間や処理量が不確定の場合に円で表示するサンプルを作ります。<br />
<br />
<hr size="1" /><span style="color: orange;">◆</span> プログレス(円)の表示<br />
<a name='more'></a><br />
<b>ProgressIconOnTitleBarTest1aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ProgressIconOnTitleBarTest1a;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;
public class ProgressIconOnTitleBarTest1aActivity extends Activity {
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// タイトルバーにプログレスアイコンを設定する
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);
handler = new Handler();
Button btnStart = (Button)findViewById(R.id.start_btn);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// プログレスアイコン表示開始
setProgressBarIndeterminateVisibility(true);
Toast.makeText(getApplicationContext(), "Processing....", Toast.LENGTH_LONG).show();
// プログレス表示中の処理(別スレッドで実行)
(new Thread(runnable)).start();
}
});
}
// 10秒後にプログレスアイコンの表示を終了する
private Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i ++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
;
}
}
handler.post(new Runnable() {
public void run() {
// プログレスアイコン表示終了
setProgressBarIndeterminateVisibility(false);
Toast.makeText(getApplicationContext(), "Done.", Toast.LENGTH_SHORT).show();
}
});
}
};
}
</pre>時間あるいは処理量が未定のサンプルですが、プログレスを10秒間表示して終了することにします。 <br />
<br />
最初に、タイトルバーに円のプログレスを設定している箇所が18行目です。requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);<br />
このAPI、requestWindowFeature()は、「<a href="http://triware.blogspot.jp/2012/05/blog-post.html">タイトルバーを消す</a>」で使用したAPIと同じで、 今回も同様にsetContentView()の前に呼び出す必要があります。<br />
<br />
次に設定したプログレスを表示しているのが28行目です。<br />
setProgressBarIndeterminateVisibility(true);<br />
これ以降、タイトルバーの右端に円形のプログレスが表示されます。<br />
<br />
処理が終了してプログレスの表示を消しているのは、52行目です。<br />
setProgressBarIndeterminateVisibility(false);<br />
今回は一定時間後 に当該APIを呼び出して、プログレスの表示を終了していますが、キャンセルする場合もボタンや他のイベント処理時に当該APIを呼び出すことになります。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/start_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start ProgressIcon on TitleBar"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>ProgressIconOnTitleBarTest1a</td></tr>
<tr><td>アプリケーション名:</td><td>ProgressIconOnTitleBarTest1a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.ProgressIconOnTitleBarTest1a</td></tr>
<tr><td>アクティビティーの作成:</td><td>ProgressIconOnTitleBarTest1aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3FFKNiTp0NLh3ZyS-3pPFLUABUNNCCGXwFqqiUg4RLPrsYQ4hGvk248Tac4pRb25gWZtwelyVfR2HDLhMxHuv_jjZBtiqJSscu-IRzdxKOQz61PxXgeV10K55r4oGmvp6FVXkVco2QQly/s1600/picture01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3FFKNiTp0NLh3ZyS-3pPFLUABUNNCCGXwFqqiUg4RLPrsYQ4hGvk248Tac4pRb25gWZtwelyVfR2HDLhMxHuv_jjZBtiqJSscu-IRzdxKOQz61PxXgeV10K55r4oGmvp6FVXkVco2QQly/s320/picture01.png" width="179" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAQE8spGOYUCp22Twow5OyRLAvEXDKhSjsxzmPYjL5YLofEmPXDNaCm8W3MooCPWOwT1IaQSulUZCNpoZkz7TCe-JgA8kgfOhT1lZ8FzWkvzTvn3kibsYTnBXAWhTOQXaHEVBpfc2RVrKU/s1600/picture02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAQE8spGOYUCp22Twow5OyRLAvEXDKhSjsxzmPYjL5YLofEmPXDNaCm8W3MooCPWOwT1IaQSulUZCNpoZkz7TCe-JgA8kgfOhT1lZ8FzWkvzTvn3kibsYTnBXAWhTOQXaHEVBpfc2RVrKU/s320/picture02.png" width="179" /></a></div><br />
プログレス表示中、タイトルバーの右端で円がくるくる回ります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig9UkCXbWVbvZ2lHXGKZOH9pmhxkxuZq0xcIs1QYjedu00x_OJjuXwJ94zSR9g6WeKuwHYAtqskLTraA4AiiJmoeR9qbzcfWP0J9ju_-MXuWw14L5VU17DFCwVXePMck_-4TeCTG4pg_Ou/s1600/picture03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig9UkCXbWVbvZ2lHXGKZOH9pmhxkxuZq0xcIs1QYjedu00x_OJjuXwJ94zSR9g6WeKuwHYAtqskLTraA4AiiJmoeR9qbzcfWP0J9ju_-MXuWw14L5VU17DFCwVXePMck_-4TeCTG4pg_Ou/s320/picture03.png" width="179" /></a></div><br />
10秒間待つとプログレスの表示が消えます。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-5972876141873876482012-07-19T18:54:00.003+09:002012-10-16T23:56:23.333+09:00表示エリアを計算する<a href="http://triware.blogspot.jp/2011/09/display.html">Display</a>では画面の高さ・幅を取得しました。これで液晶のサイズはわかりますが、実際には<a href="http://triware.blogspot.jp/2012/05/blog-post.html">タイトルバー</a>や<a href="http://triware.blogspot.jp/2012/06/blog-post.html">ステータスバー</a>がありますので、使える領域はそれよりも狭くなります。<br />
<br />
今回は実際に使える領域を求めるサンプルプログラムをご紹介しましょう。<br />
<a name='more'></a><br />
<b>DisplayTest2aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.DisplayTest2a;
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class DisplayTest2aActivity extends Activity {
private final String TAG = this.getClass().getSimpleName();
private static boolean mbNoTitleBar = false;
private static boolean mbNoStatusBar = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mbNoTitleBar == true) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
setContentView(R.layout.main);
if (mbNoStatusBar == true) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
Button btnTitleBar = (Button)findViewById(R.id.titlebar_btn);
btnTitleBar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mbNoTitleBar = mbNoTitleBar ? false : true;
Toast.makeText(getApplicationContext(),
"TitleBar will be " + (mbNoTitleBar ? "hidden" : "shown"),
Toast.LENGTH_SHORT).show();
}
});
Button btnStatusBar = (Button)findViewById(R.id.statusbar_btn);
btnStatusBar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mbNoStatusBar = mbNoStatusBar ? false : true;
if (mbNoStatusBar == true) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
});
Button btnCalc = (Button)findViewById(R.id.calc_btn);
btnCalc.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
printDisplayInfo();
}
});
}
private void printDisplayInfo() {
String buf = "";
Display display = getWindowManager().getDefaultDisplay();
buf = "*** Display ***\n";
buf += "Orientation: " + display.getOrientation() + "\n";
buf += "Height: " + display.getHeight() + "\n";
buf += "Width: " + display.getWidth() + "\n";
buf += "\n";
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
buf += "*** getWindowVisibleDisplayFrame() ***\n";
buf += "Top: " + rect.top + "\n";
buf += "Bottom: " + rect.bottom + "\n";
buf += "Left: " + rect.left + "\n";
buf += "Right: " + rect.right + "\n";
buf += "Height: " + rect.height() + "\n";
buf += "Width: " + rect.width() + "\n";
buf += "\n";
View v = findViewById(Window.ID_ANDROID_CONTENT);
buf += "*** Window.ID_ANDROID_CONTENT ***\n";
buf += "Top: " + v.getTop() + "\n";
buf += "Bottom: " + v.getBottom() + "\n";
buf += "Left: " + v.getLeft() + "\n";
buf += "Right: " + v.getRight() + "\n";
buf += "Height: " + v.getHeight() + "\n";
buf += "Width: " + v.getWidth() + "\n";
Log.d(TAG, buf);
TextView tvResult = (TextView)findViewById(R.id.result_tv);
tvResult.setText(buf);
}
}
</pre>71~73行めのDisplayクラスのメソッドは以前の「<a href="http://triware.blogspot.jp/2011/09/display.html">Display</a>」の記事で説明しました。この時はAPI Level 7を対象にしていましたのでgetOrientation()を使いましたが、このメソッドはAPI Level 8 (Android 2.2)以降ではgetRotation()に置き換えられています。Android 2.1以前をターゲットにしないのであれば、getRotation()を使うほうがいいでしょう。getRotation()の戻り値はSurface.ROTATION_0、Surface.ROTATION_90、Surface.ROTATION_180、Surface.ROTATION_270です。getOrientation()では縦方向か横方向しかわかりませんでしたが、getRotation()では180度や270度もわかります。<br />
<br />
77行めのgetWindowVisibleDisplayFrame()は、ステータスバーの下がTopの座標になります。高さはその分を差し引いた値となります。<br />
<br />
87行めでは、Window.ID_ANDROID_CONTENTを指定してViewを探しています。このViewは、タイトルバーの下にありますので、ViewのTopの座標はタイトルバーの直下になります。高さはその分を差し引いた値となります。<br />
<br />
このふたつを組み合わせることで、表示可能なエリアのサイズや、ステータスバーの高さ、タイトルバーの高さを計算することができます。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:id="@+id/titlebar_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="TitleBar"
android:layout_weight="1"
/>
<Button
android:id="@+id/statusbar_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="StatusBar"
android:layout_weight="1"
/>
<Button
android:id="@+id/calc_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Calc"
android:layout_weight="1"
/>
</LinearLayout>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/result_tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</ScrollView>"
</LinearLayout>
</pre>「TitleBar」ボタンはタイトルバーの表示/非表示、「StatusBar」ボタンはステータスバーの表示/非表示を切り替えます。「Calc」ボタンで幅・高さ・開始座標等を求めて表示します。<br />
<br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>DisplayTest2a</td></tr>
<tr><td>アプリケーション名:</td><td>DisplayTest2a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.DisplayTest2a</td></tr>
<tr><td>アクティビティーの作成:</td><td>DisplayTest2aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
まずは、タイトルバーもステータスバーも表示したままの状態で情報を取得します。アプリを起動した後、「Calc」ボタンをクリックします。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLUir6iQ5ORHnuoNIC8qfWqBhjG1rZl_wq7lV4Uqex9PNyuAGzP9Z6lEYf-XwDFAMh9cI0Bwzxiz0kOQXyI5zj-XdBs5Q3GW7xJxePJBIyvCkNh3uMDtwvjbAY8JbGHuYGSA0l7iATgydq/s1600/DisplayTest2a-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLUir6iQ5ORHnuoNIC8qfWqBhjG1rZl_wq7lV4Uqex9PNyuAGzP9Z6lEYf-XwDFAMh9cI0Bwzxiz0kOQXyI5zj-XdBs5Q3GW7xJxePJBIyvCkNh3uMDtwvjbAY8JbGHuYGSA0l7iATgydq/s320/DisplayTest2a-1.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyGrcCmtB2rC28IESaZ1thb3mG9Dm78SIDY4HxfODUoqLRwrK06EvvCy5laeRp6OvC_TCHSsMR4Vrw-Gxl5XvYd6IMoTjj4mIpQpqVs-8nCJQcxHpwUw1fb5YjIcBraBGdHNl1qZ-HZmJ-/s1600/DisplayTest2a-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyGrcCmtB2rC28IESaZ1thb3mG9Dm78SIDY4HxfODUoqLRwrK06EvvCy5laeRp6OvC_TCHSsMR4Vrw-Gxl5XvYd6IMoTjj4mIpQpqVs-8nCJQcxHpwUw1fb5YjIcBraBGdHNl1qZ-HZmJ-/s320/DisplayTest2a-2.png" width="214" /></a></div>getWindowVisibleDisplayFrame()でステータスバーの直下のY座標が25、Window.ID_ANDROID_CONTENTでタイトルバーの直下のY座標が50となっています。これらのことから、ステータスバーの高さは25ピクセル、タイトルバーの高さも25ピクセルであることがわかります。これで当初の目的は達成しましたが、タイトルバーやステータスバーを消して実際の座標や高さを確認してみましょう。<br />
<br />
ではタイトルバーを消します。「TitleBar」ボタンをクリックした後、Backキーを押してホーム画面に戻ってください。サンプルアプリを呼び出して「Calc」ボタンをクリックします。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6l2P-ojea4PLDxLeEN5zQIfsSneHmj5kaAiOl5v8qvHv0PhkYV_rGIsBB6UXaykFz6lawiO1qzfYnNDIopxdCwNj9bRsuSvIWvMgbCQEO6qNfrRVqmgUKiULjcqPTWHyoXH99UdRnPAqa/s1600/DisplayTest2a-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6l2P-ojea4PLDxLeEN5zQIfsSneHmj5kaAiOl5v8qvHv0PhkYV_rGIsBB6UXaykFz6lawiO1qzfYnNDIopxdCwNj9bRsuSvIWvMgbCQEO6qNfrRVqmgUKiULjcqPTWHyoXH99UdRnPAqa/s320/DisplayTest2a-3.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi-kyf2GA-pWaPU1eqqIqLzVwnf62ZG8jybrxtWJbRdx3HZO6OxPqJOKivW73X9aDoYfLd2iIvBhrKTAX7SYkaXVNjBLY_iR6PadcekjHlD2qp_P3aB1rgCipvHF7WPgutoLiLQA0QeZEp/s1600/DisplayTest2a-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi-kyf2GA-pWaPU1eqqIqLzVwnf62ZG8jybrxtWJbRdx3HZO6OxPqJOKivW73X9aDoYfLd2iIvBhrKTAX7SYkaXVNjBLY_iR6PadcekjHlD2qp_P3aB1rgCipvHF7WPgutoLiLQA0QeZEp/s320/DisplayTest2a-4.png" width="214" /></a></div>タイトルバーがないので、Window.ID_ANDROID_CONTENTのViewのTopは0になりました。<br />
<br />
次はステータスバーだけ消した場合を試してみます。「TitleBar」ボタンをクリック(タイトルバーを表示させるために)、「StatusBar」ボタンをクリックした後、先程と同じようにアプリを再度呼び出して、「Calc」ボタンをクリックします。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimohEBTRZMf5gqLIgLX5FXaRlMSRicBKF-Vwa44lFgHqNwo1gTNqW_Wa1Mbuy5y2E52W9jLJ694RLNwMn-YHJ-zxILgalSRURw54vmqJ4i7P275g9Bm1TIWT37qdMxrBNw6RHIACnbNFi0/s1600/DisplayTest2a-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimohEBTRZMf5gqLIgLX5FXaRlMSRicBKF-Vwa44lFgHqNwo1gTNqW_Wa1Mbuy5y2E52W9jLJ694RLNwMn-YHJ-zxILgalSRURw54vmqJ4i7P275g9Bm1TIWT37qdMxrBNw6RHIACnbNFi0/s320/DisplayTest2a-5.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheKLhfWHEsjxzLX4oc-ZByNzFEaWFLhqHXtBkF0_EfssXPh7C9PIFS3xZDyb8209UbPwBsWLhcve0ZZOC3L2OMuLuyufv6-jmGTxWSAwdwTugFgKmohESq3Hzx4fTAxhvFEU8wot1asDxn/s1600/DisplayTest2a-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheKLhfWHEsjxzLX4oc-ZByNzFEaWFLhqHXtBkF0_EfssXPh7C9PIFS3xZDyb8209UbPwBsWLhcve0ZZOC3L2OMuLuyufv6-jmGTxWSAwdwTugFgKmohESq3Hzx4fTAxhvFEU8wot1asDxn/s320/DisplayTest2a-6.png" width="214" /></a></div>ステータスバーがないので、getWindowVisibleDisplayFrame()のTopは0になりました。<br />
もし、Topが0にならなかったら、画面の縦横を切り替えてみてください。縦長→横長→縦長としてから「Calc」ボタンをクリックします。<br />
<br />
<i>註:<br />
エミュレータやGALAXY Nexus (SC-04D)ではアプリ再呼出で意図した結果になりましたが、MEDIAS (N-04C)では縦横を切り替えないと値が変化しませんでした。アプリ再呼出の場合は、もしかするとシステム内部状態が、機種やその時のOSの状態によって違うのかもしれません。<br />
今回はテスト用にアプリ再呼出で値を取得するようにしていますので不都合が生じていますが、通常は、画面生成時や縦横切替時に領域を求めたいでしょうから、問題にはならないと思います。</i><br />
<br />
最後はタイトルバーもステータスバーも消して見ましょう。「TitleBar」ボタンをクリックしたあと、Backキーでホーム画面に戻ってからアプリを再度呼び出してください。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdneFAo9fQPGXE2semQCfYWAaHeXUV0CYo3TQUKd3XnfwNYEmOaZj0RYp2u8vgs5r0DvS09_cFFtnq-O1WcQoeehJ-47d01DTvYU_yOUElJunCM8Cr7i8aATISLSLVio5Ibt8hUWn_Wvt-/s1600/DisplayTest2a-7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdneFAo9fQPGXE2semQCfYWAaHeXUV0CYo3TQUKd3XnfwNYEmOaZj0RYp2u8vgs5r0DvS09_cFFtnq-O1WcQoeehJ-47d01DTvYU_yOUElJunCM8Cr7i8aATISLSLVio5Ibt8hUWn_Wvt-/s320/DisplayTest2a-7.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1YcljQfotlrhEybMansYXVXMW-bv_jYS-nXxm3Zm9DQYrV4X4V8PdNjOfEGYLD-0fT8u7kiOX1Dq37wv1SxhX0g8GwNVazjVKfzfHGf1pYfAnYrV6fsZSictZi-KmtGUapzn7ccSspTWU/s1600/DisplayTest2a-8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1YcljQfotlrhEybMansYXVXMW-bv_jYS-nXxm3Zm9DQYrV4X4V8PdNjOfEGYLD-0fT8u7kiOX1Dq37wv1SxhX0g8GwNVazjVKfzfHGf1pYfAnYrV6fsZSictZi-KmtGUapzn7ccSspTWU/s320/DisplayTest2a-8.png" width="214" /></a></div>タイトルバーもステータスバーもないので、どちらもTopは0ですね。<br />
<br />
最初から実行しなおしたい場合は、システム設定のアプリケーション管理からサンプルプログラムを強制終了させてから始めてください。<br />
Backキーを押してアプリを(見た目は)終了しても、実は裏で動いています。このあたりは別途「Activity Lifecycle」という記事で説明する予定です。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-87161990368925992552012-06-11T18:05:00.035+09:002012-10-16T23:56:56.349+09:00ステータスバーを消すアンテナやバッテリーのアイコンなどが表示されているエリアはステータスバーといいます。<br />
<br />
通常はこういった情報も表示させておきたいものですが、<a href="http://triware.blogspot.jp/2012/05/blog-post.html">タイトルバー</a>同様、デザインの関係で非表示にしたい場合もあるでしょう。<br />
<br />
今回はステータスバーを非表示にしてみます。<br />
<br />
<b>StatusBarTest1aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.StatusBarTest1a;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
public class StatusBarTest1aActivity extends Activity {
private boolean mbNoStatusBar = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.toggle_btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mbNoStatusBar = mbNoStatusBar ? false : true;
if (mbNoStatusBar == true) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
});
}
}
</pre><a name='more'></a><br />
「ステータスバーを非表示にする」といいましたが、コードでは「フルスクリーンにするフラグを追加する」という動きになります。<br />
24行めの getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); がそれです。<br />
<br />
タイトルバーはsetContentView()の前に処理しなければなりませんでしたが、こちらはタイトルバーと違って実行時に反映されます。setContentView()の前でも後でも有効です。<br />
<br />
元に戻す場合はセットしたフラグを消します。<br />
26行めの getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); ですね。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<Button
android:id="@+id/toggle_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Toggle StatusBar"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>StatusBarTest1a</td></tr>
<tr><td>アプリケーション名:</td><td>StatusBarTest1a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.StatusBarTest1a</td></tr>
<tr><td>アクティビティーの作成:</td><td>StatusBarTest1aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
起動時はステータスバーが表示されています。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijeA3KocUE6t6W-mbTnKLtd9XcpELd4-7VjA-T_sgfVZhXuw_UGqH7Qt_dWERVKnEJS37Y_Vy5OhwzuRzeu1ZLkz59j_9DUEzEG4RTHEJtOpST1rREed_Y96UeVpKAqzCUQY9XtHjmnAiB/s1600/StatusBarTest1a-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijeA3KocUE6t6W-mbTnKLtd9XcpELd4-7VjA-T_sgfVZhXuw_UGqH7Qt_dWERVKnEJS37Y_Vy5OhwzuRzeu1ZLkz59j_9DUEzEG4RTHEJtOpST1rREed_Y96UeVpKAqzCUQY9XtHjmnAiB/s320/StatusBarTest1a-1.png" width="214" /></a><br />
ボタンをクリックすると…<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWIq6okFsfLUv655BJdnjMjR12Ph167qRaOYrHZib87kYCsRnTqIASbSfk6IJWjXEGMbz0IYwz19ylGzMrxLwTODIoaHKAYsfQslwyJYi13uFLNZ-VWIex4Iq8hHoqNuJWq9joCn_Tpo-S/s1600/StatusBarTest1a-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWIq6okFsfLUv655BJdnjMjR12Ph167qRaOYrHZib87kYCsRnTqIASbSfk6IJWjXEGMbz0IYwz19ylGzMrxLwTODIoaHKAYsfQslwyJYi13uFLNZ-VWIex4Iq8hHoqNuJWq9joCn_Tpo-S/s320/StatusBarTest1a-2.png" width="214" /></a><br />
ステータスバーが消えました。<br />
再度ボタンをクリックすると…<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHuXWPajqfi3JzOShmDKMfJt1kN475JSHvHjfZhcOxs9IQ0Ah3jRHh6tPXlQ_OJ369PjJnUQuQmPkifroQU2c1FeTCloCAnvMiXKovZnCnqKzO1tREOUV-5e2ZQEqcnp8E8WadpHZJDsfO/s1600/StatusBarTest1a-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHuXWPajqfi3JzOShmDKMfJt1kN475JSHvHjfZhcOxs9IQ0Ah3jRHh6tPXlQ_OJ369PjJnUQuQmPkifroQU2c1FeTCloCAnvMiXKovZnCnqKzO1tREOUV-5e2ZQEqcnp8E8WadpHZJDsfO/s320/StatusBarTest1a-3.png" width="214" /></a><br />
ステータスバーが表示されました。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-44467613778359078042012-05-28T19:43:00.028+09:002012-10-16T23:57:22.645+09:00タイトルバーを消すアプリのタイトルを表示しているところをタイトルバーといいます。<br />
<br />
通常はタイトルバーを表示していますが、画面のデザイン性や、少しでも情報を多く表示したい場合には、タイトルバーを消したいと思うこともあるでしょう。<br />
<br />
今回はそのタイトルバーを消すサンプルです。<br />
<br />
<b>TitleBarTest1aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.TitleBarTest1a;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;
public class TitleBarTest1aActivity extends Activity {
private static volatile boolean mbNoTitleBar = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mbNoTitleBar == true) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.toggle_btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mbNoTitleBar = mbNoTitleBar ? false : true;
Toast.makeText(getApplicationContext(),
"TitleBar will be " + (mbNoTitleBar ? "hidden" : "shown"),
Toast.LENGTH_SHORT).show();
}
});
}
}
</pre><a name='more'></a><br />
タイトルバーを表示させたり消したりするサンプルですのでフラグを使って制御していますが、タイトルバーを消すだけであれば、必要なコードは18行目の requestWindowFeature(Window.FEATURE_NO_TITLE); だけです。ただしこれはsetContentView()の前に呼び出さなくてはなりませんので、そこだけは注意が必要です。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<Button
android:id="@+id/toggle_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Toggle TitleBar"
/>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>TitleBarTest1a</td></tr>
<tr><td>アプリケーション名:</td><td>TitleBarTest1a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.TitleBarTest1a</td></tr>
<tr><td>アクティビティーの作成:</td><td>TitleBarTest1aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
「Toggle TitleBar」のボタンをクリックした後、画面の縦横を切り替えるか、ホーム画面に戻ってからアプリを呼び出すとタイトルバーの表示/非表示が切り替わります。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUHK17Rea9ScMxPRolET0FSefOEGtIxUDQ5Gq-NMuoIun4mlEXpPSM6LCrrnr1PiY9YMcfzakJRi0hpqTGFF5GGdJH3i1VdEy0L0u8fR_M4VJrdwJPbCZPMD1Z4CInSjDWasZM-qF7tiZI/s1600/NoTitleBar-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUHK17Rea9ScMxPRolET0FSefOEGtIxUDQ5Gq-NMuoIun4mlEXpPSM6LCrrnr1PiY9YMcfzakJRi0hpqTGFF5GGdJH3i1VdEy0L0u8fR_M4VJrdwJPbCZPMD1Z4CInSjDWasZM-qF7tiZI/s320/NoTitleBar-1.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwNZ5K0VDdj-Jzz6IYn9FEu_qwcHcc7MGSYug3Qn6gXv7H6FkOmdeZiox9m9cxwvDW6IJ0thKM9Wlgnfpn8kbytSPq2-7Ee8byXvAFMYaAoJD5f5hu8KbugnBcgf2xvgwoC2jfPhmlvDGS/s1600/NoTitleBar-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwNZ5K0VDdj-Jzz6IYn9FEu_qwcHcc7MGSYug3Qn6gXv7H6FkOmdeZiox9m9cxwvDW6IJ0thKM9Wlgnfpn8kbytSPq2-7Ee8byXvAFMYaAoJD5f5hu8KbugnBcgf2xvgwoC2jfPhmlvDGS/s320/NoTitleBar-2.png" width="214" /></a><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXRSMI6j0x-95P7ewt4TU3VfgOtUjXgsm94N8OenmovQRDcxVdiWRAIUUFDqaTOLYorgkeEGdundV65JYsHQozM9ZGxJYANGzT4eCjx5aikIsSiUQJd1ovTsCj7SOw4hu-rd5U5gbLiLdo/s1600/NoTitleBar-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXRSMI6j0x-95P7ewt4TU3VfgOtUjXgsm94N8OenmovQRDcxVdiWRAIUUFDqaTOLYorgkeEGdundV65JYsHQozM9ZGxJYANGzT4eCjx5aikIsSiUQJd1ovTsCj7SOw4hu-rd5U5gbLiLdo/s320/NoTitleBar-3.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNuXOCLOF71p8au8gT7-JMPmDU7dR2Y-4VaJ5wYvZHSmSpBYzQ3N0s6HEGXWmUCaNYYZE5DqmvpdsEQc9MNXIvpERLQSjDWOKAzkkW7cKHpjAto9nCLtHSmA7GPBcAfaWpX7NDcF1ZXSh1/s1600/NoTitleBar-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNuXOCLOF71p8au8gT7-JMPmDU7dR2Y-4VaJ5wYvZHSmSpBYzQ3N0s6HEGXWmUCaNYYZE5DqmvpdsEQc9MNXIvpERLQSjDWOKAzkkW7cKHpjAto9nCLtHSmA7GPBcAfaWpX7NDcF1ZXSh1/s320/NoTitleBar-4.png" width="214" /></a><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJFtcjuLCq8oBoUQaLQblP70lXk8ijnF2vDGYltuMfd5jcYZ1zxCZ1NU96Ahk9aE_HPgenbFr6Nnpb3gOZfQovMP1fU0-XUVQFrT1pWH2_LSdb2GXf0t8alPtKFM1jn6LbNdVCmWZ-i-G/s1600/NoTitleBar-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJFtcjuLCq8oBoUQaLQblP70lXk8ijnF2vDGYltuMfd5jcYZ1zxCZ1NU96Ahk9aE_HPgenbFr6Nnpb3gOZfQovMP1fU0-XUVQFrT1pWH2_LSdb2GXf0t8alPtKFM1jn6LbNdVCmWZ-i-G/s320/NoTitleBar-5.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuBt3RAFVjCpc1I3k6I7Th1l8SpAzGDtOBPjaUOYdF6sBLAgREqjJMCBBF0tdnQ63HCre7pB15CgcElS4MBm3BzPxkaAv6HnF6ZLT5IOleDzw3ZP1JDB-EaUT3zf14oktC8DkF68pU0bUL/s1600/NoTitleBar-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuBt3RAFVjCpc1I3k6I7Th1l8SpAzGDtOBPjaUOYdF6sBLAgREqjJMCBBF0tdnQ63HCre7pB15CgcElS4MBm3BzPxkaAv6HnF6ZLT5IOleDzw3ZP1JDB-EaUT3zf14oktC8DkF68pU0bUL/s320/NoTitleBar-6.png" width="214" /></a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-77985656695522725612012-05-14T18:18:00.078+09:002012-07-07T00:43:01.687+09:00StringとStringBufferログを出力する場合など、文字列を処理しますね。その際、どのように文字列を扱っているでしょうか。Stringで"+"を使って連結するケースが多いのではないでしょうか。理由はカンタンだから、でしょうね。これまでのサンプルもそうしてきました。<br />
<br />
でも、そういう文字列処理自体があまりなかったり、実行される回数が少なければ特に問題は発生しないかもしれませんが、実はStringは効率がよくありません。効率よく処理するにはStringBufferを使います。<br />
<br />
以下のサンプルでは、文字列の連結を200回繰り返す処理を、StringとStringBufferで実装しています。かかる時間とGC(ガベージ・コレクション)がどれだけ動くか比較してみてください。<br />
<br />
なお、文字列連結前にSystem.gc()を2回呼び出していますが、これはなくても構いません。GCが動こうとしたタイミングでサンプルを実行すると、意図しないGCのログが出るので先に実行させています。<br />
<a name='more'></a><br />
<b>StringBufferTest1aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.StringBufferTest1a;
import java.util.Calendar;
import java.util.Date;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class StringBufferTest1aActivity extends Activity {
private static final String TAG = "StringBufferTest1aActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final int count = 200;
Button btnString = (Button)findViewById(R.id.string_btn);
Button btnStringBuffer = (Button)findViewById(R.id.string_buffer_btn);
final TextView tvResult = (TextView)findViewById(R.id.result_tv);
btnString.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
System.gc();
System.gc();
String buf = "";
Log.d(TAG, "String: Start");
Calendar c1 = Calendar.getInstance();
for (int i = 0; i < count; i ++) {
buf += "THE QUICK BROWN FOX #" + i + " JUMPS OVER THE LAZY DOG #" + i + ".\n";
}
Calendar c2 = Calendar.getInstance();
long diff = c2.getTimeInMillis() - c1.getTimeInMillis();
Log.d(TAG, "String: End");
String msg = "String: " + diff + " ms";
Log.d(TAG, msg);
tvResult.setText(msg);
}
});
btnStringBuffer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
System.gc();
System.gc();
StringBuffer buf = new StringBuffer();
Log.d(TAG, "StringBuffer: Start");
tvResult.setText("StringBuffer: Start");
Calendar c1 = Calendar.getInstance();
for (int i = 0; i < count; i ++) {
buf.append("THE QUICK BROWN FOX #");
buf.append(i);
buf.append(" JUMPS OVER THE LAZY DOG #");
buf.append(i);
buf.append(".\n");
}
Calendar c2 = Calendar.getInstance();
long diff = c2.getTimeInMillis() - c1.getTimeInMillis();
Log.d(TAG, "StringBuffer: End");
StringBuffer msg = new StringBuffer();
msg.append("StringBuffer: ");
msg.append(diff);
msg.append(" ms");
Log.d(TAG, msg.toString());
tvResult.setText(msg);
}
});
}
}
</pre><br />
<b>main.xml</b><br />
<pre class="brush: 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" >
<Button
android:id="@+id/string_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="String"
/>
<Button
android:id="@+id/string_buffer_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="StringBuffer"
/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/result_tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</ScrollView>
</LinearLayout>
</pre><br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>StringBufferTest1a</td></tr>
<tr><td>アプリケーション名:</td><td>StringBufferTest1a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.StringBufferTest1a</td></tr>
<tr><td>アクティビティーの作成:</td><td>StringBufferTest1aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0K1vcPzrOkFd3oqMD3SmNfRpHRkxqoWCURpxIc8Noj_LPZnjLo4bIUKp-pfNecSG7_cCosIIAozXeBIWew751ZB49gktsGDK4eailzpTyMVdlqG65ZRD_v4v7lSYr3WMuyiGDv0KJMIMM/s1600/StringBufferTest1a-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0K1vcPzrOkFd3oqMD3SmNfRpHRkxqoWCURpxIc8Noj_LPZnjLo4bIUKp-pfNecSG7_cCosIIAozXeBIWew751ZB49gktsGDK4eailzpTyMVdlqG65ZRD_v4v7lSYr3WMuyiGDv0KJMIMM/s320/StringBufferTest1a-1.png" width="214" /></a><br />
まずは「String」を実行してみましょう。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqFvxEdC-XkwOBLdv2Ui-Zn_MSEvxNeA3xCRgQJ5VbRUlZ-EzURs45inzJYWi_GL7IAARQUf_yY-ynrdhVwHV-NZuuKFzEI5LeWsa-AwuCJbguJW9toD8nEyPAFMBsnuaGFuUqpHVGEmKy/s1600/StringBufferTest1a-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqFvxEdC-XkwOBLdv2Ui-Zn_MSEvxNeA3xCRgQJ5VbRUlZ-EzURs45inzJYWi_GL7IAARQUf_yY-ynrdhVwHV-NZuuKFzEI5LeWsa-AwuCJbguJW9toD8nEyPAFMBsnuaGFuUqpHVGEmKy/s320/StringBufferTest1a-2.png" width="214" /></a><br />
<br />
<pre class="brush: xml">D/dalvikvm(529): GC_EXPLICIT freed 53K, 53% free 2569K/5379K, external 884K/1038K, paused 48ms
D/dalvikvm(529): GC_EXPLICIT freed 1K, 53% free 2567K/5379K, external 884K/1038K, paused 50ms
D/StringBufferTest1aActivity(529): String: Start
D/dalvikvm(529): GC_CONCURRENT freed 423K, 54% free 2596K/5639K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_CONCURRENT freed 509K, 55% free 2615K/5767K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_CONCURRENT freed 486K, 55% free 2621K/5767K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_CONCURRENT freed 485K, 55% free 2630K/5767K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_CONCURRENT freed 473K, 55% free 2637K/5767K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_CONCURRENT freed 435K, 55% free 2644K/5767K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_CONCURRENT freed 474K, 55% free 2635K/5767K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_CONCURRENT freed 458K, 55% free 2639K/5767K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_CONCURRENT freed 432K, 55% free 2644K/5767K, external 884K/1038K, paused 5ms+3ms
D/dalvikvm(529): GC_CONCURRENT freed 457K, 55% free 2647K/5767K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_CONCURRENT freed 419K, 54% free 2668K/5767K, external 884K/1038K, paused 5ms+3ms
D/dalvikvm(529): GC_CONCURRENT freed 502K, 55% free 2673K/5831K, external 884K/1038K, paused 5ms+3ms
D/dalvikvm(529): GC_CONCURRENT freed 478K, 54% free 2687K/5831K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_CONCURRENT freed 478K, 55% free 2662K/5831K, external 884K/1038K, paused 5ms+4ms
D/dalvikvm(529): GC_FOR_MALLOC freed 548K, 56% free 2592K/5831K, external 884K/1038K, paused 30ms
D/StringBufferTest1aActivity(529): String: End
D/StringBufferTest1aActivity(529): String: 2235 ms
</pre>2235ミリ秒かかって、その間にGCが15回も動いています。<br />
<br />
次は「StringBuffer」です。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3T0xkqvqT36JC8SxEZiQHMQJJ-GCkqIL1UaBRZ0rKF7rM9_F3vSg1M5GNE5NKc7henAwq-XsQFcpcG_z6-SsnwiPMqCJEcqP-ND34H8NePfL9njx2HxQRPi6zq-TpmRhm1DzzztPGMWNU/s1600/StringBufferTest1a-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3T0xkqvqT36JC8SxEZiQHMQJJ-GCkqIL1UaBRZ0rKF7rM9_F3vSg1M5GNE5NKc7henAwq-XsQFcpcG_z6-SsnwiPMqCJEcqP-ND34H8NePfL9njx2HxQRPi6zq-TpmRhm1DzzztPGMWNU/s320/StringBufferTest1a-3.png" width="214" /></a><br />
<br />
<pre class="brush: xml">D/dalvikvm(529): GC_EXPLICIT freed 241K, 56% free 2572K/5831K, external 884K/1038K, paused 51ms
D/dalvikvm(529): GC_EXPLICIT freed <1K, 56% free 2572K/5831K, external 884K/1038K, paused 44ms
D/StringBufferTest1aActivity(529): StringBuffer: Start
D/StringBufferTest1aActivity(529): StringBuffer: End
D/StringBufferTest1aActivity(529): StringBuffer: 297 ms
</pre>297ミリ秒で終わってしまいました。GCも動いていません。<br />
<br />
StringのほうはGCが動いているために遅いとも言えるかもしれませんが、いずれにしてもStringBufferのほうが効率が良いことがわかりますね。<br />
<br />
実行環境によってはあまり差がなかったりGCが動かなかったりするかもしれません。エミュレータでは差がはっきり出ますが、実際の端末では、あまり差がわからないかもしれません。その場合はループ回数を増やして試してみてください。実行時間に差が出ることがわかると思います。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-73075501584857856452012-05-01T18:04:00.045+09:002012-05-05T18:57:37.064+09:00Dialog (横幅を広げる)Dialogでメッセージを表示させると、横幅いっぱいに表示しようとしたのにメッセージの長さ程度の幅のダイアログになってしまいました。今回はダイアログの横幅を広げます。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<Button
android:id="@+id/normal_dialog_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Normal Dialog"
/>
<Button
android:id="@+id/wide_dialog_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Wide Dialog"
/>
</LinearLayout>
</pre>ボタンを2つ用意しています。「Normal Dialog」は普通にダイアログを表示して、「Wide Dialog」は横幅を広げてダイアログを表示するボタンです。<br />
<a name='more'></a><br />
<b>dialog.xml</b><br />
<pre class="brush: 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="wrap_content"
android:orientation="vertical"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="THE QUICK BROWN FOX"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="JUMPS OVER LAZY DOG"
/>
</LinearLayout>
</pre>ダイアログの内容は「THE QUICK BROWN FOX」「JUMPS OVER THE LAZY DOG」の2行です。<br />
<br />
<b>DialogTest2aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.DialogTest2a;
import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
public class DialogTest2aActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
((Button)findViewById(R.id.normal_dialog_btn)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openDialog(false);
}
});
((Button)findViewById(R.id.wide_dialog_btn)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openDialog(true);
}
});
}
private void openDialog(boolean bWide) {
Dialog dlg = new Dialog(DialogTest2aActivity.this);
dlg.setTitle("Quick Brown Fox");
dlg.setContentView(R.layout.dialog);
dlg.show();
if (bWide == true) {
Window win = dlg.getWindow();
WindowManager.LayoutParams lpCur = win.getAttributes();
WindowManager.LayoutParams lpNew = new WindowManager.LayoutParams();
lpNew.copyFrom(lpCur);
lpNew.width = WindowManager.LayoutParams.FILL_PARENT;
lpNew.height = WindowManager.LayoutParams.WRAP_CONTENT;
win.setAttributes(lpNew);
}
}
}
</pre>ダイアログの表示自体は同じようなものですので関数にしました。横幅を広げる処理は38-44行めです。<br />
<br />
35行めのdlg.show();でダイアログを表示し、38行めのdlg.getWindow();で表示中のウィンドウ情報(この場合はダイアログの情報)を取得します。<br />
<br />
39-41行めで、ダイアログのレイアウト情報を取得して、42-44行めで新しく作ったパラメータをセットします。XMLで指定したパラメータが効かないので、動的に指定しています。<br />
<br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>DialogTest2a</td></tr>
<tr><td>アプリケーション名:</td><td>DialogTest2a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.DialogTest2a</td></tr>
<tr><td>アクティビティーの作成:</td><td>DialogTest2aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx_RIERCPuXQmOBa8snTb_OPefn8xCIxVmuMSdsAM9mbA0r8qPqLzgMmisgP-sxuMR1xDjyrH65xLZcEAwTmHD1x4hsaVYCFd69Bz2XxZFhzXD4yCNbEbzC32sToTkrpmsPTDIQnZo0Yz9/s1600/DialogTest2a-1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx_RIERCPuXQmOBa8snTb_OPefn8xCIxVmuMSdsAM9mbA0r8qPqLzgMmisgP-sxuMR1xDjyrH65xLZcEAwTmHD1x4hsaVYCFd69Bz2XxZFhzXD4yCNbEbzC32sToTkrpmsPTDIQnZo0Yz9/s320/DialogTest2a-1.png" /></a></div>「Normal Dialog」をクリックすると・・・<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRiWj6fofnDzwvwffWK56UqR9rHA4LYbbnS44xxuHS9jamJCMj6SSIQ5zEXLhXfXi0akk-4-OeB-odIFgN3OPjKsII7KgL0AaUu3MTsiZlxEwy5aXdABOSldk4bsHuE0VH9iMOgWAsKDjm/s1600/DialogTest2a-2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRiWj6fofnDzwvwffWK56UqR9rHA4LYbbnS44xxuHS9jamJCMj6SSIQ5zEXLhXfXi0akk-4-OeB-odIFgN3OPjKsII7KgL0AaUu3MTsiZlxEwy5aXdABOSldk4bsHuE0VH9iMOgWAsKDjm/s320/DialogTest2a-2.png" /></a></div>ダイアログの横幅は、メッセージの長さ程度ですが、「Wide Dialog」の場合は・・・<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKYFqx4h-99jUsKabCFTZfKri8tUmNtrvE_o66V9BxVW1vO2NQhQytj0Yt49SBcq2AI_DU0y-c1aZ8Rd6z_9QrMzufVsAjURjObemLX4aUJ_XPVZq2yvgjy2VKNoWQqI7VMtLtQNwdkZqb/s1600/DialogTest2a-3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKYFqx4h-99jUsKabCFTZfKri8tUmNtrvE_o66V9BxVW1vO2NQhQytj0Yt49SBcq2AI_DU0y-c1aZ8Rd6z_9QrMzufVsAjURjObemLX4aUJ_XPVZq2yvgjy2VKNoWQqI7VMtLtQNwdkZqb/s320/DialogTest2a-3.png" /></a></div>横幅いっぱいのダイアログになりました。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-3820029120958729352012-04-25T17:52:00.009+09:002012-04-28T11:21:58.689+09:00Dialogメッセージを表示するために<a href="http://triware.blogspot.jp/2011/11/alertdialog.html">AlertDialog</a>クラスや、進捗状況を示すProgressDialogクラス(<a href="http://triware.blogspot.jp/2011/12/progressdialog.html">STYLE_SPINNER</a>/<a href="http://triware.blogspot.jp/2011/12/progressdialog_09.html">STYLE_HORIZONTAL</a>)を使いました。日付や時刻を選択する<a href="http://triware.blogspot.jp/2012/01/datepickerdialog.html">DatePickerDialog</a>クラスや<a href="http://triware.blogspot.jp/2012/01/timepickerdialog.html">TimePickerDialog</a>クラスも使いましたね。<br />
<br />
これらはDialogクラスを継承した派生クラスです。今回はDialogクラスを使ってメッセージを表示します。<br />
<br />
まず、メイン画面です。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
>
<Button
android:id="@+id/open_dialog_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Open Dialog"
/>
</LinearLayout></pre>ボタンをひとつ用意しています。<br />
<a name='more'></a><br />
<b>DialogTest1aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.DialogTest1a;
import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
public class DialogTest1aActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
((Button)findViewById(R.id.open_dialog_btn)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Dialog dlg = new Dialog(DialogTest1aActivity.this);
dlg.setTitle("Quick Brown Fox");
dlg.setContentView(R.layout.dialog);
dlg.show();
}
});
}
}
</pre>ボタンがクリックされたら、「Quick Brown Fox」というタイトルのダイアログを表示します。ダイアログの内容はdialog.xmlです。<br />
<br />
<b>dialog.xml</b><br />
<pre class="brush: 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="wrap_content"
android:orientation="vertical"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="THE QUICK BROWN FOX"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="JUMPS OVER THE LAZY DOG"
/>
</LinearLayout>
</pre>ダイアログに表示する内容です。「THE QUICK BROWN FOX」と「JUMPS OVER THE LAZY DOG」を2行で表示します。<br />
<br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>DialogTest1a</td></tr>
<tr><td>アプリケーション名:</td><td>DialogTest1a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.DialogTest1a</td></tr>
<tr><td>アクティビティーの作成:</td><td>DialogTest1aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>実行結果</b><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwCsTdNL3fJ2PqGkxCc7HANGP3yAJvZ2R4A9DEWZlCflo5g7TFo4-FvQSnKMeiSMPnWsIkLz3wSJPZAkCbuNTzbkVYafDOPYo8a8sv8HuvoXttt3PK0MgDBtta9Bz9au6s15VJSRm-0HLc/s1600/DialogTest1a-1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwCsTdNL3fJ2PqGkxCc7HANGP3yAJvZ2R4A9DEWZlCflo5g7TFo4-FvQSnKMeiSMPnWsIkLz3wSJPZAkCbuNTzbkVYafDOPYo8a8sv8HuvoXttt3PK0MgDBtta9Bz9au6s15VJSRm-0HLc/s320/DialogTest1a-1.png" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrrziPX1PWi_DbPMAFXIrbVx8p3rr9lIfGpCOulkJPbTkpsxYK0dXXkqeiIfCiUL77bSMxlwKrdjAWXv3iiyRGzEGtsbdRUD-MLlKm8xupT3RAlZP7v6hGQ_d2hjd_xIFMH_h4acRYlyhV/s1600/DialogTest1a-2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrrziPX1PWi_DbPMAFXIrbVx8p3rr9lIfGpCOulkJPbTkpsxYK0dXXkqeiIfCiUL77bSMxlwKrdjAWXv3iiyRGzEGtsbdRUD-MLlKm8xupT3RAlZP7v6hGQ_d2hjd_xIFMH_h4acRYlyhV/s320/DialogTest1a-2.png" /></a></div>「Open Dialog」ボタンをクリックすると、右の画像のように、ダイアログが表示されました。<br />
<br />
<br />
・・・ちょっと待ってください。dialog.xmlではTextViewの幅として「fill_parent」を指定していますね。この表示は「wrap_content」を指定したもののように見えます。<br />
<br />
でも、どうやら現状では(少なくともAndroid 4.0までは)このような表示になってしまうようです。<br />
<br />
だからといって横幅いっぱいに表示する方法がないわけではありません。次回はその方法をご紹介します。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-29359955066755205672012-04-18T17:09:00.068+09:002012-10-17T00:02:35.717+09:00Activityの呼び出し(4)アクティビティに値を渡す方法は<a href="http://triware.blogspot.jp/2012/04/activity3.html">前回</a>紹介しましたので、今回はその逆、呼び出したアクティビティから値を受け取る方法を紹介します。<br />
<br />
呼び出し元は、前々回の「<a href="http://triware.blogspot.jp/2012/04/activity2.html">Activityの呼び出し(2)</a>」と同じく、startActivityForResult()とonActivityResult()を使います。<br />
<br />
いつもとは順番が違いますが、まず呼び出される側のソースから。<br />
<br />
<b>SubActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ActivityTest4a;
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class SubActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sub);
Intent intent = getIntent();
String pkg = getPackageName();
String buf = intent.getStringExtra(pkg + ".input");
EditText et = (EditText)findViewById(R.id.text_et);
et.setText(buf);
Button btnClose = (Button)findViewById(R.id.close_btn);
btnClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText et = (EditText)findViewById(R.id.text_et);
String buf = et.getText().toString();
Intent intent = new Intent();
String pkg = getPackageName();
intent.putExtra(pkg + ".return", buf);
setResult(RESULT_OK, intent);
finish();
}
});
}
}
</pre><a name='more'></a><br />
ボタンがクリックされたら、テキストを取得して(26-27行目)、インテントにセットします(28-30行目)。インテントはsetResult()の第2引数に指定して、呼び出し元へ引き渡します(31行目)。<br />
<br />
<b>ActivityTest4aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ActivityTest4a;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class ActivityTest4aActivity extends Activity {
private static final int REQUEST_SUB_ACTIVITY = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnOpen = (Button)findViewById(R.id.open_btn);
btnOpen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String pkg = getPackageName();
EditText et = (EditText)findViewById(R.id.text_et);
String buf = et.getText().toString();
Intent intent = new Intent();
intent.setClass(getApplicationContext(), SubActivity.class);
intent.putExtra(pkg + ".input", buf);
startActivityForResult(intent, REQUEST_SUB_ACTIVITY);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SUB_ACTIVITY && resultCode == RESULT_OK) {
String pkg = getPackageName();
String buf = data.getStringExtra(pkg + ".return");
Toast.makeText(getApplicationContext(), buf, Toast.LENGTH_LONG).show();
}
}
}
</pre>呼び出し元です。onActivityResult()の第2引数には、setResult()の第1引数にセットされた「RESULT_OK」が入っています。onActivityResult()の第3引数には、setResult()の第2引数でセットされたインテントが入っています。このインテントからキーワードを指定して値を取得します。<br />
<br />
レイアウトファイルとマニフェストファイルは、これまでと同様です。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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="wrap_content"
android:layout_height="wrap_content"
android:text="[Main Activity] Please input your message:"
/>
<EditText
android:id="@+id/text_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"
/>
<Button
android:id="@+id/open_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="OPEN"
/>
</LinearLayout>
</pre><br />
<b>sub.xml</b><br />
<pre class="brush: 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="wrap_content"
android:layout_height="wrap_content"
android:text="[Sub Activity] Received message:"
/>
<EditText
android:id="@+id/text_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"
/>
<Button
android:id="@+id/close_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="CLOSE"
/>
</LinearLayout>
</pre><br />
<b>AndroidManifest.xml</b><br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.co.triware.samples.ActivityTest4a"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".ActivityTest4aActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SubActivity" />
</application>
</manifest>
</pre><br />
<b>実行結果</b><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaYtvQu1JKgZIjsYn08fVm-d4w-OBVe3TYx1UdgwVQbT6Lcal-bOi0xUXAjTOCeA8kVeBVKTIX7layvoTsL0eIl4xE1Fi4PuMrFvyXsaZFzlLqFnL0zg1R7ZTs9_JA23aqUKKc-LVsAXhN/s1600/ActivityTest4a-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaYtvQu1JKgZIjsYn08fVm-d4w-OBVe3TYx1UdgwVQbT6Lcal-bOi0xUXAjTOCeA8kVeBVKTIX7layvoTsL0eIl4xE1Fi4PuMrFvyXsaZFzlLqFnL0zg1R7ZTs9_JA23aqUKKc-LVsAXhN/s320/ActivityTest4a-1.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-2_D0N30hpDl65mQ1W_4Nm3Dlhs8sdmKrzIAfWX1eOgdNFbZnVfTdGL5-AF2oBFBobB7C76tuyc9CLqButsOYsX0JlYzJ2dKLxCkI3Qilr8gjoeQR3XNfMusSDx0xKn1iYFzbrdM8KWqO/s1600/ActivityTest4a-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-2_D0N30hpDl65mQ1W_4Nm3Dlhs8sdmKrzIAfWX1eOgdNFbZnVfTdGL5-AF2oBFBobB7C76tuyc9CLqButsOYsX0JlYzJ2dKLxCkI3Qilr8gjoeQR3XNfMusSDx0xKn1iYFzbrdM8KWqO/s320/ActivityTest4a-2.png" width="214" /></a></div>MainActivityで入力したテキストが、SubActivityで表示されています。ここまでは前回と同じですね。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2mZjC0_G_WT4kE8QHfOIdN4z_-ItgUGHIsPO0Fhaxok1akccqv4yfrbV012VX5UOpnMJF_2Q0w4708hANOvVdCJxFTCbe9gfU4tagLQb2MS5gNkyKL4bG9bqEdxFGq7wI2UaDvHzvntMH/s1600/ActivityTest4a-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2mZjC0_G_WT4kE8QHfOIdN4z_-ItgUGHIsPO0Fhaxok1akccqv4yfrbV012VX5UOpnMJF_2Q0w4708hANOvVdCJxFTCbe9gfU4tagLQb2MS5gNkyKL4bG9bqEdxFGq7wI2UaDvHzvntMH/s320/ActivityTest4a-3.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirIMGvRX1_zlUqtVLD0hHaOb5BTQIYj4FVAb5utPjdzSzr6pI2BDB2k29-3T8fMWl8DjO35l6zKAb7x-Y4crLSatWFvWMijxQ1BhqVuK27SHKyUQr39Ko7RRraxur4skbCHhxKwrqTB0bp/s1600/ActivityTest4a-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirIMGvRX1_zlUqtVLD0hHaOb5BTQIYj4FVAb5utPjdzSzr6pI2BDB2k29-3T8fMWl8DjO35l6zKAb7x-Y4crLSatWFvWMijxQ1BhqVuK27SHKyUQr39Ko7RRraxur4skbCHhxKwrqTB0bp/s320/ActivityTest4a-4.png" width="214" /></a></div>SubActivtyで入力したテキストを、MainActivityで受け取ってトースト表示しています。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-29426710473023098922012-04-11T13:42:00.105+09:002012-04-18T07:59:52.994+09:00Activityの呼び出し(3)アクティビティを呼び出したり、アクティビティから戻り値を取得する方法は、前回までに説明しました。<br />
今回は、呼び出した先のアクティビティに値を渡す方法を紹介します。<br />
<br />
値を渡すには、インテント(のインスタンス)に値をセットしてstartActivity()やstartActivityForResult()を呼び出します。インテントに値をセットする方法は、putExtra()メソッドに数値や文字列、配列等を、キーワードと共に指定します。<br />
<br />
以下は、テキストを入力して、それを別のアクティビティで表示するサンプルです。<br />
<br />
<b>ActivityTest3aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ActivityTest3a;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class ActivityTest3aActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnOpen = (Button)findViewById(R.id.open_btn);
btnOpen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText et = (EditText)findViewById(R.id.text_et);
String buf = et.getText().toString();
Intent intent = new Intent();
intent.setClass(getApplicationContext(), SubActivity.class);
String pkg = getPackageName();
intent.putExtra(pkg + ".input", buf);
startActivity(intent);
}
});
}
}
</pre><a name='more'></a><br />
20-21行目で入力したテキストを取得して、24-25行目でインテントにセットしています。<br />
<br />
putExtra()の第1引数には、キーワードとも言うべき名前をセットします。これは単に"input"のような文字列でも動いてくれますが、<a href="http://developer.android.com/reference/android/content/Intent.html#putExtra(java.lang.String, java.lang.String)" target="_blank">リファレンス</a>を見ると、<br />
<blockquote>The name must include a package prefix, for example the app com.android.contacts would use names like "com.android.contacts.ShowAll".</blockquote>と、パッケージ名を含めるように書いてありますのでそのようにしました。<br />
<br />
putExtra()の第2引数は、今回はString型の変数を指定しています。数値であればint型やfloat型の変数を指定します。putExtra()は、引数(の型)が異なるメソッドが多重定義(オーバーロード)してありますので、セットしたい型がString以外であってもputExtra()を使います。<br />
<br />
<b>SubActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ActivityTest3a;
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class SubActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sub);
Intent intent = getIntent();
String pkg = getPackageName();
String buf = intent.getStringExtra(pkg + ".input");
EditText et = (EditText)findViewById(R.id.text_et);
et.setText(buf);
Button btnClose = (Button)findViewById(R.id.close_btn);
btnClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
</pre>16-18行目で、値を受け取ります。値をセットするときはputExtra()を使いましたが、取得はgetです。型は自動的にはわかりませんので、型名を含めたメソッド名になります。今回はStringですので、getStringExtra()になります。引数は、呼び出し元で指定した名前ですので、今回の場合は「パッケージ名」+「.input」です。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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="wrap_content"
android:layout_height="wrap_content"
android:text="[Main Activity] Please input your message:"
/>
<EditText
android:id="@+id/text_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"
/>
<Button
android:id="@+id/open_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="OPEN"
/>
</LinearLayout>
</pre>テキストを入力するためのEditTextを用意します。<br />
<br />
<b>sub.xml</b><br />
<pre class="brush: 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="wrap_content"
android:layout_height="wrap_content"
android:text="[Sub Activity] Received message:"
/>
<EditText
android:id="@+id/text_et"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"
/>
<Button
android:id="@+id/close_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="CLOSE"
/>
</LinearLayout>
</pre>受け取ったテキストを表示するためにEditTextを用意します(TextViewでも構いません)。<br />
<br />
<b>AndroidManifest.xml</b><br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.co.triware.samples.ActivityTest3a"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".ActivityTest3aActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SubActivity" />
</application>
</manifest>
</pre>アクティビティを追加しましたので、忘れずにマニフェストファイルにも追記します(22行目)。<br />
<br />
<b>実行結果</b><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnjR-N9x6x2thpbXBYGluLHasuRSep-ubMsVJZj570EqWbY5tCpXvO8VSuP-W9mI6e1tLlmmrgkQncpJFa5uJyUqb5yXsfqbcs4jv2UmJt0omr5BVcYQ3q7ZmMqs_1Mf2OSzuoaKEe2_wu/s1600/ActivityTest3a-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnjR-N9x6x2thpbXBYGluLHasuRSep-ubMsVJZj570EqWbY5tCpXvO8VSuP-W9mI6e1tLlmmrgkQncpJFa5uJyUqb5yXsfqbcs4jv2UmJt0omr5BVcYQ3q7ZmMqs_1Mf2OSzuoaKEe2_wu/s320/ActivityTest3a-1.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZj1dFXtgiv6HMNkOV6cdyO1cVWdRO_jumv97FYyrC462MRD8vHQ4ZQr9DV2haPPAR-WbrVAzQy2MbfugJskZBPN_PqZdfvE8_mRH-yApTNNsEgOd037ILi6cwrGmdICdSzQCQbAFUdkK7/s1600/ActivityTest3a-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZj1dFXtgiv6HMNkOV6cdyO1cVWdRO_jumv97FYyrC462MRD8vHQ4ZQr9DV2haPPAR-WbrVAzQy2MbfugJskZBPN_PqZdfvE8_mRH-yApTNNsEgOd037ILi6cwrGmdICdSzQCQbAFUdkK7/s320/ActivityTest3a-2.png" width="214" /></a></div>MainActivityで入力した文字列が、SubActivityで表示されています。<br />
<br />
次回は、呼び出し先のアクティビティから戻ってきた際に、値を受け取るサンプルを作ります。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-18832271871148887782012-04-04T18:46:00.001+09:002012-04-21T03:22:55.461+09:00Activityの呼び出し(2)アクティビティを呼び出すにはstartActivity()メソッドを使いました。これは単純にアクティビティを呼び出すだけのものでした。<br />
呼び出した先のアクティビティが終了した状況、例えば一通りの処理が完了して終了したのか、キャンセルして終了したのかを知りたい時は、startActivityForResult()メソッドを使います。<br />
<br />
<b>ActivityTest2aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ActivityTest2a;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class ActivityTest2aActivity extends Activity {
private static final String TAG = "MainActivity";
private static final int REQUEST_SUB_ACTIVITY = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnOpen = (Button)findViewById(R.id.open_btn);
btnOpen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "OPEN button clicked!");
Intent intent = new Intent();
intent.setClass(getApplicationContext(), SubActivity.class);
startActivityForResult(intent, REQUEST_SUB_ACTIVITY);
Log.d(TAG, "after startActivityForResult()");
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SUB_ACTIVITY) {
String buf = "Unknown";
switch (resultCode) {
case RESULT_OK:
buf = "OK";
break;
case RESULT_CANCELED:
buf = "Cancel";
break;
default:
break;
}
Log.d(TAG, "onActivityResult: " + buf);
Toast.makeText(getApplicationContext(), buf, Toast.LENGTH_LONG).show();
}
}
}
</pre><a name='more'></a><br />
onActivityResult()は、呼び出し先のアクティビティが終了すると呼び出されます。startActivityForResult()の第2引数で指定したリクエストコードがonActivityResult()の第1引数のrequestCodeに入っていますので、どのアクティビティから戻ってきたのか判別できます。そして第2引数のresultCodeに戻り値が入っています。第3引数についてはまた別の機会に。<br />
<br />
<a href="http://triware.blogspot.jp/2012/03/activity1.html">前回</a>のstartActivity()も同様なのですが、startActivity()やstartActivityForResult()は別アクティビティを呼び出して、それが終了するまで待つのではなく、そのまま次の処理に移ります。<br />
ボタンをクリックして、"after startActivityForResult()"のログが出力されることを確認してみてください。<br />
<br />
<b>SubActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ActivityTest2a;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class SubActivity extends Activity {
private static final String TAG = "SubActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sub);
Button btnOK = (Button)findViewById(R.id.ok_btn);
btnOK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "OK button clicked!");
setResult(RESULT_OK);
finish();
Log.d(TAG, "OK: finished!");
}
});
Button btnCancel = (Button)findViewById(R.id.cancel_btn);
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Cancel button clicked!");
setResult(RESULT_CANCELED);
finish();
Log.d(TAG, "Cancel: finished!");
}
});
Button btnUndef = (Button)findViewById(R.id.undefine_btn);
btnUndef.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Undefine button clicked!");
// setResult()を呼ばない
finish();
Log.d(TAG, "Undefine: finished!");
}
});
}
}
</pre>SubActivityには、3種類のボタンを用意しました。「OK」ボタンは戻り値にRESULT_OKを、「Cancel」ボタンはRESULT_CANCELEDを、setResult()メソッドを使ってセットします。「Undefine」ボタンには戻り値をセットしない場合はどうなるかを確認するため、setResult()を呼び出していません。<br />
<br />
RESULT_OKやRESULT_CANCELEDはActivityクラスで宣言されています。これら以外の戻り値を返したい場合は、RESULT_FIRST_USERから始まる数値を定義して使います。<br />
<br />
(Activity.classより)<br />
<blockquote>public static final int RESULT_CANCELED = 0;<br />
public static final int RESULT_OK = -1;<br />
public static final int RESULT_FIRST_USER = 1;<br />
</blockquote><br />
ところで、<a href="http://triware.blogspot.jp/2012/03/activity1.html">前回の記事</a>では、finish()は「自アクティビティを終了するためのメソッド」としか説明しませんでしたが、実はfinish()を呼び出してもすぐにアクティビティが終了するわけではありません。「アクティビティ終了宣言!」のようなもので、プログラムの流れとしてはこのあとまだ処理は続きます。ボタンをクリックすると、finish()メソッドを呼び出した後の"finished!"のログが出てきますので、確認してみてください。<br />
<br />
プロジェクトの設定とXMLレイアウトファイルは次の通りです。<br />
<br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>ActivityTest2a</td></tr>
<tr><td>アプリケーション名:</td><td>ActivityTest2a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.ActivityTest2a</td></tr>
<tr><td>アクティビティーの作成:</td><td>ActivityTest2aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
android:gravity="center"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:text="Main Activity"
/>
<Button
android:id="@+id/open_btn"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:text="OPEN"
/>
</LinearLayout>
</pre><br />
<b>sub.xml</b><br />
<pre class="brush: 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"
android:gravity="center"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:text="Sub Activity"
/>
<Button
android:id="@+id/ok_btn"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:text="OK"
/>
<Button
android:id="@+id/cancel_btn"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:text="Cancel"
/>
<Button
android:id="@+id/undefine_btn"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:text="Undefine"
/>
</LinearLayout>
</pre><br />
忘れずにマニフェストファイルも変更します。<br />
<br />
<b>AndroidManifest.xml</b><br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.co.triware.samples.ActivityTest2a"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".ActivityTest2aActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SubActivity" />
</application>
</manifest>
</pre><br />
<b>実行結果</b><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisq1X4EqxeZcyAlkGuKFXvQn92W79ogW8aoJOe_ug9bFmV2_juwqflVo8Wd0qRlR-awCtXOI8uXnDX5-UNdxWRqKZjR9RWmLR5ruyx8sPvRkBIAa5dIOt5S41K0DZa8j_AFcc1T2W5yQm4/s1600/ActivityTest2a-1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisq1X4EqxeZcyAlkGuKFXvQn92W79ogW8aoJOe_ug9bFmV2_juwqflVo8Wd0qRlR-awCtXOI8uXnDX5-UNdxWRqKZjR9RWmLR5ruyx8sPvRkBIAa5dIOt5S41K0DZa8j_AFcc1T2W5yQm4/s400/ActivityTest2a-1.png" /></a></div>「OPEN」でSubActivityを呼び出します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLA_OHv3TdLA1Jf8TEV0TiF5JBdllPPdWEliJ0gP6aD50kt70Fhb0KxsZxjtL01WEnF5uxBfrLvEj8rdI3aqfWjq1IaIgcCBv2G7T2y8q2GBJrYbfr72gHVoAudY_mF81iMq8H73IKkQys/s1600/ActivityTest2a-2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLA_OHv3TdLA1Jf8TEV0TiF5JBdllPPdWEliJ0gP6aD50kt70Fhb0KxsZxjtL01WEnF5uxBfrLvEj8rdI3aqfWjq1IaIgcCBv2G7T2y8q2GBJrYbfr72gHVoAudY_mF81iMq8H73IKkQys/s400/ActivityTest2a-2.png" /></a></div>まず、「OK」をクリックすると・・・<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6w9LPSYwSpCGIiZJDXqXbR5pPzgXyR4E7ptOM2eX2A-qo99wWQfp6lYPxOqrM1DIMyGrBDJ2Cq-S2a1fv_D02w2UoSwB1ZjnNcWA-2jr5eoUjn46Q6CAK41JZv3Rb8QLBPbj7fBWgwXpE/s1600/ActivityTest2a-3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6w9LPSYwSpCGIiZJDXqXbR5pPzgXyR4E7ptOM2eX2A-qo99wWQfp6lYPxOqrM1DIMyGrBDJ2Cq-S2a1fv_D02w2UoSwB1ZjnNcWA-2jr5eoUjn46Q6CAK41JZv3Rb8QLBPbj7fBWgwXpE/s400/ActivityTest2a-3.png" /></a></div>MainActivityに戻って、「OK」をトースト表示します。onActivityResult()で、ちゃんとRESULT_OKが認識できました。<br />
<br />
このときのログは、<br />
<blockquote>D/MainActivity(284): OPEN button clicked!<br />
D/MainActivity(284): after startActivityForResult()<br />
D/SubActivity(284): OK button clicked!<br />
D/SubActivity(284): OK: finished!<br />
D/MainActivity(284): onActivityResult: OK</blockquote>finish()の後のログも出力されています。<br />
<br />
次は「Cancel」です。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBm8Pi5rNTzlh11_tAyNg4IXh1Lh5zS-Jm7YPscng5zCzqDGQdZ3h2qRlXVOOPv-Sy7ZCwLd35JdRcRpsgdGm8dJqDhagwX0Q8gioSULsJb5CtKd3Ilq_RTdM6h9A2_bLVXs04hqK62Aab/s1600/ActivityTest2a-4.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBm8Pi5rNTzlh11_tAyNg4IXh1Lh5zS-Jm7YPscng5zCzqDGQdZ3h2qRlXVOOPv-Sy7ZCwLd35JdRcRpsgdGm8dJqDhagwX0Q8gioSULsJb5CtKd3Ilq_RTdM6h9A2_bLVXs04hqK62Aab/s400/ActivityTest2a-4.png" /></a></div><blockquote>D/SubActivity(284): Cancel button clicked!<br />
D/SubActivity(284): Cancel: finished!<br />
D/MainActivity(284): onActivityResult: Cancel</blockquote>onActivityResultで戻り値がRESULT_CANCELEDと認識できました。<br />
<br />
最後はUndefineです。<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMv7o5AeFlZiFgg2A9EMz1xxbjmFS0xkV0oXXswpaJltMx19Re061ez6vitnOvr-840R0pwilAOdAhACyJ3XH2iugKL6WeIV8ZSC5-0Iag9ToCIh4DPH6inLVqobhx1iLSwbzwGect4D9n/s1600/ActivityTest2a-5.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMv7o5AeFlZiFgg2A9EMz1xxbjmFS0xkV0oXXswpaJltMx19Re061ez6vitnOvr-840R0pwilAOdAhACyJ3XH2iugKL6WeIV8ZSC5-0Iag9ToCIh4DPH6inLVqobhx1iLSwbzwGect4D9n/s400/ActivityTest2a-5.png" /></a></div><blockquote>D/SubActivity(284): Undefine button clicked!<br />
D/SubActivity(284): Undefine: finished!<br />
D/MainActivity(284): onActivityResult: Cancel</blockquote>キャンセル扱いになりましたね。あと、Backキーを押すとどうなるかもぜひ試してみてください。<br />
<br />
<br />
次回は、呼び出し先のアクティビティに値を渡すサンプルを作ります。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4845729788956807219.post-26535865828927051542012-03-28T16:43:00.081+09:002012-10-17T00:00:59.966+09:00Activityの呼び出し(1)これまでのサンプルは1つのアクティビティ(画面)を使ったものばかりでした。今回はアクティビティを切り替えてみます。<br />
<br />
まずは単純にアクティビティを切り替えるだけ。データの受け渡し等は考慮しないパターンです。Intentクラスでどのアクティビティを呼ぶか設定して、startActivity()メソッドでそのアクティビティを呼び出します。<br />
<br />
<b>ActivityTest1aActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ActivityTest1a;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class ActivityTest1aActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnOpen = (Button)findViewById(R.id.open_btn);
btnOpen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(getApplicationContext(), SubActivity.class);
startActivity(intent);
}
});
}
}
</pre><a name='more'></a><br />
<b>SubActivity.java</b><br />
<pre class="brush: java">package jp.co.triware.samples.ActivityTest1a;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class SubActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sub);
Button btnClose = (Button)findViewById(R.id.close_btn);
btnClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
</pre><br />
MainActivity (ActivityTest1a.java)は最初に表示する画面です。ボタンをクリックしたらSubActivity(.java)を呼び出します。<br />
呼び出される側のSubActivityは、これまでに作ってきたサンプル(アクティビティ)と作りはなんら変わりありません。ボタンをクリックしたときに、finish()メソッドを呼び出していますが、これは自アクティビティを終了するためのメソッドです。<br />
<br />
プロジェクトの設定とXMLレイアウトファイルは次の通りです。<br />
<br />
<b>Androidプロジェクトの設定</b><br />
<blockquote><table><tbody>
<tr><td>プロジェクト名:</td><td>ActivityTest1a</td></tr>
<tr><td>アプリケーション名:</td><td>ActivityTest1a</td></tr>
<tr><td>パッケージ名:</td><td>jp.co.triware.samples.ActivityTest1a</td></tr>
<tr><td>アクティビティーの作成:</td><td>ActivityTest1aActivity</td></tr>
</tbody></table></blockquote>ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。<br />
<br />
<b>main.xml</b><br />
<pre class="brush: 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"
android:gravity="center"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Main Activity"
/>
<Button
android:id="@+id/open_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OPEN"
/>
</LinearLayout>
</pre><br />
<b>sub.xml</b><br />
<pre class="brush: 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"
android:gravity="center"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sub Activity"
/>
<Button
android:id="@+id/close_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CLOSE"
/>
</LinearLayout>
</pre><br />
XMLレイアウトファイルもこれまでに作ったものと同じですね。<br />
<br />
さて、ここで注意すべき点がひとつあります。アクティビティを追加すると、それをマニフェストファイルに記述しなくてはなりません。<br />
<br />
<b>AndroidManifest.xml</b><br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.co.triware.samples.ActivityTest1a"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".ActivityTest1aActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SubActivity" />
</application>
</manifest>
</pre><br />
「<activity android:name=".SubActivity" />」を追加しました。これを記述しないと、実行時にアクティビティが見つからないというエラーが発生します。<br />
<br />
<b>実行結果</b><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikz10eI8zshnS9PDKuAvFyCRb47gZppN0Q_-qz4FCKSpocAijrj8B-4_nvnmpjTvpOtMiRlcbTNH0YMNO5lBMEyM-P9lCfR1-6SffQJ_6aZBB6nwLZbeGT4q-6FGMB2M4OORxpBs8Ru73X/s1600/ActivityTest1a-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikz10eI8zshnS9PDKuAvFyCRb47gZppN0Q_-qz4FCKSpocAijrj8B-4_nvnmpjTvpOtMiRlcbTNH0YMNO5lBMEyM-P9lCfR1-6SffQJ_6aZBB6nwLZbeGT4q-6FGMB2M4OORxpBs8Ru73X/s320/ActivityTest1a-1.png" width="214" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0SdxYqqO1NGtmnhxtNyR2RvnviGx7nUHBl9eMZaeZ8fjYW0CMSbw9gCf6oNp_d-fMRDTtFKWJNvuTGoXORl_J4X75QGg_hLA6LgqtWHCHfFswds8iC0pBjGQ2TIw6m_pk9o9NDaj1jrfg/s1600/ActivityTest1a-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0SdxYqqO1NGtmnhxtNyR2RvnviGx7nUHBl9eMZaeZ8fjYW0CMSbw9gCf6oNp_d-fMRDTtFKWJNvuTGoXORl_J4X75QGg_hLA6LgqtWHCHfFswds8iC0pBjGQ2TIw6m_pk9o9NDaj1jrfg/s320/ActivityTest1a-2.png" width="214" /></a></div>「Main Activity」画面の「OPEN」をクリックすると「Sub Activity」画面が表示されます。「Sub Activity」画面の「CLOSE」をクリックすると「Sub Activity」画面が閉じて、「Main Activity」画面に戻ります。<br />
<br />
<br />
次回は、呼び出したアクティビティから「戻り値」を取得するためのサンプルを作る予定です。Unknownnoreply@blogger.com0