Androidでボタンに画像をセット

Androidでボタンに画像をセット

ボタンに画像をセットするなら
ImageButtonを使う

まずは、レイアウトファイルてわ設定

<ImageButton
android:id="@+id/imgBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/ic_launcher"/>

次にImageButtonのクリックイベント設定
これはJavaで書く

これほ、ImageButtonに対して
setOnClickListenerをセットする

Button ibtn = (Button)findViewById(R.id.imgBtn);
ibtn.setOnClickListener(new onClickListener(

@Override
public void onClick(View v){
Toast.makeText(MainActivity.this,"ImageButtonをクリックしました",Toast.LENGTH_SHORT).show();
}
));

ButtonとImageButtonの違いは、
アイコンボタンを作るときに違いがでる

Buttonでも
background=””

アイコン画像をセットすればアイコンボタンみたいになる
ただし
端末の大きさに合わせてボタンが伸びれば
そのぶん、画像も延びてしまう
さらに、背景に設定しているため
背景色の変更ができない

9patchを使ったり、アイコンの背景を透明にすれば対処できなくはないけど
手間がかかる

これに対してImageButtonを使えば
画像は src=””
背景は background=””
と分かれるため、管理しやすい
あと、src=””では
scaleType=””で伸縮方法の設定もできるので、
画像がボタンのサイズに伸びないようにできる

ContentProviderクラスについて

ContentProviderクラスについて

ContentProviderは、アプリにコンテンツを提供するAndroidの基本的な部分の一つ

コンテンツをカプセル化し
単一のContentProviderインターフェースをアプリに提供する

ContentProviderは、データを複数のアプリで共有するのに必須

例として、複数のアプリで使われる連絡先データは
ContentProviderに保存されなければならない

他のアプリとデータ共有しないのなら
SQLiteDatabaseで直接DB操作すればいい

ContentProviderを通じてリクエストされると
システムはURIクラスに対する権限を調べ
権限があるリクエストだけContentProviderへ渡す

ContentProviderは、
要求されたものに対して解析することができる

URIクラスを解析するのを助けるものとして
URIMatcherクラスがある

実装するべき主なメソッドとしては

onCreate()
プロバイダーの初期化

query(Uri,String[], String)
呼び出し者にデータを返す

insert(Uri,ContentValues)
ContentProviderへデータを新規追加する

update(Uri,ContentValues,String,String[])
ContentProviderにあるデータを更新する

delete(Uri,String,String[])
ContentProviderのデータを削除する

getType(Uri)
ContentProviderデータのMIMEタイプを返す

次にスレッドについて
データにアクセスするメソッドの
insert(Uri,ContentValues)
とか
update(Uri,ContentValues,String,String[])
などは、複数のスレッドから呼ばれる可能性があるため
スレッドセーフである必要がある

それ以外のスレッド
例えば、onCreate()などは
アプリのメインスレッドからのみ呼ばれるので
長時間処理を避ける必要がある

ContentResolverへのリクエストは、自動的に
適切なContentProviderInstanceへ配送されるため
サブクラスはプロセスをまたぐ呼び出しについて
詳細を気にする必要はない

API level 16で追加された項目は

インターフェース
android.content.ComponentCallbacks2を継承する

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal)
の追加

関連するフィーチャーは
ContentProvider.PipeDataWriter


これは、パイプにデータのストリームを書き出すインターフェース

コンストラクタは、
public ContentProvider()
これは、ContentProviderのインスタンスを返す

Android Serviceの定数

Android Serviceの定数

public static finalint START_CONTINUATION_MASK
ビットは、
onStartCommand(Intent,int,int)によって返され
killされた場合にサービスを継続する方法を説明する

説明は
START_STICKY
START_NOT_STICKY
START_REDELIVER_INTENT
START_STICKY_COMPATIBILITY
のいずれかになる

public static final int START_FLAG_REDELIVERY
このフラグは
サービスが以前に
START_REDELIVER_INTENT
を返したけど
そのIntentでstopSelf(int)を呼びだす前にkillされたので
Intentが依然配信されたものを再配信するときに
onStartCommand(Intent,int,int)の引数にセットされる

public static final int START_FLAG_RETRY
オリジナルは届かなかったか、
onStartCommand(Intent,int,int)から戻らなかったため
Intentがretryされるときに
onStartCommand(Intent,int,int)の引数にセットされる

public static final int START_NOT_STICKY
onStartCommand(Intent,int,int)から返される定数
サービスが開始されている間
つまり
onStartCommand(Intent,int,int)から戻ってきた後に
サービスのプロセスがkillされ
そこに配信するための新しい開始Intentがない場合
サービス開始状態から外し
Context.startService(Intent)
への今後の明示的な呼び出しまで再生成されなくなる

public static final int START_REDELIVER_INTENT
onStartCommand(Intent,int,int)から返される定数
サービスが開始されている間
つまり、
onStartCommand(Intent,int,int)から戻ってきた後に
サービスのプロセスがkillされた場合
サービスが再起動し、最後に配信されたIntentを
onStartCommand(Intent,int,int)を経由して再配信するためにスケジュールされる

public static final int START_STICKY
onStartCommand(Intent,int,int)から返される定数
サービスが開始されている間、
つまり
onStartCommand(Intent,int,int)から戻ってきた後に
サービスのプロセスがkillされた場合
サービスを開始状態のままにするが
配信されたIntentを保持しない

public static final int START_STICKY_COMPATIBILITY
onStartCommand(Intent,int,int)から返される定数
START_STICKYの互換バージョンになる
これは、killされた後に
onStartCommand(Intent,int,int)が呼び出されることを保証しない

Android Service関連メソッド

Android Service関連メソッド

public final Application getApplication()
このサービスを所有するアプリを返す

public abstract IBinder onBind(Intent intent)
サービスへの通信チャネルを返す
クライアントがサービスにBindできないならnullを返す

引数のintentは、Context.bindService()に与えられたこのサービスにbindするために使われるIntent

戻り値は、クライアントがサービスを呼び出すことができるIBinder

public void onConfigurationChanged(Configuration newConfig)
コンポーネントの実行中にデバイスのconfigurationが変更されると
システムにより呼び出される

Activityや他のコンポーネントとは違い
構成変更のときに再起動されないのて注意

引数のnewConfigは、新しいデバイスの設定

public void onCreate()
サービスが最初に作成されたときに、システムにより呼び出される
このメソッドの直接呼び出しはダメ

public void onDestroy()
長い間使用されず、削除されるサービスへ通知するためにシステムにより呼び出される
サービスは、この時点で保持しているすべてのリソース
つまり、スレッド、登録されたレシーバーなどをクリーンアップする必要がある

戻った後、このサービスオブジェクトへの
これ以上の呼び出しはなく、事実上死んでいることになる
このメソッドも直接呼び出しはダメ

public void onLowMemory()
システム全体のメモリが不足していると呼び出され、積極的に実行しているプロセスに倹約を求める
これが呼び出されるときの明確なポイントは定義されてないが
一般的には、サービスとkillされるのを回避したいフォアグラウンドUIをホストしているプロセスをkillする直前に
すべてのbackground processがkillされたときに呼び出される

public void onReBind(Intent intent)
前持ってすべてのクライアントが
onUnBind(Intent)で切断されたことが通知された後に
新しいクライアントがサービスに接続したときに呼び出される

onUnBind(Intent)がtrueを返すように
Overrideしたときのみ呼び出される

引数のintentは、
Context.bindServiceに与えられた
このサービスにbindするために使われたintent
その時点でIntentに含まれていた任意のExtraはここではみれない

public int onStartCommand(Intent intent, int flags, int startId)
クライアントがstartService(Intent)の呼び出しにより明示的にサービス開始するごとに
それに与えられたものと
開始要求を示す一意の整数トークンを定義され、
システムにより呼び出される

後方互換性のため、デフォルト実装では
onStart(Intent,int)を呼び出し
START_STICKY
または
START_STICKY_COMPATIBILITY
のいずれかを返す

引数のintentは、
startService(Intent)に与えられたIntent
サービスは、そのプロセスがなくなった後に再起動され
それ以前に
START_STICKY_COMPATIBILITY
以外のものを返しているなら
nullになることがある

flagsは、この開始要求に関する追加データ

0
START_FLAG_REDELIVERY
または
START_FLAG_RETRY
のいずれかになる
API Level 8,
API Level 16ではデフォルトが0
API level 9~15はSTART_FLAG_RETRYがデフォルトになる

startId
開始要求を表す一意の整数
stopSelfResult(int)と一緒に使う

戻り値は、サービスの現在の開始状態のためにシステムが使用すべきセマンティクスを示す
START_CONTINUATION_MASKビットに関連した定数のいずれかになる

public void onTaskRemoved(Intent rootIntent)
サービスが現在実行されており、ユーザーがアプリからのタスクを削除したときに呼び出される

ServiceInfo.FLAG_STOP_WITH_TASK
を設定すると、コールバックを受け取れなくなるが、代わりにサービスが停止になる

引数のrootIntentは、削除されたタスクを起動するため使われた元のrootIntent

public void onTrimMemory(int level)
OSがそのプロセスから不要なmemoryをtrimmingするのに良い時間だと判断したときに呼び出される
プロセスがbackgroundに入り
必要に応じて実行している多くの
background processを保持するのに十分なメモリがないときに発生する

引数のlevelは、trimのContext
動作しているアプリをtrimmingする量のヒントを与える

TRIM_MEMORY_COMPLETE
TRIM_MEMORY_MODERATE
TRIM_MEMORY_BACKGROUND
TRIM_MEMORY_UI_HIDDEN
TRIM_MEMORY_RUNNING_CRITICAL
TRIM_MEMORY_RUNNING_LOW
TRIM_MEMORY_RUNNING_MODERATE
のいずれかになる

public boolean onUnbind(Intent intent)
すべてのクライアントがサービスにより発行された特定のインターフェースから切り離されたときに呼び出される

デフォルト実装では、falseを返す

引数のintentは、
Context.bindServiceに与えられた、このサービスにbindするために使われたIntent
その時点でIntentに含まれていた任意のExtraは、ここではみれない

戻り値は
新しいクライアントがサービスにbindするときに
onRebind(Intent)を呼び出してほしいなら
trueを返す

public final void startForeground(int id, Notification notification)
サービスをForegroundで実行するようにする
この状態の間は、ユーザーに示されるために対応中の通知を与える

引数のidは、
NotificationManager.notify(int, Notification)ごとの
notificationのための識別子

notificationは、表示される通知

public final void stopForeground(boolean removeNotification)
より多くのメモリが必要なときにkillされていいように
Foreground状態からこのサービスを削除する

引数のremoveNotificationは、trueなら
以前のstartForeground(int,Notification)
で提供された通知を削除する

falseなら、後の呼び出しが削除
または、サービスが破棄されるまで残る

public final void stopSelf()
サービスがすでに開始されているなら停止する

public final void stopSelf(int startId)
stopSelf(int)の古いバージョンで、結果を返さない

public final boolean stopSelfResult(int startId)
startIdで開始された最新のサービスを停止する

引数のstartIdは、
onStart(Intent, int)で受信した最新の開始識別子

戻り値は、最新の開始要求とstartIdが一致し、サービスご停止されるならtrue
そうでないならfalse

protected void dump(FileDescriptior fd, PrintWriter writer, String[] args)
与えられたストリームへサービスの状態を印刷する
adb shell dumpsys activity サービス名
で実行したときに呼び出される

引数のfd は、dumpに送信されるRAWファイル記述子

writerは、状態をdumpするための
PrintWriterオブジェクト
この関数かれ戻るときに自動的にクローズされる

argsは、dump requestへの追加の引数

Androidでボタンの設定

Androidでボタンの設定

ボタンを使うには、レイアウトファイルでButtonを設定して

クリックイベントとして
setOnClickListenerをセットすることで動作設定する

レイアウトファイルで
onClick=””
で設定してもいいけど、欠点として
コードの難読化するProGuardを使うと
クリックイベントが取得できなくなる

設定ファイルをカスタマイズすれば回避できるけど、
onClickより
setOnClickListenerのほうが無難

まずは、レイアウトファイルでボタンを配置

ソースは

<Buttonbr>android:id="@+id/button"<br clear="none"></br>
android:layout_width="wrap_content"<br clear="none"></br>
android:layout_height="wrap_content"<br clear="none"></br>
android:layout_centerInParent="true"<br clear="none"></br>
android:text="button"/><br clear="none"></br>

android:layout_centerInParent=””
は、
http://wikiwiki.jp/android/?UI%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8%2FRelativeLayout.LayoutParams
の解説にあるように
親の水平方向の中央に配置する設定

これでボタンができたので
つぎはJavaで動作を設定

Button btn = (Button)findViewById(R.id.button);

btn.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v){
Toast.makeText(MainActivity.this, "ボタンテスト",Toast.LENGTH_SHORT).show();
}
});

でボタンを押したらトースト表示する

Serviceクラスについて

Serviceクラスについて

サービスは、ユーザーと対話せずにアプリが要求する長時間の処理を実行したり
他のアプリが、使用するための機能を提供するアプリコンポーネントのこと

サーバみたいなものと考えるとわかりやすい

各サービスのクラスには
そのpackageの
AndroidManifest.xmlに対応する
宣言を持っている必要がある

サービスは、Context.startService()
または
Context.bindService()
で開始できる

サービスは、他のアプリのオブジェクト同様
ホストプロセスのメインスレッドで実行される

これは、サービスがどのようなCPUを集中的に使用するか
例えばMP3再生とか
または、ブロッキング(ネットワーキング)
などの操作をする場合、
その仕事を行うための独自スレッドを持っているサービスの標準的な実装として提供される

サービス作成の詳細は、
http://developer.android.com/guide/components/services.html
を参考に

AndroidでProgressBarの利用

AndroidでProgressBarの利用

ProgressBarは、読み込みしてるときに
グルグル回るリングみたいなのとか
ダウンロードしているときに、何%
とか表示されるバーのこと

主に読み込みとか、ダウンロードなど、どれぐらい進んでいるかを示すために使う

パソコンみたいに
ダウンロードとかで水平バーを使うなら
style=””

?android:attr/progressBarStyleHorizontal
を指定する

リングタイプを使うなら
3種類から選ぶことになる

それぞれ
?android:attr/progressBarStyleSmall

?android:attr/progressBarStyle

?android:attr/progressBarStyleLarge

と大きさの違いで使い分ける

とりあえず、
水平バー
小さいリングタイプ
普通の大きさのリングタイプ
大きなリングタイプ
でレイアウトファイルで設定

ソースコードは

<progressBar
android:id="@+id/horizontal"
style="?android:attr/progressBarStyleHorizontal"
android:layout_height="wrap_content"
android:indeterminate="false"/>

android:indeterminate=”false”

http://wavetalker.blog134.fc2.com/blog-entry-34.html
の解説を参考にさせていただきました

どうやらtrueにすると
progressBarがグルグル回るようです

<progressBar
android:id="@+id/small"
android:layout_height="fill_parent"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:indeterminate="false"/>

<progressBar
android:id="@+id/progressbar"
style=?android:attr/progressBarStyle""
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content"/>

<progressBar
android:id="@+id/large"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content"/>

あとは、Javaで制御

水平バーの場合、
setMax()で最大値
setProgress()で主進捗
setSecondlyProgress()で副進捗
を設定

ProgressBar progressBar = (ProgressBar)findViewById(R.id.horizontal);
progressBar.setMax(100);
progressBar.setProgress(30);
progressBar.setSecondlyProgress(70);

というようになる

Android API level 16 で追加された定数

Android API level 16 で追加された定数

public int DEFAULT_KEYS_DIALER
デフォルトのキー処理中にダイヤラを起動するため
setDefaultKeyMode(int)で使う

public int DEFAULT_KEYS_DISABLE
キーの規程の処理をOFFにするため
setDefaultKeyMode(int)で使う

public int DEFAULT_KEYS_SEARCH_GLOBAL
処理されていないストロークがグローバル検索を許可することを指定するために
setDefaultKeyMode(int)
で使う
通常は、Web検索だけど
一部プラットフォームでは、グローバル検索のための代替メソッドを定義できる

public int DEFAULT_KEYS_SEARCH_LOCAL
処理されていないストロークがアプリ定義の検索開始することを指定するために
setDefaultKeyMode(int)で使う
アプリやActivityが検索に定義してないと
キーは無視される

public int DEFAULT_KEYS_SHORTCUT
デフォルトのキー処理において
メニューのショートカットを実行するため
setDefaultKeyMode(int)
で使う

public int RESULT_CANCELLED
標準のActivityの結果で操作がキャンセルされたことを示す

public int RESULT_FIRST_USER
ユーザー定義のActivityの結果の最初の値

public int RESULT_OK
標準のActivityの結果で、操作語成功したことを示す

Android API level 16 で追加されたメソッドその2

Android API level 16 で追加されたメソッドその2

public void startIntentSenderForResult(IntentSender intent, int requestCode, Intent fillInintent, int flagsMask, int flagsValues , int extraFlags, Bundle options)
startActivityForResult(Intent,int)に似てるけど
起動するActivityを記述するために
IntentSenderを使うことができる

IntentSenderがActivityのためなら
startActivityForResult(Intent,int)の呼び出しのように
そのActivityが開始される

それ以外なら
IntentSender.sendIntentを呼び出すように関連付けられたアクション
例えばBroadcastなどが実行される

IntentSender.SendIntentExceptionがスローされる

引数のintentは、起動するためのIntentSender

requestCodeは、0以上ならActivityが終了する際に
startActivityForResult(Intent,int)で説明されている
onActivityResult()内で返される値

fillInIntentは、nullでないなら、Intentのparameterとして
sendIntent(Context,int,Intent,IntentSender.OnFinished,Handler)
に提供される

flagsMaskは、変更したいオリジナルのIntentSenderにあるIntentFlag

flagsValuesは
flagsMaskに設定されている任意のビットの変更したい値

extraFlagsは、常に0

optionsは、どのようにActivityを開始するべきかを示す追加オプション
もし、オプションもIntentSenderにより与えられている場合、上書きされる

public void startIntentSenderFromChild(Activity child, IntentSender intent, int requestCode, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options)
startActivityFromChild(Activity,Intent,int,)に似てるけど
こっちは、IntentSenderを取り入れている
IntentSender.SendIntentExceptionをスローする

public boolean startNextMatchingActivity(Intent intent, Bundle options)
他のActivityのコンポーネント置き換えて使うときに、Activityを開始する特別なバージョン

Intentを扱う次のActivityへIntentを手渡すのに使う
通常は、getIntent()で返されるIntentを使い
onCreate(Bundle)の中でこのメソッドを呼び出す

引数のintentは、次のActivityにdispatchするIntent
正しい動作のために、Activityを開始したIntentと同じであること
変更は、そのなかのExtraにある

optionsは、どのようにActivityが開始されるかを示す追加オプション

戻り値は、開始するためのActivityがあるかどうかを示すプール値
開始するための次のActivityがあればtrue
なければfalse

trueなら、その後finish()を呼び出す必要がある

Androidで文字の配置場所の変更

Androidで文字の配置の変更

ボタンやTextViewなどで表示される文字の配置場所を変更するには
android:gravity=””
で設定する

使い方としては
文字を左揃え、中央揃え、右揃えとしたり
上下、中央、左右の好きな場所へ配置するなどなど

なお、配置場所は |
これで区切ることで、組合せを作り
右上とかにすることができる

右上にするなら、上と右の組合せなので
“right|top”
とする

とりあえず、TextViewでそれぞれの例を
レイアウトファイルで書いてみる
 
ちなみに、
layout_width=”wrap_content”
とか
layout_height=”wrap_content”
にすると、幅をあわせてしまうので
たいていは表示する大きさを指定することになる

<TextView
android:id="@+id/text"
android:layout_width="200dip"
android:layout_height="50dip"
android:gravity="left|top"
android:text="左上"/>

<TextView
android:id="@+id/text2"
android:layout_width="200dip"
android:layout_height="50dip"
android:gravity="right|top"
android:text="右上"/>

<TextView
android:id="@+id/text3"
android:layout_width="200dip"
android:layout_height="50dip"
android:gravity="right|bottom"
android:text="右下"/>

<TextView
android:id="@+id/text4"
android:layout_width="200dip"
android:layout_height="50dip"
android:gravity="left|bottom"
android:text="左下"/>

というかんじ

TextView以外にはリスト表示するときとか
画像と合わせて表示するときなどに使える