投稿

【Android】アノテーション @SharedPref を使う

Androidアプリケーションで設定などの値を保存する際に、アノテーションを利用して簡単に読み書きする方法をまとめてみます。 まずは通常の SharedPreferences クラスを利用する例が以下です。 SharedPreferencesクラスを使った例 // SharedPreferencesクラスを実体化 SharedPreferences preferences = getSharedPreferences("data", Context.MODE_PRIVATE); // IDを読み込み int id = preferences.getInt("id", 0); // IDを書き込み SharedPreferences.Editor editor = preferences.edit(); editor.putInt("id", 123); editor.apply(); これをアノテーション @SharedPref を使って書くと次のようになります。 @SharedPrefを使った例 // ※これはメンバー変数 @Pref static MyPreference_ preference; // IDを読み込み int id = preference.id().get(); // IDを書き込み preference.id().put(123); Editorを作ったり、keyを指定したりしなくていいのでだいぶすっきりします。 保存する設定値が多くなればなるほど、使いやすさが実感できると思います。 ただしこれを利用するにはもちろん前準備が必要になるので説明します。 前準備 ライブラリを追加 app/build.gradle dependencies { … } に以下の2行を追加します。 annotationProcessor "org.androidannotations:androidannotations:+" implementation "org.androidannotations:androidannotations-api:+" SharedPrefインターフェースを作成 以下のようなインタ

【Android】アプリケーションの開発で環境を切り替えてビルドする方法

イメージ
クライアントサーバー型のアプリケーションを開発していると、開発/ステージング/本番でそれぞれビルドを用意しなくてはならないときがあります。 ほとんどの開発現場でこのようなサーバー構成を取っているのではないかと思います。 今回は環境毎に用意されたstring.xmlを読み込む方法をまとめてみました。 環境の切り替え Build Variants 切り替えは Android Studio の左下の Build Variants をクリックします。 すると Build Variants のウィンドウが出ますので、ここで切り替えを行います。 しかし、初期状態では debug と release の二つしかありません。 これはビルドする際のオプションのことで、今回やろうとしている環境ごとのビルドとは関係ありません。 ここに冒頭の「3つの環境」×「オプションの2つ」の計6個の Build Variants を表示する方法が次の手順になります。 Build Variantsの修正 環境を追加 app/build.gradle productFlavors に各環境を定義します。 // フレーバーディメンション flavorDimensions "default" // プロダクトフレーバー productFlavors { develop { applicationId = '[パッケージ名].dev' } staging { applicationId = '[パッケージ名].stg' } product { applicationId = '[パッケージ名]' } } applicationId にはパッケージ名を指定しますが、ここを環境ごとに変えておくことで、一つのデバイスに全てのバージョンをインストールすることが可能になります。 flavorDimensions は productFlavors が複数あるとき優先順位を決めなくてはいけないので一旦 default とし

【Android】Fragmentを使う② - ActivityとFragmentの相互呼び出し -

イメージ
前回 の記事でFragmentの簡単な実装について書きました。今回はそれの応用編です。 Fragmentに定義したメソッドをActvity側から呼び出したり、FragmentからAcitivityのメソッドを呼び出す方法をまとめます。 ActivityからFragmentのメソッドを実行する まずは親レイアウトであるMainActivity側から、それぞれのFragmentに定義してあるメソッドを実行してみます。この場合Fragment側に特別な処理は必要なく、呼び出し元のMainActivityのみで完結します。 メインのレイアウトにボタンを追加する activity_main.xml <LinearLayout android:id="@+id/llButton" android:gravity="center_horizontal" android:orientation="horizontal" android:layout_below="@id/mainText" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/buttonTest1" android:text=" Fragment 1 -> TEST " android:padding="5dp" android:layout_margin="5dp" android:textAllCaps="false" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button

【Android】Fragmentを使う① - 単純なFragmentの実装 -

イメージ
FragmentはActivityに設置するViewを機能ごとに小分けして、元来Activityに集中しがちだったロジックを細分化する方法です。 複数人で開発しているときはコンフリクトがおきにくいのでかなり便利です。 今回はFragmentの単純な例を実装してみました。 画面構成 画面の構成としてはMainActivityの下に、2つのFragmentが紐付いている状態です。 2つのFragmentはそれぞれのレイアウト構成ファイルを読み込んでいます。 実装 ライブラリの追加 app/build.gradle annotationProcessor "org.androidannotations:androidannotations:+" implementation "org.androidannotations:androidannotations-api:+" レイアウトファイル layout/fragment_main1.xml Fragment1で使用するレイアウトを定義します。 ここではTextView、EditText、Buttonの3つのViewを設置しています。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffa" android:padding="5dp" android:orientation="vertical"> <TextView android:id=&quo

【Android】Viewの装飾

イメージ
TextViewやEditTextをはじめとするViewクラスを継承する多くのViewは、様々な装飾をすることが可能です。 個人アプリは特にシンプルなUIになりがちですが、こうした装飾をすることで見た目が一気にグレードアップします。 ここではいくつかそのサンプルを上げておきます。 実装 装飾を定義したファイルの準備 drawble/view_frame.xml 方法としては、drawble配下に装飾用の定義を記述したxmlファイルを用意しておき、Viewのバックグラウンドに指定します。 xmlファイルを追加は、プロジェクトメニューの drawbleを右クリック → New → File で追加します。 ファイル名は任意で、view_frame.xmlとした場合、適用したいViewのbackground属性に以下のように設定します。 android:background="@drawble/view_frame" 装飾定義ファイルには、shapeタグとその子要素によって記述します。 どのように記述していくのかを以下に記載していきます。 枠線をつける drawble/view_frame.xml まずはシンプルに枠線をつけてみます。特にデフォルトのEditTextは枠線がなく、明るい画面にデフォルトのEditTextだと入力欄であることが気づきにくいという難点があるので枠線は必須だと個人的に思ってます。 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <stroke android:width="2dp" android:color="#232323" /> </shape> strokeタグでEditTextに枠線をつけます。 widthで線の幅、colorで色を指定できます。 背景色をつける drawble/view_frame.xml これもよく使います。EditTextでは特に淡

【Java】マルチバイトを含んだ文字列を指定バイト数で切る

マルチバイトを含んだ文字列を指定バイト数で切って、切った場合に三点リーダを付与する関数を作りました。半端な場合(マルチバイト文字の途中で切れる)は、その文字ごと切り捨てます。 方法としては文字列を一文字ずつ取り出して、それがシングルバイトなのかマルチバイトなのかを判定します。 判定はStringクラスの getBytes(StandardCharsets.UTF_8).length が1ならシングルバイトとしています。 なお三点リーダも文字列と考慮するので、マルチバイト一文字分を含めても切る必要がない場合は何もしないものとします。 実装 共通クラス StringUtils.java staticメソッドで定義しました。これをコピってそのまま使えます。 public class StringUtils { /** * 文字列を指定バイト数で切って、切った場合三点リーダを付与する * @param value * @param byteLength * @return */ public static String truncate(String value, int byteLength) { if(value == null) { return null; } if(getByte(value) <= byteLength + 2) { return value; } String ret = ""; int b = 0; for(int i = 0; i < value.length(); i++) { String target = value.substring(i, i + 1); if(target.getBytes(StandardCharsets.UTF_8).length == 1) { b++; } else{ b += 2;

【Android】全面広告を表示する

イメージ
無料アプリの収益化で利用するAdMob広告において、全面に表示される Interstitial型広告についての実装です。 この広告はバナー型より収益が見込めますが、あまり頻繁に表示されるとユーザーにとってあまり印象がよくありません。そのため起動時、3回に1回の頻度等に制限するのがベターです。 また、バナー型に比べて広告の読み込み処理に時間がかかるのと、画面全体に表示されるため、いきなり出てきた場合ユーザーの誤クリックを招いてしまいます。そのため広告のローディング中はプログレスダイアログを出して操作不可にしておく処理を入れておくと良いです。プログレスダイアログに関しては以下の記事にまとめています。 WebViewのロード完了までプログレスダイアログを表示する 事前準備として、広告タイプがインタースティシャル型の、adUnitIdを発行します。※adUnitIdの発行については以下をご確認ください。 Androidアプリでバナー型広告を表示する 実装 ライブラリの追加 app/build.gradle まずはバナー型と同様、以下のライブラリをdependenciesに追加します。 compile 'com.google.android.gms:play-services:+' 権限の追加 AndroidManifest.xml こちらもバナー型と同様です。 <uses-permission android:name="android.permission.INTERNET" /> 広告IDの設定 values/string.xml インタースティシャル型で発行したadUnitIdを定義します。 <string name="interstitial_ad_unit_id">ca-app-pub-3940256099942544/1033173712</string> 全面広告のインスタンス取得 これは広告のインスタンス取得をメソッドにしたものです。メインスレッドで呼び出します。 /** * 全面広告のインスタンスを取得 * @return InterstitialAd */ private InterstitialAd new

【Android】WebViewのロード完了までプログレスダイアログを表示する

イメージ
WebViewに限ったことではないですが、重たい処理を実行中にローディング中であることを示すダイアログを表示する方法のまとめです。 画面の初期化やファイルの読み込み・書き込みなど様々な用途に応用できます。 今回はWebViewClientを継承したクラスを作ってonPageFinished()メソッドなどを実装します。 実装 プログレスダイアログの生成 変数(progressDialog)はメンバ変数、もしくはfinalで宣言する必要があります。理由はダイアログを閉じる時にメインスレッドとは別のスレッドからアクセスすることになるのでメソッド内のローカル変数だとエラーになります。 progressDialog = new ProgressDialog(this); progressDialog.setMessage("Loading..."); progressDialog.show(); プログレスダイアログの表示開始と主処理開始 HandlerクラスはUIスレッド(つまりメインスレッド)へRunnableを渡してUIや画面側を処理することが来ます。ここではWebViewのローディングと、その中のonPageFinishedメソッドでダイアログの停止を行っています。 // スレッド内でプログレスダイアログを閉じるためにHandlerを生成 final Handler handler = new Handler(); // スレッド処理 new Thread(new Runnable() { @Override public void run() { try { handler.post(new Runnable() { @Override public void run() { // ※ここで本来行いたい処理をする webView.loadUrl("https://news.google.com/"); } }); } catch (E

【Android】バナー型広告を表示する

イメージ
無料アプリで収益化するために広告を出しているアプリはたくさんあります。 ここでは画面の固定された部分(下部や上部などに)に表示されるバナー型の広告を出す方法についてまとめます。 広告はAdMobというAdSenseのMobile版を利用します。AdSenseと違い特に審査等はありませんので登録後すぐに使えます。 事前準備 まずAdMobで広告ID(adUnitId)を発行する必要があります。 adUnitIdを発行 AdMobへログイン・またはアカウント作成して「アプリを追加」をクリックします。 https://admob.google.com/intl/ja/home/ 新しいアプリの設定 開発段階で導入するので「いいえ」を選択   アプリ名に任意の名前を入力し、プラットフォームにAndroidを選択して「追加」をクリック (AdMobコンソール上の名前なので実際のアプリと異なっていても問題ない)   広告ユニットの追加 「広告ユニットを追加」をクリック   「バナー」を選択 広告ユニット名に任意の名前を入力し、「広告ユニットを作成」をクリック 作成された広告ユニット名をクリック 広告ユニットIDがadUnitIdになります これをソースコードの中で指定するのでコピーしておいてください 実装 ライブラリの追加 app/build.gradle dependenciesに以下のライブラリを追加(バージョンは適時修正) compile 'com.google.android.gms:play-services:10.0.1' 権限の設定 AndroidManifest.xml 以下の権限を追加 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> adUnitIdの定義 values/string.xml adUnitIdを追加(任意) ソースコードにべた書きでも動きますが、v

Android™アプリケーション技術者認定試験ベーシックを取得してきました

Android™アプリケーション技術者認定試験ベーシックを取得してきました。 公式サイト : http://ace.it-casa.org/ace/application-exam/ 試験は選択問題のみですが知識を問われる問題がほとんどでした。実務経験にもよりますが、対策なしでは厳しいと思います。 私は参考書で1ヶ月ほどみっちり予習して挑んで80%ほどの正解率でした。 感覚的には9割以上解けたと思ったんですが思いの外ギリギリでした。あとこの試験あまり最新技術に対応されていないようです。Eclipse時代の問題が出ます。 ここでは私が合格したときの状況をまとめてみます。試験の参考になれば幸いです。 試験の概要 ※詳細は冒頭のリンクをご確認ください。 概要 Androidアプリケーションの開発における知識・スキルを認定する。 問題数 70問 合格ライン 70% 試験時間 90分 合格ライン 70% 受験対象者 受験対象者が定められていますが、実質誰でも受けれます。 Android™技術者 Java開発者 Webアプリ開発者 iPhoneアプリ開発者 モバイル開発者 Android™を学習している学生・教師 大学、専門学校、教育機関など 合格特典 一応特典があります。 ACEロゴマークが使用可能 合格後に認定証と一緒に届く「ロゴマーク申込書 兼使用許諾同意書」で申し込むことによりロゴマークの仕様が可能になります。自身の名刺に入れたりすることができます。詳しくは以下のロゴガイドラインをご確認ください。ご自身のWEBサイト等へは使用できないようです。 http://ace.it-casa.org/ace/about/logo/ Android

【Android】Canvasを使ってルーレットを作る② - Animationクラスとフリックイベント -

イメージ
今回は前回作成したルーレット板にアニメーションを付けてくるくる回してみる部分です。 Animationクラスを継承したArcAnimationからRouletteViewのパラメータを調整しながらonDrawを何度も呼ぶという処理です。 実装 ArcAnimationクラスのソースコード import android.view.animation.Animation; import android.view.animation.Transformation; public class ArcAnimation extends Animation { int base = 20; int count = 0; private MainActivity.RouletteView rouletteView; public ArcAnimation(MainActivity.RouletteView rouletteView) { this.rouletteView = rouletteView; } @Override protected void applyTransformation(float interpolatedTime, Transformation transformation) { count++; int move = base - (count / 25); if(move < 0){ move = 0; } rouletteView.addPos(move); rouletteView.requestLayout(); if(move == 0){ cancel(); rouletteView.setIsAnimation(false); } } } メンバ変数のbaseはパネルを移動させる初期値です。つまりルーレット始動直後は20℃ずつ回転します。 メンバ変数のcountはアニメーションの回数です。このカウンタによりだんだんと回転速度

【Android】Canvasを使ってルーレットを作る① - CanvasにdrawArcでルーレットを描画する -

イメージ
android.graphics.CanvasはAPI Level 1の頃からある最古のAPIです。 これを利用してルーレットアプリを作るまでを記事にしたいと思います。 何回かに分けるので今回はViewを継承したRouletteViewを作り、onDraw()で描画するところまでです。 実装 Viewクラスを継承したRouletteViewクラス.コンストラクタ コンストラクタ public RouletteView(Context context, int num) { super(context); paint = new Paint(); paint.setAntiAlias(true); textPaint = new Paint(Color.DKGRAY); textPaint.setTextSize(60); textPaint.setAntiAlias(true); pos = 0; this.num = num; angle = 360 / num; } パネル用のPaintオブジェクトとテキスト用のPaintオブジェクトを生成します。 setAntiAliasにtrueを設定しておくと文字や線が滑らかに描画されます。 numはパネルの数、angleはパネル1個の角度をそれぞれセットします。 onDraw()メソッド 初回時の処理 if(init == 0) { if(xc == 0.0f) xc = canvas.getWidth() / 2; if(yc == 0.0f) yc = canvas.getHeight() / 2; if(rectF == null) rectF = new RectF(0.0f, yc - xc, canvas.getWidth(), yc + xc); init = 1; } これは初回描画時の処理です。 Canvasの中心点とRectFオブジェクトをMainActivityのメンバ変数にセットし、次回のonDrawからは再利用するようにしています。 rectFはCanvasの横幅にあわせた正方形で生成し、この中にルーレットのパネル(弧)を描画します。 パネルの描画