Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
クラス名には、多くの場合"名詞"を用います。メソッド名の場合は動詞や助動詞を用いて命名しましたが、クラス名は何かしらの責務を持つモノとして捉えるため、名詞を用いることになります。 一方、インタフェースの宣言をする場合、そのインタフェースの名前に"形容詞"を用いることがあります(例:Iterable、Closeable等)。形容詞を用いることで、クラスの持つ性質を説明的に見ることができるようになります(Iterableな配列のList実装 -> ArrayList等)。 この記事は、どのような名詞や形容詞がクラス名やインタフェース名として用いることが出来るかを一覧し、できるだけクラスやインタフェースの役目を端的に表せるようなリファレンスとして活用できるものを目指していきたいと思います。 自分自身がクライアントアプリケーションのバックグラウンドを持っている為、多分にそこで用いる命名方法が含まれ
元記事はこちら どうも、Android Advent Calendar に登録するのを忘れていて、折角の機会を棒に振った KeithYokoma で御座います。 元記事はもう先月の話ですのでご存じの方も多いかと思いますが、ついに、あの Google Play Services の SDK が分割されます。今まで、Jake Wharton があまりのデカさに涙目になったり、これによって 64k のリミットに引っかかってビルドができなくなったり、これを回避するために頑張って MultiDex に対応 したりしてきたことと思いますが、もう悩むことはありません。 Google Maps API として、ナビゲーションの開始をサポートするものが増えるので、簡単にナビゲーション機能が実現できるようになります(もちろん、今までも Intent で頑張る方法があったりはしましたが…)。 また、ライトモード
前提知識 ざっくり言うと Fragment はライフサイクルが複雑で、フレームワークそのものが複雑なので、モジュラーな設計をするには大きすぎる View を継承して自分で CustomView を作るほうが、余分にライブラリを追加する必要がなく、古い端末も同時にサポートできる そもそも Activity も Fragment も Controller なのでロジックをそこに書いたらダメ 読んでおきたいリスト Fragment は本当に多様なデバイスへ対応する唯一の方法なのか Square Fragmentやめるってよ Advocating Against Android Fragment 【翻訳】Android Fragmentへの反対声明 FragmentManager#executePendingTransactions() が怖くて使えないあなたへ 知らないとハマる Fragment
アプリのバージョンを上げた時、何かしら互換性を保つための作業が必要なことがあります。 たとえば、データベースのマイグレーションをしたり、その他永続化したデータを書き換えたり、など。時間のかかるものもあれば、かからないものもあります。 王道なやり方としては、Application#onCreate()でバージョンを覚えておいて、次にApplication#onCreate()に来た時に覚えておいたバージョンと PackageManager から取ってきたバージョン情報を突き合わせて、バージョンが変わっていたら、バージョンごとに必要な処理をする、と言った感じでしょうか。 public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); if (isVersionChange
メモ書き Gradle 2.1 が必要になるので、${project_root}/gradle/wrapper/gradle-wrapper.propertiesを書き換えましょう(Gradle Plugin のバージョンをあげたら書き換えを促すプロンプトが出るはず)。 テスト用にAndroidManifest.xmlが、src/androidTest以下に配置できるようになりました。 ライブラリモジュールのAndroidManifest.xmlでプレースホルダが使えるようになりました。ライブラリモジュール内で解決されないプレースホルダは、それを使用するプロジェクト側で解決されます。 ProductFlavor や Build Type ごとにプレースホルダが設定できるようになりました。 Variant.getMappingFile()で、ProGuard の mapping.txt へア
声に出して読みたいObjective-Cのライブラリ8種(2014.7) に触発されて書いてみます。 前回はこちら android-promise Android フレームワークにおける Promise の実装です。Bolts は厳密には Promise ではなく(どこでそのスライドを見たのか忘れてしまった…)、継続 をベースにしているライブラリで、なにやら最近はちょっと違うものも含まれるようになってきましたが、こちらは純正の Promise の実装です。もう一つ、jdeffered もありますが、jdeffered についてはこちらを御覧ください。 Android でよくある、非同期処理とライフサイクルオブジェクトの関係で起こる悩ましいバグにうまく対応するため、Promise を生成するときにライフサイクルオブジェクトを登録するのが特徴です。これによって、ライフサイクルオブジェクトが死を
声に出して読みたいObjective-Cのライブラリ8種(2014.7) に触発されて書いてみます。 今回は Square 社製ライブラリを見ていきます。 Picasso 安心と信頼の Square 社製のライブラリです。画像のローディングとキャッシュについて面倒を見てくれますが、画像の加工についても扱っています。 Context、多くの場合Activityのライフサイクルに合わせて画像の読み込みを管理したり、AdapterViewの中にあっては、Viewのリサイクルをハンドリングして、画像のロードをキャンセルしたりもしてくれます。 Transformationインタフェースを実装し、そのロジックを渡すことで、画像の加工もできます。 処理の始まりはPicassoクラスから。Picasso#with(Context)で自動的にオブジェクトの初期化がはじまり(まだの場合)、続けてどこから画像を
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? 非同期処理と言えば、IntentServiceとAsyncTaskのいずれかは使ったことがあると思います。UI スレッドとは別のところで非同期に何かする、という点ではどちらも同じことをこなせるのですが、実際問題として何が違って何が同じなのかというところを踏み込んで見て行きたいと思います。 並行性とパフォーマンス IntentServiceは内部にHandlerThreadを持っていて、このHandlerThreadのなかで非同期処理を実行します。HandlerThreadは、内部に持っているHandlerにメッセージが渡ってきた時、それ
authenticator.xml の account type について authenticator.xmlに、AccountManagerに登録されるアカウント認証にまつわるメタデータを記述しますよね。 このとき、android:accountTypeという文字列属性の値に、以下のように書いたことはありませんか? Build Variant ごとにリソースが別れてくれれば、リリース版とデバッグ版で Account Type が切り替わってくれるのでそれぞれにアカウントが分けられて便利!というノリで、このように書きたくなりますが、実は罠があります。 突然の bind failure デバッグをしていると、アプリを何度もインストールしなおしたりすることがあります。そんな時、アカウントの作成を実行していると、唐突に見慣れない例外が飛んでくることがあります。 android.accounts.
Android のデータベースといえば、SQLite ですが、大抵の場合、ContentProvider によって CRUD がラップされ、ContentResolver 経由でデータソースにアクセスすることになります。 この設計によって、モデル内のデータソースが何であれ、CRUD のインタフェースが統合されるので、データソースのレイヤがどうなっているかをデータ利用者側が意識する必要がないようになっています。 が、そのインタフェースはシンプル故に、凝ったことをしようとすると、ContentProvider が頑張るか、利用者が頑張るかしないといけなくなります。 特に、データソースが SQLite の場合、SQL なら便利に出来ていたことが途端に難しくなります。例えば、行データの重複を消したり、グループ化したり、など。 Cursor からデータを取り出して、自分たちで同じような機能を実現する
Android Open Source Project のコーディングガイドライン には、いくつかのハンガリアン記法があります。 publicでなく、かつstaticでないフィールドにはmを、static なフィールドにはsをつけるのが Android 流のハンガリアン記法のようです。 が、そもそも Java を使って、かつ IDE を使っている時点で、ハンガリアン記法を取り入れるメリットはそんなに無いように思われます。 このあたりは、Twitter での Jake Wharton と Romain Guy のやりとりの中でその経緯が語られています。 このやりとりを要約すると、以下のような内容です。 Jake Wharton: Android の Java にハンガリアン記法を使うことにしたやつ謝れ。 Romain Guy: 激しく同意。C++やってる人とか Vimmer に Java を
やつを追う前に言っておくッ! おれは今やつのアップデートをほんのちょっぴりだが体験した い…いや…体験したというよりはまったく理解を超えていたのだが…… ,. -‐'''''""¨¨¨ヽ (.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ! |i i| }! }} //| |l、{ j} /,,ィ//| 『おれは奴のアップデートでライブラリを入れていたと i|:!ヾ、_ノ/ u {:}//ヘ 思ったらいつのまにか無くなっていた』 |リ u' } ,ノ _,!V,ハ | /´fト、_{ル{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが /' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも何をされたのかわからなかった… ,゙ / )ヽ iLレ u' | | ヾl
現象 それなりに大きなモジュールだったり、モジュールが参照するモジュールがたくさんあったりすると、ProGuard が頑張らないといけないことが多くなるので、その分 Java のヒープを食います。 そうすると、いつかヒープが足らなくなり、以下のようにエラーを吐いてビルドがコケるようになります。 :MyApplication:proguardProductionRelease Note: there were 979 duplicate class definitions. :MyApplication:proguardProductionRelease FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':NohanaPhotoBook:proguardP
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? Honeycomb から登場した Fragment によって、すべてのコントローラロジックが Activity に集約されてしまう呪縛から解き放たれ、人類は平和を取り戻しました。Fragment はまた、Support Library のメンバとして、Gingerbread 以前の過去世に積み上げた罪業をも消し去ろうとしています。 そんな Fragment ですが、いまいち使い方が分からない、という声も時折耳にします。本稿では、Android アプリケーションの開発を始めて Activity と Fragment について学び、その両者
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? Android フレームワークは、あまり強力とはいえないものの、ある程度のテストフレームワークを内包しています。 ベースが JUnit3 なので、記法が古かったりすることもありますが、とりあえず JUnit3 の作法を身に付ければある程度のテストは書くことが出来ます。 Android のテストケースフレームワーク Android がもつ各種のコンポーネントをテストするためのフレームワークが有ります。 いろいろな種類がありますが、おそらく最も頻繁に使うのはAndroidTestCaseでしょう。 AndroidTestCase Andro
HttpUrlConnection の概要 ストリームを用いた汎用の Network I/O のためのインタフェースとして、URLConnectionがあり、このうち HTTP に基づいたものがHttpUrlConnectionです。さらにこの子クラスとして、HttpsUrlConnectionもあります。 Input URLConnection#getInputStream()で得られるInputStreamを読み取ることで、レスポンスのデータを取得します。 Output URLConnection#getOutputStream()で得られるOutputStreamにデータを書き出すことで、リクエストを作成します。 OutputStreamをclose()するまでリクエストは送られません。 Error サーバから、4xxや5xxなどのエラーレスポンスが返されると、FileNotFoun
テーマとして、android:windowNoTitle="true"を設定することで、ActionBar を表示させないようにすることができます。 こうすると、ActionBar を持たない Activity が出来上がるため、Activity#getActionBar()やActivity#getSupportActionBar()はnullを返すようになります。 この場合、以下の点について気をつけていないと、見に覚えのないクラッシュログに苛まれることになります。 メニューキーを無効化する メニューキーは、すなわち ActionItem の OverFlow の中身を呼び出す機能として使われます。 つまり、ActionBar の機能を使おうとします。 しかし、android:windowNoTitle="true"なテーマの Activity では、ActionBar そのものが生成さ
SharedPreferencesを使った、カンタンな KVS をデータソースに持つモデルを作った時、そのモデルをテストしようとすると、どうしても SharedPreferencesをモックしたくなります。 SharedPreferencesは、その取得方法によって、2 種類のものが存在します。 1 つは、Context#getSharedPreferences(String, int)で、自分で好きに名前を決めたSharedPreferences。もう一つは、PreferenceManager#getDefaultSharedPreferences(Context)で、システムによって生成されたSharedPreferencesです。 SharedPreferencesそのものはインタフェースですので、SharedPreferencesのインスタンスをモックするのであれば、以下のようにモ
Fragmentを取り扱っていると必ず出てくるのが、FragmentManagerとFragmentTransactionです。 FragmentManagerは、1 個のActivity につき 1 個のFragmentManagerが居て、Activityのライフサイクルの巡りが尽きて死ぬまでの間、そのActivityでのFragmentのライフサイクル管理をしてくれます。 Fragmentの取り扱い方としては、レイアウトに埋め込んで静的に動作させるやり方と、Activityが動的にFragmentのインスタンスを生成してレイアウトにアタッチするやり方があり、特に後者の動的にアタッチするやり方を採用した時に、FragmentTransactionを用いてFragmentのレイアウトに対する各種の操作を実行します。 さて、FragmentTransactionを使って動的にアタッチしよう
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く