ImageButtonを使ってみた。
上の画像の再生ボタンのようなボタンを作成したかったので、そのためのメモ。
ImageButton
このようなボタンを作成するためにはImageButtonを使う。これは、その名の通り画像付きのボタンを表す。
例えばこんな感じに表示される。
このImageButtonの結果は次のようなコードで得られる。
... <ImageButton android:id="@+id/click_me_button" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/click_me" android:tint="@color/colorAccent" android:src="@drawable/ic_action_playback_play" /> ...
見ての通り、通常のButtonにtextの代わりに画像を載せた感じになっている。
最初の画像のように背景を透過させたい場合には、ImageButtonのandroid:background属性にアルファ値がffの値を指定してあげれば良い。
ただ、これだとボタンをクリックした時にボタンが何も反応していないような感じになってしまうので、android:background属性には?android:selectableItemBackgroundや?android:selectableItemBackgroundBorderlessを指定してあげるとボタンをクリックした時に波紋が広がるようなアニメーションが得られる。
これを行うことで次のようにボタンの背景が透過されて表示される。
感想
Android開発では色々と学ぶことが多いので大変だけど、それなりに充実しているので、どんどん学んでいきたい。
ActivityUnitTestCaseでIllegalStateException
Androidのテストを学ぶためにCreating Unit Tests | Android Developersを読みながら、そのサイトに載っているAndroidTestFunを写経していた。その時、ちょっと詰まってしまったのでメモ。
ActivityUnitTestCaseのstartActivity()を起点にした例外
AndroidTestFunプロジェクトのlesson4にLaunchActivityTestクラスがあるのだけれど、そのtestPreconditions()を書いてテストを走らせた時に例外が発生した。testPrecondisions()のコードは次のようなもの。
@MediumTest public void testPreconditions() { //Start the activity under test in isolation, without values for savedInstanceState and //lastNonConfigurationInstance startActivity(mLaunchIntent, null, null); final Button launchNextButton = (Button) getActivity().findViewById(R.id.launch_next_activity_button); assertNotNull("mLaunchActivity is null", getActivity()); assertNotNull("mLaunchNextButton is null", launchNextButton); }
テストのログを見てみると次のようなエラーメッセージが書いてあった。
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
なぜこんな例外が発生するのだろうと思って少し調べてみると、こんなサイトがあった。
Issue 128421 - android - ActivityUnitTestCase startActivity() IllegalStateException - Android Open Source Project - Issue Tracker - Google Project Hosting
どうやら同じような例外が発生している人がいるみたいだった。
このissueでは2つの解決法が提供されていた。
- setActivity()をオーバーライドする方法
- contextを明示的に設定する方法
setActivity()をオーバーライドする方法
@Override protected void setActivity(Activity testActivity) { if (testActivity != null) testActivity.setTheme(R.style.AppTheme); super.setActivity(testActivity); }
contextを明示的に設定する方法
protected void setUp() throws Exception { super.setUp(); ContextThemeWrapper context = new ContextThemeWrapper( getInstrumentation().getTargetContext(), R.style.AppTheme); setActivityContext(context); (...) }
自分の場合、どちらの方法を使っても例外が発生しなくなった。
原因はよくわかっていないけど、とりあえずこれでまた写経を始めることができる。
Notificationをユーザに消されないようにする
AndroidでのNotificationをユーザに消されないようにするには次のようにすれば良い。
NotificationCompat.Builder builder = new NotificationCompat.Builder(context) .setOngoing(true); // このメソッドでtrueを指定する
主な使用用途として考えられるのは、音楽の再生中とかダウンロード中のNotification。
注意としては、setOngoing(true)としている限りNotificationが消えることはないので、音楽の再生やダウンロードが終わったらsetOngoing(false)を指定したNotificationをnotifyする必要があるということ。
追記(2015.11.12)
あまり行儀は良くないのかもしれないけどNotificationクラスのflagsを直接操作してもNotificationを消されないようにできる。
Notification notification = new Notification();
notification.flags |= Notification.FLAG_NO_CLEAR;
GitHub実践入門を読んだ。
今日、友達に頂いたGitHub実践入門を読んだ。読みたい本だったのだけれど、お金が無くて買えなかったから非常にありがたい。www.amazon.co.jp
普段からGitやGitHubは軽く使っているので、すらすらと読むことが出来た。
本の中でgit log -pやgit reflog、git rebaseなどの自分が知らないコマンドを簡単に説明してあった。普段Gitを使うのに困らない程度にしかGitコマンドを知らないので、少しずつでもGitコマンドを学ばなければいけないなと思った。また、GitHubにショートカットキーがあることもこの本で初めて知った。
Pull Requestを体験できるのも非常によかった。人生初Pull Requestを行った。
正直なところ、GitHubでIssueを書いたり、Pull Requestを送るのは自分にとってはまだまだ非常に敷居の高いことのように思う。これから少しずつ慣れていければとこの本を読んで思った。
RecyclerViewとCardViewを使ってみた。
Androidの開発をしたばかりで、わからないことが多い。今回はRecyclerViewとCardViewについて少しだけ学んだ。
Getting Started With RecyclerView and CardView on Android - Tuts+ Code Tutorial
少し古い記事だけど、このサイトのコードを写経してRecyclerViewとCardViewの使い方をなんとなく学んだ。
このサイトでは、簡単なプロフィールリストを作成していたので、それを真似てみた。
リストを作成することは出来たので、次はItemをタッチした時に、各プロフィールの詳細用のActivityを開くようにしようと思う。
コードを書いて学ぶことは大事だなと改めて感じた。
メインスレッドではネットワーク操作を行ってはいけない。
最近、ちょこちょことAndroidの開発を行っている。色々と学ばなければいけないことが多いので、少しずつしか開発が出来ない。
だいぶ古い記事だけど、Androidで広がる,携帯アプリ開発の世界 - 第4回 簡単なRSSリーダーを作ってみる:ITproを写経して
簡単なRSSリーダーを作った。そのコード内でXMLをパースするときにXmlPullParserというものを使っていた。
このXmlPullParserがどういう動作をするのかをもうちょっと知りたくて次のようなコードを書いてた。
public class MainActivity extends ActionBarActivity { private static final String FEED_URL = "http://..."; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... URL url = new URL(FEED_URL); InputStream is = url.openConnection().getInputStream(); XmlPullParser parser = Xml.newPullParser(); parser.setInput(is, null); ... }
実行してみたところ、こんな例外が出た。
android.os.NetworkOnMainThreadException
調べてみたところ、メインスレッドでネットワークの操作をするなということらしい。
NetworkOnMainThreadException | Android Developers
「Honeycomb SDK以上(Android 3.0以上)でしか例外は投げられないけど、メインスレッドでネットワーク操作はするなよ」的なことが書いてあった。
今後は気をつけよう。
va_list型というものを知った。
ゲームエンジン・アーキテクチャを読んでいて9章のサンプルコードで出てきたva_listとそれに関連するマクロや関数を初めて知ったので簡単なコードを書いてみた。特に使い道のないコード。
va_listのサンプル
va_list型は可変長引数を扱うために使う型。
詳しくはhttp://www.cplusplus.com/reference/cstdarg/va_list/を読むと良いかもしれない。
まだまだ知らないことが多くあるなぁと思った。