Z80系アセンブラとC言語しかわからないおっさんがアンドロイドアプリの開発環境を整える#05

プロジェクトの構成を見ていきます(2回目)。
前回の#04で、とりあえずはMainActivityのOnCreate()から始まることがわかりましたので、改めて。前回も貼ったコードですが、下記になります。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val navView: BottomNavigationView  = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        val appBarConfiguration = AppBarConfiguration(setOf(R.id.navigation_home, R.id.navigation_dashboard,R.id.navigation_notifications))
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }
}

順番に見ていきます。

super.onCreate(savedInstanceState)

親Classのコンストラクタの呼び出し。
言語仕様上必ず必要。
savedInstanceStateは、Bundle型…後ろについている「?」は、
ざっと検索してみた感じNullを許容する感じなのかな?
Bundle型はちょっと調べただけだと分からなかったので一旦スルー…。

setContentView(R.layout.activity_main)

SetContentView()をちょっと調べたらViewを設定と書かれていて、そもそもViewって何?となったので、DeveloperのViewのリファレンス
良く分からないですけど…名前の通り、表示、描画関連するclassですね。
詳細は必要に応じてですかね。
引数になっている「R.layout.activity_main」は、
プロジェクトのlayout内にacrivity_main.xmlがあるのでこれを指定でしょうか?
レイアウトのリファレンスをみて、今回必要な部分だけ引用すると

XML リソースの読み込み
アプリをコンパイルすると、各 XML レイアウト ファイルは View リソースにコンパイルされます。Activity.onCreate() コールバックの実装で、アプリコードからレイアウト リソースを読み込む必要があります。これを行うには、setContentView() を呼び出し、R.layout.layout_file_name の形式でレイアウト リソースへの参照を渡します。たとえば、XML レイアウトが main_layout.xml として保存されている場合、次のようにしてアクティビティに読み込みます。

となっています。
プロジェクトの構成を見ると

画像1

となっているのでR(res).layoutということですかね。
resは前の引用からみてもリソースのことだと思うのでリソースで調べると
Developerのアプリリソースのリファレンスが見つかりましたので、
部分的に引用すると

このファイルを main.xml として保存すると、R.layout.main として参照可能なリソースにコンパイルされますが、実際のところ、これは R.layout.main_ltr リソースのエイリアスです。

ということなので、これはこういうものらしいです。
では、そのactivity_main.xmlを見てみます。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:id="@+id/container"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingTop="?attr/actionBarSize">

   <com.google.android.material.bottomnavigation.BottomNavigationView
       android:id="@+id/nav_view"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_marginStart="0dp"
       android:layout_marginEnd="0dp"
       android:background="?android:attr/windowBackground"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintLeft_toLeftOf="parent"
       app:layout_constraintRight_toRightOf="parent"
       app:menu="@menu/bottom_nav_menu" />

   <fragment
       android:id="@+id/nav_host_fragment"
       android:name="androidx.navigation.fragment.NavHostFragment"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       app:defaultNavHost="true"
       app:layout_constraintBottom_toTopOf="@id/nav_view"
       app:layout_constraintLeft_toLeftOf="parent"
       app:layout_constraintRight_toRightOf="parent"
       app:layout_constraintTop_toTopOf="parent"
       app:navGraph="@navigation/mobile_navigation" />

</androidx.constraintlayout.widget.ConstraintLayout>

いや…わからん。見たくない。
大雑把に全体のレイアウト、画面サイズの指定と
下部のナビゲーションボタンと何かの設定をしているというのは見て取れますね。
xmlのリファレンス探したのですけど見つからないのですよね…。
画面を作るだけならLayout Editor使えばいいので、困りはしないかもしれませんが。

val navView: BottomNavigationView = findViewById(R.id.nav_view)

「R.id.nav_view」リソースの中に id なんてフォルダはなかったので…
R.xx.xxxxxxxxは、なんかそういうもの。ということみたいですね。
プロジェクトの構成がとか若干どやっていたのがはずかしい。
「findViewById()」は名前の通りIDからViewを取得。
リファレンスはこちら
しかしこの書式、すごく違和感があります。
navViewが変数名でBottomNavigationViewが型なのですね。
「R.id.nav_view」は、少し前に記載してした「activity_main.xml」の「android:id="@+id/nav_view"android:id="@+id/nav_view"」
のことだと思います。
注目するのは、idの記載と同じブロックにある
「app:menu="@menu/bottom_nav_menu"」で、
プロジェクトに
「menu\bottom_nav_menu.xml」が存在しているのでみてみると

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
   <item
       android:id="@+id/navigation_home"
       android:icon="@drawable/ic_home_black_24dp"
       android:title="@string/title_home" />
   <item
       android:id="@+id/navigation_dashboard"
       android:icon="@drawable/ic_dashboard_black_24dp"
       android:title="@string/title_dashboard" />
   <item
       android:id="@+id/navigation_notifications"
       android:icon="@drawable/ic_notifications_black_24dp"
       android:title="@string/title_notifications" />
</menu>

メニューのアイコンとタイトルの指定?だけですかね??
一旦そんなものと思ってスルーします。

val navController = findNavController(R.id.nav_host_fragment)

val appBarConfiguration = AppBarConfiguration(setOf(R.id.navigation_home, R.id.navigation_dashboard,R.id.navigation_notifications))
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)

で残りが上の部分なのですけど……分かっていて目を瞑っていたのですが、
画面の各名称を知らないのですよね。これが理解の妨げになってきたので、簡単に調べてみた感じでは、

画像2

雑な画像ですけど、上記の名称のようです。
アクションバーはアプリケーションバーとも呼ぶらしいです。

で、名称を理解したうえで、ここちょっとわからないのですよね。
一行ずつ見ていきます。

val navController = findNavController(R.id.nav_host_fragment)

「R.id.nav_host_fragment」も「activity_main.xml」の「android:id="@+id/nav_host_fragment"」のことでしょう。
ここも同じブロックにある
「app:navGraph="@navigation/mobile_navigation"」
で、これもプロジェクト内に
「navigation\mobile_navigation.xml」が存在しているので見てみると

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/mobile_navigation"
   app:startDestination="@+id/navigation_home">
   <fragment
       android:id="@+id/navigation_home"
       android:name="com.example.test2.ui.home.HomeFragment"
       android:label="@string/title_home"
       tools:layout="@layout/fragment_home" />
   <fragment
       android:id="@+id/navigation_dashboard"
       android:name="com.example.test2.ui.dashboard.DashboardFragment"
       android:label="@string/title_dashboard"
       tools:layout="@layout/fragment_dashboard" />
   <fragment
       android:id="@+id/navigation_notifications"
       android:name="com.example.test2.ui.notifications.NotificationsFragment"
       android:label="@string/title_notifications"
       tools:layout="@layout/fragment_notifications" />
</navigation>

分からないなりに見ていくと、
「app:startDestination="@+id/navigation_home"」
最初に表示するのはここ。
というのと、fragmentにそれぞれlayoutが指定されているので、
表示するものはそれを参照してる感じでしょうか?

横道にそれまくっていますけど、これらの情報を取得してきているということですね。

続いて、

val appBarConfiguration = AppBarConfiguration(setOf(R.id.navigation_home, R.id.navigation_dashboard,R.id.navigation_notifications)) 

setOfの概念がわからないですけど、アクションバーの設定でしょうか?
id自体は「menu\bottom_nav_menu.xml」に定義されています。
中身見る限りはアクションバーのタイトルの指定でしょうか???

雑になってきましたけど、続いて

setupActionBarWithNavController(navController, appBarConfiguration)

developersのdocumentに記載を見つけたので少しだけ引用すると、

デフォルト アクションバーにナビゲーション サポートを追加するには、メイン アクティビティの onCreate() メソッドから setupActionBarWithNavController() を呼び出します。

とのことです。最後に

navView.setupWithNavController(navController)

こちらも、上記記載のdevelopersのdocumentに記載があって
ツールバーの作成とありました。ツールバーとは…なんぞや…
Windowsのあれのイメージでよいのですかね?
動かしてみてもそれっぽいものないのですけどね。なぞ。
document等々ちゃんと読んでみないとダメですかね。

あと、xmlが分からないせいかもしれないですけど、1つ疑問があって、
ボトムナビゲーションの各ボタンを押したときに何を表示するかの指定は、
「tools:layout」で指定されている解釈で良いのか?ですかね。
他にそれっぽいところがないのですけど。

ちょっとごちゃごちゃしすぎちゃいましたし、
もう少しきちんと理解するためにも
次回はここまでの内容をまとめてみようかと思います。

この記事が気に入ったらサポートをしてみませんか?