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

プロジェクトの構成を見ていきます。
ソースコードに関係ありそうな自動的に生成されたものの一部は、

画像2

続いて、前回の実行時の画像

画像2

実行時の画像の下のメニューに
「Home」、「Dashboard」、「Notifications」とあって、
プロジェクトの構成にも同様に存在しているので、
単純にそれぞれが対応していて、
MainActivityはそのままメイン処理ですかね?

とりあえずMainActivityから見ていこうと思います。
頭にあるimportは無視して、記載されているコードは下記になります

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)
    }
}

Noteがプログラムコード載せるのに非常に向かないと思ったのですけど、
範囲選択してCodeを選んだら上記のようになったので、
とりあえずこれで。本来の使い方なのかはちょっとわからないですけど。
Code部分は、X軸方向のスクロールができるので
見づらいですけど全体を見ることができるかと思います。

では見ていきましょう。
・・・はい、いきなりですけど、スタート地点がわからないです。
これクラスの宣言がされているだけですよね?
ほかのファイルも開いてみたのですけど、
それっぽい場所がないのですよね。

いやお前、Z80とCしかわからないんじゃないのか?
と思われるかもしれませんけど、
C++とVC#はある程度分かります。
検索して目的のツールが作れるくらいの理解度です。
使えるとはちょっと言えないと思います。

onCreate()はオーバーライドされているみたいなので、
名前的にもコールバック的な関数でしょうか?
AppCompatActivityの中を見てみた方がよさそうですかね?
C言語みたいにmain()的な関数で始まるわけではなさそうですね。

AppCompatActivityのリファレンス
今の時代ネットで大体のことは調べられるのは、本当にすごいことですね。
目的のOnCreate()は、パブリックコンストラクタのところに記載があったので引用

<init>(@LayoutRes contentLayoutId: Int)
の一部として拡張されるデフォルトのレイアウトを提供するために使用できる代替コンストラクターsuper.onCreate(savedInstanceState)。

と記載されていますね・・・?
代替コンストラクタ(セカンダリコンストラクタ)という概念を初めて聞いた気がします。
Kotlinのリファレンス(リンクはClassのページ)も見つけたので

セカンダリコンストラクタ
クラスは、 constructor プレフィクスと共に セカンダリコンストラクタ を宣言することができます:
class Person {
constructor(parent: Person) {
parent.children.add(this)
}
}
もしクラスがプライマリコンストラクタを持つなら、それぞれのセカンダリコンストラクタは直接的または間接的に、他のセカンダリコンストラクタを介してプライマリコンストラクタへ委譲する必要があります。 同クラスの他コンストラクタへの委譲は this キーワードを用いて行います:
class Person(val name: String) {
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
もし非抽象クラスが何もコンストラクタ(プライマリ、セカンダリ共に)を宣言しなければ、プライマリコンストラクタが引数無しで生成されます。その際のコンストラクタの可視性はpublicになります。もしpublicなコンストラクタを望まないならば、空の主コンストラクタをデフォルトでない可視性で宣言する必要があります。

あ・・・はい。
まぁ、あまり関係なさそう。
実体をどこで持っているのか?どこから始まっているのか?
という疑問は説明できないです。
手詰まりなので上の方に鎮座している AndroidManifest.xml  を見ました。
名前的にも何かルール的なものがわかるのかもと思ったので。
ただxml・・・良く分からないのですよね。
基本的な知識に乏しいと困りますね。

内容は下記のCodeになっている部分で、
正直見てもさっぱりなので検索して調べていったら
developerのアクティビティの概要に行きつきました。
このページの
アクティビティのコンセプトと
アクティビティのライフサイクルの管理
という項目で概ね疑問は解消されました。
まだきちんと理解はできていないと思いますけど、
ざっくりとした理解では、

現在アクティブな(またはアクティブになる)画面?の状態に応じてOnXXXXが(システムから?)呼ばれる。

実際のスマートフォンの動作から考えても納得できる作りですね。


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.test">
   <application
       android:allowBackup="true"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:roundIcon="@mipmap/ic_launcher_round"
       android:supportsRtl="true"
       android:theme="@style/Theme.Test">
       <activity
           android:name=".MainActivity"
           android:label="@string/app_name">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
   </application>
</manifest>

ちょっと長くなったので今回は此処までですかね。
恐ろしいことに元々の予定は何も進んでいないのですよね・・・。
最初からドキュメント熟読すれば良いのでしょうけど、
それだと奇麗にまとめてある記事はたくさんあると思うのと、
ドキュメント見ればいいんだよ!としか書けなくなるので、
私はとりあえずやってみて、
疑問を解決するやり方で続けてみようかと思います。

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