Callback だらけの Activity?

ロジック処理(分岐とか通信とか)は Presenter が持ってるし
View の処理はちゃんと Callback で返してる
理想的な構造になってるけど Activity を見た時 Callback だらけで何やってるか追えないとわからなくなっていた
少しでもわかりやすくする方法の一つとして
Callback の数を少なくする(View 一個一個に当てずにまとめて Callback にする)
のがわかったのでメモ。

if (条件) {
  view.showNameView();
  view.showAddressView();
...
}

以下のようにまとめられる

if (条件) {
  view.showUserView();
}

どの処理を Presenter に持たせればいいか迷ったとき参考にする

MVP では複雑なロジックが入った通信処理などは Presenter に書いてテストを書くのが基本だけど
軽い分岐ぐらいのロジック処理をしてるメソッドはどうすべきか悩んでいた
(=テストを書くほどの処理なのかの判断がつかない)

結論そこまで悩むなら書くか、PR で意見をコメントしておくかにする!

いつか使うかも知れない〜ImageView に border を付ける

コピペですぐ使えるようにしておこう…

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF" />
    <stroke
        android:width="1dp"
        android:color="#000000" />
    <padding
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp"
        android:top="1dp" />
</shape>

./idea/codeStyles/Project.xml の Objective-C-extensions を消す

リモートではちゃんと消されていたけど
ローカルに落とすとなぜか以下のコードが毎回生成されてた

...
<Objective-C-extensions>
    <file>
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
    </file>
    <class>
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
    </class>
    <extensions>
        <pair source="cpp" header="h" fileNamingConvention="NONE" />
        <pair source="c" header="h" fileNamingConvention="NONE" />
    </extensions>
</Objective-C-extensions>
...

どうやら Android NDK Support Plugin の default で追加されているっぽい
AndroidStudio の plugin 設定から Android NDK Support を外せば生成されなくなった。

f:id:lee_san:20190117194449p:plain

databinding で「&&」の書き方

いつもの databinding で View の表示を設定しようとした時
&&の処理が必要になり、そのまま書いたら使えないことに気づいた

&&&amp;&amp;
||||
<&lt;
>&gt;

なので以下のように書いていけた

android:visibility="@{isLogin &amp;&amp; isBuyer ? View.GONE : View.VISIBLE}"

が、そもそも xml で書かなくてもいいことに気づき、使えなかった…

RecyclerView の区切り線を Inset dividers にする

マテリアルデザインの dividers は2種類あり 、その中 Inset dividers を実装する方法をメモする

1. Inset dividers の drawable リソースを作成する

  • 区切り線だけ入れたバージョン

list_divider_sample1.xml

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="72dp">
    <shape android:shape="rectangle">
        <size android:height="1dp" />
        <solid android:color="@color/dividers_color" />
    </shape>
</inset>
  • 区切り線+背景色まで入れたバージョン

list_divider_sample2.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
        </shape>
    </item>
    <item>
        <inset android:insetLeft="72dp">
            <shape>
                <size android:height="1dp" />
                <solid android:color="@color/dividers_color" />
            </shape>
        </inset>
    </item>
</layer-list>

2. 1で作った drawable リソースを RecyclerView にセットする

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
Drawable drawable = AppCompatResources.getDrawable(this, R.drawable.list_divider_sample1);
if (drawable != null) {
    dividerItemDecoration.setDrawable(drawable);
}
recyclerView.addItemDecoration(dividerItemDecoration);

終わり!