- 投稿日:2019-03-24T23:48:16+09:00
NavigationViewの区切り線の高さを変える
はじめに
Design Support Libraryの
NavigationViewを使ってナビゲーションドロワーを実装しており、各グループ毎に表示される区切り線(separator)の高さを調整したいという要望がありました。StyleやAttributeで簡単に実現できるだろうと思っていたのですが、ちょっとハマったのでメモします。
実装
NavigationViewの基本的な実装は 公式のドキュメント を参考に進めます。独自のレイアウトを使いたい場合はactivity_main.xml<DrawerLayout> <FrameLayout /> <NavigationView> <include layout="@layout/navigation_view"> </NavigationView> </DrawerLayout>みたいな感じでよしなにやってくれればいいかと。XMLで設定できる内容を 公式ドキュメント で確認します。
XML attributes 内容 itemBackground メニュー項目の背景を指定したリソースに設定する。 itemIconTint メニュー項目のアイコンに適用される色を設定する。 itemTextAppearance メニュー項目のテキストの外見を指定したリソースに設定する。 itemTextColor メニュー項目のテキストの色を設定する。 と、区切り線に関する設定は表記されていませんでした。次にDesign Support Libraryで
NavigationViewがどのように実装されているのかAndroid Studioを使ってソースコードを追ってみました。ヘッダー、メニュー項目、サブタイトル、などのレイアウト(ViewHolder)の読み込みは
NavigationMenuPresenterで行われていました。区切り線(separator)の部分はNavigationMenuPresenter.javaprivate static class SeparatorViewHolder extends NavigationMenuPresenter.ViewHolder { public SeparatorViewHolder(LayoutInflater inflater, ViewGroup parent) { super(inflater.inflate(layout.design_navigation_item_separator, parent, false)); } }という実装でした。この読み込んでいる
design_navigation_item_separator.xmlを上書きしてしまえば、ワンチャンいけるのでは
before after いけました。具体的にはDesign Support Libraryと同名のレイアウトを作成するだけです。
design_navigation_item_separator.xml<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <View android:layout_width="match_parent" android:layout_height="8dp" android:background="?android:attr/listDivider" /> </FrameLayout>
まとめ
本来であれば
RecyclerViewを配置してゴニョゴニョするのがセオリーだと思うのですが(Stack Overflowでもそのように回答されてました)、手を抜きたいなるべシンプルな実装を目指した結果こうなりました。なお、あくまでも個人の解決方法であり、これが正しい実装とは限りませんのでご了承ください。また、Design Support Libraryのバージョンを更新した場合、リソースの名称が変更される可能性があるので、都度確認する必要がありそうです。サンプルを GitHub にアップしておきます。
どうでもいい話
ナビゲーションドロワーは『ハンバーガーメニュー』とも呼ばれます。由来としては、メニューの横3本線で構成されたアイコンがハンバーガーに見えるかららしいです。
参考文献
- 投稿日:2019-03-24T00:40:24+09:00
Roomのcolumn追加方法
はじめに
覚書程度なので注意。
わかりづらいと思う。
後これがあってるかどうかもわかんない…。変更箇所
- DBのVersion管理してるところ(AppDataBase)
- DBの呼び出し箇所(Activity,Fragment)
- DBの中身書いてるところ(Interface)
AppDatabase
DBのVersionをあげる(今回の場合は1→2)
AppdataBase.kt@Database(entities = [DBのテーブル(クラス)::class], version = 2) //この部分を2へ abstract class AppDataBase : RoomDatabase() { //DAOとか書いてあるけども今回は省略 }Activity,Fragment
呼び出し部分の前に変更させるSQL文を記述
Migration.ktval MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { //カラム追加 database.execSQL("ALTER TABLE [テーブル名] ADD [追加したいカラム名] [追加するカラムの型]") } }呼び出し部分でMigrationを行う
Main.ktval dataBase = Room.databaseBuilder(activity.applicationContext, AppDataBase::class.java, "データベース名") .addMigrations(MIGRATION_1_2) //Migration .build()Interface
追加したカラムのcolumnInfoを作る
InterFace.kt@Entity class Database { @PrimaryKey(autoGenerate = true) var userId: Int = 0 //// 追加部分 @ColumnInfo(name = "追加したカラム名") var 変数名: [型]? = "" }終わりに
DBを壊さずにこれで一応カラム追加とかできる。

