Hatena::ブログ(Diary)

前人未踏の領域へ

2017-07-27

[]TextViewとandroid:autolinkの話


課題

TextViewにandroid:autolinkを設定すると、TextView内に記述されたURLは電話番号などを自動的にリンク化して
クリック可能にしてくれる。これは便利で良いのだけれど、文末がリンクで終わっていたりすると
TextViewのwidthがmatch_parentだったりした場合に残りの余白すべてがリンクになってしまい、
余白部分のクリックをリンクが奪ってしまう(端末やバージョンによるかも)。

対策


対策としてはsetText()する際にスペースを最後に一文字足せばそこでリンクが切れるのだけど、
それをautolinkしてるTextViewに全部やるのもちょっと面倒だな。

2017-07-20

[]大切なブランチを消してしまった場合の復活の呪文


$ git reflog 
$ git branch <ブランチ名> <コミット>

参考


http://hacknote.jp/archives/15995/
助かりました。感謝

2017-07-19

[][]DeepLink時のバックボタン対応


DeepLink時に必要となるintent-filterの話には触れていない。
遷移後、呼び出し元に戻るための話。

課題


AndroidのDeepLink対応をすることになったがフッタータブや
ヒストリー管理があって戻るボタンを押すとアプリ内のバックスタックが動作してしまう。
いい感じに呼び出し元アプリに戻れるようにしたい。

対応


  • アプリとは切り離したランディング用のActivity(=LandingActivity)を用意する。
  • ランディングActivityではタブ等のグロナビは表示しない。
  • taskAffinityをデフォルトとは異なるものにする(.landing など)
  • autoRemoveFromRecents="true" を設定する

 <activity
            android:name=".activity.LandingActivity"
            android:autoRemoveFromRecents="true"
            android:exported="true"
            android:taskAffinity=".landing">

taskAffinityを指定することで自分のアプリのタスクと分離するため、
別アプリから起動した際に自アプリのタスクと結び付かなくなる。
こうすることでLandingActivityをfinishした時点で呼び出し元に戻る。

taskAffinityを分けるとタスクが別れるのでオーバービュー画面(最近使用したアプリ)に別々に表示されるようになる。ここに表示する必要はないので
android:autoRemoveFromRecents="true" を使って削除する。

いずれにしてもtaskAffinityを気にする機会に初めて遭遇した。

参考


  • Instagramアプリ

タブの表示を放棄している点を参考

2017-07-14

[]ViewPagerと親Fragment間でのメニューアイコンの制御

課題

親FragmentでMenuアイコンを表示する必要があるが、 ViewPager内の子FragmentでもMenuアイコンを使用している。
親Fragment側にsetHasOptionsMenuを記述しないと子Fragmentアイコンが重複してされてしまうことがあり、どのようにすればよいか。

対応

  • 双方にsetHasOptionsMenu(true);をセットする。
  • onOptionsItemSelectedで自Fragment側に対応するアイコンがある場合はreturn trueを、そうでなければreturn falseを返す。


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case 0: // info
                Utils.moveToInfo(getFragmentManager());
                return true;
        }
        // 対応するアイコンがなければfalse
        return false;
    }

return false; にすることで処理が子Fragmentに移譲される。
なのでonOptionsItemSelectedの最後は常にreturn falseが良いように思う。

別件でViewPagerの使い方を間違えていたので子アイコンが重複表示される件は別な問題かもしれない。

2017-06-27

[][][]同一ページ内の複数の広告ユニットをまとめる

課題

Adapter内の何箇所かに広告ユニットを仕込みたいが、同じ広告が二度出るのを避けたい。

対応

広告ユニットはプレースメントを使うことでまとめることができるが、プレースメントを
ターゲットにしただけでは1つのページで同じクリエイティブが選択されてしまうことがある。
Correlatorを使うことで1ページ分の広告リクエストを同じ画面であると認識させることが可能になる。

Correlator correlator = new Correlator();
//広告枠分繰り返しロード
for (final String id : ids) {
    AdLoader adLoader = 
        new AdLoader.Builder(getContext(),id)
        .forCustomTemplateAd(...)
        .withCorrelator(correlator) //複数のadLoaderをcorrelatorで繋げる
        .build();
    adLoader.loadAd(newRequest);
}

参考


https://developers.google.com/android/reference/com/google/android/gms/ads/Correlator

[][][]DFPのターゲット指定とAndroid側の設定の関係について

疑問

DFPのターゲット指定とAndroidの条件指定、どちらも一致しないといけないのか、そうではないのかが良くわからない。

回答

  • Android側のaddCustomTargetingの値は、DFP側に定義がなければ考慮されない。あれば一致が考慮される。
  • DFPのKey-Value値はAndroid側でもaddCustomTargetingで定義しないとHITしない。

関係

条件:広告ユニットまたはプレースメントが一致している

key-valueとcustomTarging有無case1case2case3case4
DFPありありなしなし
Androidありなしありなし
結果一致すれば表示非表示表示表示