ActionBarにプログレスインジケータを出す
通信中を表す為にActionBarにプログレスインジケータを出そうと昔のコードを引っ張って来たら出なくなっていたのでそのメモを。 なお、ちゃんと調べてないので不要な事も含まれているかもしれない。
追記: ギャラノ3(AndroidのバージョンはL)では動かなかった…
まず最近のAndroidでは、ActionBar回りのカスタマイズはカスタムのToolbarを使うようになっていて、以前のActivityに生えていたメソッド群はdeprecatedになっている(し動かない)。
カスタムのToolbarを使う手順は、
- AndroidManifest.xmlでアクションバー無しのテーマにする
- layout.xmlにandroidx.appcompat.widget.Toolbarの要素を入れる
- onCreateでsetSupportActionBarを呼び、上記のToolbarを渡す
で良いはずなのだが、これではProgressBarのindicatorが出なくなっていた。 原因はちゃんと調べてないが、色がかぶっているっぽい?indeterminateTintを指定したら出るようになった、という話。
将来の為に一応以下詳細をメモしておく。
AndroidManifest.xmlでアクションバー無しのテーマにする
AndroidManifest.xmlの目的のactivityで、以下のようにする。
<activity android:name="com.github.harukawa.drivetext.MainActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
layout.xmlにandroidx.appcompat.widget.Toolbarの要素を入れる
ConstraintLayoutの中に以下のように入れた。
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ProgressBar
android:id="@+id/progressBar"
android:indeterminateTint="@color/colorAccent"
android:indeterminateTintMode="src_atop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</androidx.appcompat.widget.Toolbar>
さらにこの下に置いていたViewをToolbarの下になるようにapp:layout_constraintTop_toBottomOf="@+id/toolbar"
を追加した。(これいるかしら?)
このProgressBarの所にあるandroid:indeterminateTint="@color/colorAccent"
とandroid:indeterminateTintMode="src_atop"
いうのが今回追加しないと表示されなかった所。
前者はNのタブレットでで、後者はLのスマホで必要になった。(support library v7時代はLのスマホはどちらも要らなかったはずだが…)
テーマ回りのデフォルトとかが変わっているのかしら?
onCreateでsetSupportActionBarを呼び、上記のToolbarを渡す
onCreateのsetContentViewしたあとで、以下を呼び出す。
setSupportActionBar(findViewById(R.id.toolbar))
あとはインジケータを出したい所で、以下のshowCommuniationIndicatorを呼ぶ。
fun showCommunicationIndicator() {
findViewById<View>(R.id.progressBar).visibility = View.VISIBLE
}
fun hideCommunicationIndicator() {
findViewById<View>(R.id.progressBar).visibility = View.GONE
}