Android – RecyclerView

Gradleに追加する

RecyclerViewを設置する

1行用xmlつくる

row.xml

Adapterをつくる

RecyclerViewのアダプタは継承するやつが決まっているっぽい。RecyclerView.Adapterというのがある。下記3つの関数を実装する必要がある。

onCreateViewHolderは、ViewHolderのインスタンスをつくって返す。RecyclerView.ViewHolderを継承したViewHolderクラスである必要があって、インスタンス作成時に一行用viewを渡す。
onBindViewHolderは、holderとポジションがわたってくるので、それを使って該当ポジションデータをholderにセットする。
getItemCountは表示する数。表示可能なデータよりも多い数を指定するとエラーになる。

MainActivityをつくる

MainActivity.java

recyclerView.setHasFixedSize(true);は、リストのレイアウトサイズが固定の場合、setHasFixedSize()をtrueにするとパフォーマンスが向上するらしい。

参考:
RecyclerView
RecyclerView の基本的な使い方
[Android] RecyclerView:リストを表示する

Android – ViewHolder

ListViewの効率化をViewHolderでします。
adapter使うときに、Viewが行ごとに変わりますが、かといって毎回findViewByIdやると効率が悪いので、viewHolderを使うといいらしいです。viewHolderは、各行用のviewの要素を覚えておいてくれるやつでっす。

ViewHolder使わない場合のコード

ViewHolder使った場合のコード

Android – ListView

すごくシンプルなListViewの実装

adapterにセットする、個別行用のレイアウトファイルが必要ですが、ANDROIDがデフォルトで用意している、android.R.layout.simple_list_item_1を使っている。ただTextViewが1つ入っているだけのもの。

activity_main.xml

MainActivity.java

android.R.layout.simple_list_item_1

Adapterのインスタンスをつくる。つくるときに、個別行用のレイアウトファイルも指定する。
Adapterにデータを追加する。
ListViewを取得して、アダプタをセットする。

行データを配列で与える場合

自作アダプタ

Foodクラスのデータをリスト表示するListViewを作る。表示項目は、Food名と値段。

ArrayAdapterを継承したMyAdapterクラスを作成し、getViewでFood名と値段を取得・セットする。
個別行データ用のレイアウトは、row.xmlに作成する。row.xmlは単純なテキストビュー2個だけのもの。

MyAdapter.java

Food.java

row.xml

MainActivity.java

参考:
【Android】ListViewを使うための基礎知識(1)
リストビューをカスタマイズする

Android – ProgressBar

回転するやつと横棒があるっぽい。

下記4つがある。

  • progressBar(Large)
  • ProgressBar
  • ProgressBar(Small)
  • ProgressBar(Horizontal)

styleを変えると色々なデザインにできる。Android5以上だと、デフォルトで、Widget.Material.Lightになるっぽい。かっこいい。
表示非表示切替は、visibilityで設定できる。visibilityがないと表示になる。visible、invisible、goneがある。goneは非表示で表示領域を確保しない。

Horizontalは表示割合の数値を設定できる。

Android – Firebase Auth ログアウト

FirebaseAuth auth = FirebaseAuth.getInstance();
auth.signOut();

Android – オプションメニュー

オプションメニューを配置

res/menu/main_menu.xml

MainActivity.java

メニューをクリックしたときの処理

Android – Firebase Auth ログインチェック

FirebaseAuthのインスタンスを取得して、getCurrentUser()でログイン中ユーザを取得できる。nullだったら未ログイン状態。

Android – SharedPreference

参考:
基本的なSharedPreferencesの使い方
SharedPreferencesの使い方(基礎編)

サンプルコード

Android – Firebaseでログイン機能実装

Firebaseを使ってログイン機能を作ってみます。
参考:Firebase Authentication

サンプルアプリがあります。サンプルアプリは、パッケージ名を変更するのが結構大変だったので、アプリ登録でサンプルアプリと同名のパッケージ名で登録すると簡単に利用できました。
firebase/quickstart-android

Gradleの設定

参考:Android プロジェクトに Firebase を追加する

buildscriptの dependenciesに、

appのdependenciesに、

appの一番下に、

エラーがでた。

参考:Missing api_key/current key with Google Services 3.0.0
google-service.jsonにapi_keyがないぞってことかな?たしかに空になっている。もう一度作成したらapi_keyが入っていた。最初のいらないじゃん。。エラーでなくなった。

コンソールでログイン方法有効化

とりあえず今回はgoogleログインをしてみるので、googleを有効にします。Facebookとかは、Facebookアプリのシークレットとか入れる必要がありますが、googleは何もなく有効になりました。

Googleログイン

参考:Android で Google ログインを使用して認証する

下記もgradleに追加する必要がある。

下記コードは、完全にGoogleのサンプルと同じですが、とりあえずこれを実行したらログイン機能が実装されていた。これだと、Firebaseのユーザテーブルに登録されちゃうので、自分でデータベース作ってる場合は、使えないけど、お手軽ではあります。自分のデータベースと連携させることもできるらしいので、後で調べる。

activity_main.xml

MainActivity.java

Android – Retrofit

Retrofitも使ってみる。なんか一番人気がありそう。REST APIに対して使いやすい感じっぽい。

設定

build.gradleに下記を設定する。

使い方

参考:
Android:Retrofit2.0ではてなAPIとおしゃべりしてみた
Retrofit2 &OkHttpでAndroidのHTTP通信が快適だにゃん

なんか思ってたのと違う。近代的だ。すっきりするからいい感じな気がする。でも色々ブラックボックス化してるから、エラーのときとかイライラする可能性はあるかもなあと思った。

コードサンプル

APIにアクセスすると、itemの配列がjsonデータでもらえるようになっている。itemは、id、name、price、descriptionというフィールドがある。
URLを、https://hoge.com/items/index.jsonとすると、返ってくるのは、[{id:1, name:たまご…}, {}]みたいなJSONデータ。

まずは、モデルクラスをつくる

モデルクラス

item.java

Interface

次に、APIのURL毎に対応する関数が羅列されているインターフェースをつくる

MyApiInterface.java

Activity

Android – ライブラリの使い方

socketでインターネット接続すると、毎回AsyncTaskとか使わなくてはいけなくてめんどくさいので、ライブラリを使うのが一般的らしい。

参考:色んなAndroidアプリが使っているオープンソースライブラリを調べた

おすすめライブラリぽいやつ
Retrofit
Android Asynchronous Http Client
OkHttp

とりあえず、Android Asynchronous Http Clientというのを使ってみる。

ライブラリの読み込み方

参考:Android Studioでライブラリを取り込む3つの方法
外部のリポジトリからローカルに取り込む方法が一番いい気がする。

Android Asynchronous Http ClientのInstallation & Basic Usageというところに、設定方法が書いてあった。

build.gradleのdependeciesに下記を追加する。

Activityでインポートする。

使ってみる

Android – socket

パーミッション設定

インターネット接続する場合、AndroidManifest.xmlにパーミッション設定を書く必要がある。

インターネット接続をActivityのonCreateとかで使うとエラーになる。UIスレッドで使ってはいけない。別のスレッドで使う。AsyncTaskのdoInBackgroundとかでやる。

http通信してみる

MainActivity.java

MyTask.java

Android – AsyncTask

参考:AsyncTask
参考:AsyncTaskを使った非同期処理のきほん

と書いてある。doInBackgroundメソッドの引数の型, onProgressUpdateメソッドの引数の型, onPostExecuteメソッドの戻り値の型らしい。

AsyncTaskクラスを継承したクラスを作って、非同期処理を書く。
Activityで、上記タスクのインスタンスを作って、executeで非同期処理を実行させる。
execute時に、doInBackgroundの引数を渡せる。doInBackgroundの引数は何個でも渡せるようにする必要があるっぽい。

MyTask.java

MainActivity.java

非同期処理中のプログレスバー表示

AsyncTaskは、4ステップある。あと、1回しか使えない。なので一回だけ非同期処理したいときに使うやつらしい。

  1. onPreExecute 実行前
  2. doInBackground 実行開始
  3. onProgressUpdate 実行中
  4. onPostExecute 実行後

onPreExecuteでプログレスバーを初期設定・表示させて、doInBackgroundで進捗状況を計算して、onProgressUpdateを都度実行させて、onProgressUpdateでプログレスバーを更新して、onPostExecuteでプログレスバー消す。

MyTask.java

Windows10でJavaのkeytoolを使う

FirebaseでAndroidのアプリを登録するときに、デバッグ用の署名証明書を登録するように言われます。Javaのkeytoolというツールを使って作成することができます。使い方は、Javaのkeytool.exeが入ってるフォルダに移動して、コマンドプロンプトとかでkeytoolと打つと使えます。

(コマンド例)

Androidのデバッグ証明書のフィンガープリントを取得する