ミルクティーと雑記

ミルクティーとプログラミングと趣味と雑記

ViewPager2とBottomNavigationViewのPage位置を同期する

ViewPager2とBottomNavigationViewを組み合わせて使う際、必要なのが位置の同期。

具体的には下記の2つの流れで、位置を同期する必要があります。

①BottomNavigationView→ViewPager2

  • Positionを取得する。

  • ViewPagerの位置を設定する。

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    int id = menuItem.getItemId();
    switch (menuItemId) {
        case R.id.bnav_home:
            position = 0;
            break;
        ...
    }
    viewPager.setCurrentItem(position, true);
}

動作ログ

D/Logger: BottomNavigationView onNavigationItemSelected position=2
D/Logger: ViewPager            onPageScrollStateChanged state=Settling
D/Logger: ViewPager            onPageSelected position=2
D/Logger: ViewPager            onPageScrollStateChanged state=Idle

②ViewPager2→BottomNavigationView

  • positionを取得する。

  • BottomNavigationViewの位置を設定する。

viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback()
    @Override
    public void onPageSelected(int position) {
        bottomNavigationView.getMenu().getItem(position).setChecked(true);
    }
    ...
}

動作ログ

D/Logger: ViewPager onPageScrollStateChanged state=Dragging
D/Logger: ViewPager onPageScrollStateChanged state=Settling
D/Logger: ViewPager onPageSelected position=2
D/Logger: ViewPager onPageScrollStateChanged state=Idle

onPageSelectedの契機が①と②どちらかを区別する

それぞれの動作ログを見ると分かるのですが、どちらの場合でもonPageSelectedが呼ばれます。

どちらでも呼ばれるからと言って、動作がおかしくなるとかでは全くないのですが、区別したいケースがあったりすると思います。

ここでは呼ばれる契機がどちらかを区別するため、ViewPager2.OnPageChangeCallbackをextendsして改造してみます。

ちなみにViewPager2の実装は下記にあるのですが、その中でOnPageChangeCallbackがabstract classで定義されてます。これをいい感じにします。

android.googlesource.com

上の2つの動作ログのViewPagerに関するもので違いが出てくるのが、state=Draggingの行です。

よって、state=Draggingのタイミングがあったかどうかを保持していけばよさそうです。

実装した結果は下記の通りです。

import androidx.annotation.Px;
import androidx.viewpager2.widget.ViewPager2;

public abstract class OnPageChangeCallback extends ViewPager2.OnPageChangeCallback {

    private boolean isDragging = false;

    public abstract void onPageSelected(int position, boolean isDragged);

    @Override
    public void onPageSelected(int position) {
        onPageSelected(position, isDragging);
    }

    @Override
    public void onPageScrollStateChanged(@ViewPager2.ScrollState int state) {
        switch (state) {
            case ViewPager2.SCROLL_STATE_DRAGGING:
                isDragging = true;
                break;
            case ViewPager2.SCROLL_STATE_IDLE:
                isDragging = false;
                break;
            case ViewPager2.SCROLL_STATE_SETTLING:
            default:
                // NOP
                break;
        }
    }
}

使う側ではこんな感じです。

viewPager.registerOnPageChangeCallback(new OnPageChangeCallback() {
    @Override
    public void onPageSelected(int position, boolean isDragged) {
        if (isDragged) {
            // ViewPagerのスクロール契機だったら、BottomNavigationViewに伝える
            bottomNavigationView.getMenu().getItem(position).setChecked(true);
        }
    }
    ...
});

こうすれば、どっち契機のonPageSelectedかが判別でき、どっちかだけアニメーションしたい、とかいうのも実現できそうです。

Kotlin触ってみた(編集中)

業務でMVVMとかDataBindingを使っていくことになり、勉強しているのですが 世に出回っているサンプルとか公式のCodeLabもKotlinだらけになってきている...

業務ではJavaで使う予定なのでなんとも...

Google IOとかではKotlinファースト宣言してたりするので どんどん触っていかないとな....

といったところで、Kotlin関連の備忘録があればここに随時まとめてかく

RoomとKotlinを使うCodeLab

codelabs.developers.google.com

plugin with id 'kotlin-kapt' not found(シンクエラー)

解決法

  • 下記のコマンドをプロジェクトのルートで実行したら解消した。参考URLは忘れてしまった(おい) ※プロジェクトのルート:Android StudioのTeminalであれば最初にいるところで。Windowsコマンドプロンプトなら、該当のプロジェクトのルートに移動する。
$ gradlew clean

More than one file was found with OS independent path 'XXX'(ビルドエラー)

解決法

  • build.gradle(Module: app)のandroid配下に下記のように追加するといいらしい

  • 参考URL:StackOverFlow

android {
    ...
    packagingOptions {
        exclude 'XXX'
    }
}

DialogみたいなActivityのStyle作り

背景透明にしたり、アニメーションをダイアログ準拠にしたり。

style.xml

<style name="AppTheme.Translucent" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
</style>

以上。

マカフィーからWindows Defenderに切り替える

こんにちは。

今使ってるノートPCのセキュリティソフトがMcAfeeなんですけど、 1年間の使用期間が終了したので、Windows Defenderに切り替えることにしました。

ただ調べたらマカフィーは厄介で、アンインストールしてあげないとWindows Defenderに切り替えられないんですよ。

なんで、備忘録的な意味も込めてここにまとめておきたいと思います。

環境

使用OS:Windows 10

方法

①コントロールパネルを開く

 Windowsキーを押して、「W>Windowsシステムツール>コントロールパネル」をクリックする

www.atmarkit.co.jp

②プログラムと機能を開く

 「プログラム>プログラムのアンインストール」をクリックする。

マカフィーのセキュリティソフトをアンインストールする

 一覧が表示されていると思いますが、その中からアンインストールしたいマカフィーのセキュリティーソフトを見つけて「アンインストールと変更」をクリックします。私の場合、「マカフィー リブセーフ」をアンインストールしました。

Windows Defenderを更新する

 セキュリティソフトがWindows Defenderだけになったので、必ず更新しましょう。

おわりに

ということで、私のノートPCのセキュリティソフトは晴れてWindows Defenderになりましたとさ。性能的には、マカフィーよりWindows Defenderの方が良さそうっていう結果が過去に出ている(今は分からん)ので、当分はWindows Defenderでよいかな。以上です。

japan.norton.com

ブログを始めるの巻

自己紹介

はじめまして、milkteanです。

去年の4月に社会人になりまして、プログラマをやってます。 趣味はミルクティーを飲むこと、と言ってしまうほどにリプトンのミルクティーが好きです。

あと、辛うじて趣味と言えそうな好きなことは、ふとした時に写真を撮ることです...使ってるのはスマホですが。 京都行くのも好きです(?)。と言っても雰囲気ばかりで、歴史に詳しいわけではありません(汗)

パッと思いつく自己紹介っぽい文言は以上になります。 何卒よろしくお願いいたします。

本題

と言ったところで、この度ブログを始めることにしました。

そんな大層な動機とかなく、なんとなくブログ書いてみたい欲があったので、 開設しました。

...と、ちょっとカッコつけてしまいましたが、前々から以下の目的でやりたいと思ってました。

  1. 書く機会を増やすことで、文章力を上げたい
  2. 自分のためだけだとちょっとモチベーション持たないから、OUTPUTとして公開したい
  3. 他のサイトを見て得たことを分類分けしてまとめておきたい

すごい意識高そうなことを書き連ねましたが、あくまで風なので() とりあえず、1個ずつ詳しく書いていきます。

①書く機会を増やすことで、文章力を上げたい

開発作業の中で、お客様先へ仕様について質問したり実装した内容について説明したりする際に 対面やSkypeなどではなく、文章でまとめることが多くなってきました。 書いてはレビューで指摘を受けたり、自分の中でまとまらず時間を食ってしまったり。 こんなことで時間を使わず早く実装したい!って思いながらキーボードとじゃれあっています。

特に自分の中でまとまらない件については、数打って早くなっていくしかないのかな、と現状思ってます。 その数打っていく方法の1つとして、ブログをやってみたい、と考えました。

②自分のためだけだとちょっとモチベーション持たないから、OUTPUTとして公開したい

文章の後半がちょっと筋通ってない感ありますが、気にしないようにしましょう。 単純に公開、言ってしまえば披露することをモチベにしたいと考えてます(直球)。

自分の性格的に、自分のためだけだと途中で飽きてしまうんですよね。。。 でも人のためだとやる気が出たりします。

教室の掃除は張り切ってするのに、自分の部屋の掃除はあまり気が乗らない、とか学生の頃よく...というか常にありました。

だから、飽きそうになるところを、ブログに書くためになんとかやり遂げられるようになりたい(願望)

③他のサイトを見て得たことを分類分けしてまとめておきたい

プライベートでアプリとか作ってみる時、分からんな~と思ったら長々とググりまくったりしてブックマークが増えていくのですが、 ブックマークに登録しておくだけじゃ、後でブックマーク漁った時にまたブログの要旨を把握するところからしないといけないんです...拙者記憶力ないので。

中には、めっちゃ役立つことがちょろっと書いてあるんだけど、全体としてはめっちゃ長い(前置き長いとか)ブログとかありますよね多分。

あと、あのブログとこのブログの情報を組み合わせてうまく行ったわ、とか、そういう自分向けの付加情報とかブックマークじゃどうにもならない気がするんですよね。

そういう時に自分が見返しやすい状態にしておける、かつググる延長線上でネットで見れるっていうのに、ブログが挙がりました。

というわけで

書き出し始めると、意外にも文章は出てくるんですね...読みやすさは置いておいて。

こんな感じで?技術系であったり写真系であったり旅行系であったりミルクティー系(?)であったり、色んな人に必要とされそうな記事を上げられるように頑張っていきます。

頻度はあんまり考えていなくて、気が向いたら書く、みたいな感じで...(既にあやしい)

というわけで、これから何卒よろしくお願いいたします。