diadia

興味があることをやってみる。自分のメモを残しておきます。

Android開発のためのメモ

Android開発入門時に読んだ本

基礎&応用力をしっかり育成!Androidアプリ開発の教科書 Kotlin対応 なんちゃって開発者にならないための実践ハンズオン

androidアプリ開発のメモ

良さそう後で読む
https://dev.classmethod.jp/smartphone/android/build-first-android-app-1/

app/mamifest.xmlは絶対に必要な要素らしい。システムにアプリコンポーネントに関する情報を与えるためのマニフェストファイル
app/java/url/MainActivity.kt アクティビティは画面を提供するコンポーネント

とりあえずエミュレーターからhello worldを表示できた

https://qiita.com/zaki-lknr/items/cdd3c2c82af1f1c0690b
こちらを見てやってみた。内容は、android studioをインストールしてプロジェクトをスタートしてそれをアンドロイド上で表示させるというものだ。 アンドロイド上で表示させる方法として自分のスマホにアプリを入れて表示させる方法と、エミュレーターを使って表示させる方法がある。自分のスマホを使って表示させるのがうまく行かなかった それはPCでスマホをうまく認識できなかったからで、USB managaerを使うと良いかもしれないという情報があったのでそれを使えば突破できるかもしれない。 とりあえずエミュレーターで表示する方法はわかったので、次は動きがあるようなアプリケーションを作成しエミュレーターで表示するようにしたい。

アプリ開発でよく編集するファイルは3つ

  • res/layoutフォルダのxmlファイル
  • javaフォルダの.ktファイル
  • res/valuesフォルダのstrings.xmlファイル

res/layoutフォルダのxmlファイルはアンドロイドの画面構成を決める。djangoでいうtemplateのような役割だと感じた。
javaフォルダの.ktファイル。djangoでいうviews.pyのような役割を持つ。
res/valuesフォルダのstrings.xmlファイルはdjangoの{{ object.name }}と書かれた場合に具体的にどのような値を表示するかを定めるようなファイルだと感じた。

開発手順にはパターンがある

  1. プロジェクト作成
  2. string.xmlに表示文字列記載
  3. layoutのxmlファイルで画面作成
  4. 処理系を.ktで記載(djangoのviews.pyにあたる)

xml宣言について

xmlファイルを作成するとき、一番最初に書かれるタグ内に?が含まれている。これはxml宣言の記法で?自体に意味があるわけではない。
htmlの宣言だってタグ内最初に!で始まるけど、別にそれに意味がないのと同じ

xmlnsについて

xmlnsが存在することを認識した。どうやらこれはxmlnamespaceのようだ。異なるプロジェクトや所属に対して明確に分けるために使うようだ

画面作成について

画面はxmlファイルの構造に基づいて表示される。したがってxmlの書き方を学ばなければならない。
xmlでは画面部品と呼ばれるビュー(ウィジェット)とビューをどのような配置にするか定めるビューグループを使って記載する。

ビューグループ
  • LinearLayout
  • TableLayout
  • GridLayout
  • RelativeLayout
  • ConstraintLayout

レイアウト系は開始タグ、終了タグを使ってビュー(画面部品)を括る形で記述する。
ビューの配置を決める役割を果たす。

ビュー(主なもの)
  • TextView
  • EditText
  • Button
  • RadioButton
  • CheckBox
  • Spinner
  • ListView
  • SeekBar
  • RatingBar
  • Switch
(補足)ビューでよく使われる属性について

android:id すべてのビューに記述する必要はない。記述する必要がある場合とは、.ktファイルでビュー操作を行う場合である。
記述方法は、@+id/hogehoge である。.ktファイルで要素を取り出すときはhogehogeのみ記述すれば当該ビューを指定できる。

android:text ビューの表示に際して入力した文字列が表示される。

android:layout_width/layout_height すべてのビューで記述する必要がある。

(補足)RadioButtonについて

htmlではラジオボタンの使い方は以下の通りだった。
ラジオボタンのname属性に同一の値を入れることでグループ化していた。

<input type="radio" name="favorite_color" value="red">赤
<input type="radio" name="favorite_color" value="blue">青
<input type="radio" name="favorite_color" value="yellow">黄色

アンドロイドのxmlでは以下のように行う。簡潔に言うとグループ化するための属性が存在せず、代わりにRadioGroupでRadioButtonを囲んでグループ化する。

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:background="#df7401"
        android:orientation="horizontal"
        android:paddingBottom="10dp"
        android:paddingTop="10dp">

        <RadioButton
            android:id="@+id/rbToday"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="25dp"
            android:layout_marginRight="25dp"
            android:background="#ffffff"
            android:text="@string/rb_today"/>
        <RadioButton
            android:id="@+id/rbYesterday"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:text="@string/rb_yesterday"/>

    </RadioGroup>    
(補足)EditTextの使い方

文字入力フォームを画面上に表示させたいときにはEditTextビューを使う。
よく使うと思われる属性値:

strings.xmlに記述する内容の種類

strings.xmlに書くタグの種類は複数ある。
stringとstring-arrayである。一つの内容を表示するときはstringタグを使う。ドロップダウン等の機能を使って複数種の文字列を表示したい場合はstring-arrayタグを使用する。

strings.xml ...

<resoruces>

    <string name="tv_opinion">ご意見、感想はこちら!</string>
    <string name="bt_opinion_send">送信する</string>


    <string-array name="sp_opinion">
        <item>大満足である</item>
        <item>まあまあ良かった</item>
        <item>普通である</item>
        <item>少し不満である</item>
        <item>悪い</item>
    
    </string-array>
    
</resoruces>

また、使用するタグの種類に応じてアンドロイドの画面でもstrings.xmlを呼び出す方法も変わってくる。
stringタグのものを表示するときは属性をtextにする。具体的に以下のようにする。

<TextView 
...
android:text = "@strings/hoge">

一方strings.xmlでstring-arrayタグを使ったものを呼び出す場合には、属性値も変わるので注意する。属性値はentriesである。

<Spinner 
...
android:entries = "@array/hoge-list">
#要点整理
#リストデータはstrings.xmlとSpinnerまたはListViewのでセットで覚えておく

strings.xml...
<resoruces>
    <string-array name="sp_opinion">
        <item>大満足である</item>
        <item>まあまあ良かった</item>
        <item>普通である</item>
        <item>少し不満である</item>
        <item>悪い</item>
    </string-array>
</resoruces>

レイアウトファイル...
<ビューグループタグ
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
>
    <SpinnerまたはListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:entries="@array/sp_opinion />

</ビューグループタグ>



画面部品を取得する方法

kotlinで画面部品を取得する方法はjavascriptのノードの取得と同じようなイメージで捉えると難しくないと感じた。
使うメソッドはfindViewById()である。

findViewById<画面部品の型>(Rで示したid値)

リスナーを引数とするインターフェースの作成

setOnClickListener()メソッドの引数にリスナーインスタンスを渡すとタップに対するリスナーを作成することができる。そしてこのsetOnClickListener()は画面部品(ビュー)に属する。だから使い方として、button.setOnClickLister()みたいな使い方になる。
ListViewのアイテムにリスナーをセットする際はsetOnClickListener()メソッドを使わないようだ。その代わり、onItemClickListener()メソッドをつかうようだ。これは各画面部品によって所持するメソッドが違うと推定しているけど実際どうなんだ?ていうかソースコードも読んで確かめたいけど、ソースファイルってkotlinで書かれているのか?

アダプタについて

リストビューに表示するリストデータを管理し、リストビューの各行にそのリストデータを当てはめていく働きをするオブジェクトを言うらしい。それでアダプタのオブジェクトと言ってもクラスは複数存在する。

  • ArrayAdapter
  • SimpleAdapter
  • SimpleCursorAdapter

これらは管理するリストデータがどんな種類であるかで使い分けるようだ。

Activity NameとLayout Nameについて

Androidでは処理をktファイルに、画面構成をxmlファイルに記述する。ktファイルとxmlファイルのペアでひとつの画面が作られていることになる。

レイアウトファイルの設定項目

文字列のセンタリングを行うときは以下を行うと良い。なおTextViewのみ確認できている。

    android:gravity="center"

Intentクラスの役割

Intentクラスなるものが存在している。現状ではIntentクラスはアクティビティの起動を行う役割を持つと分かった。

Intentクラスのコンストラクタ引数は2つある。

  1. packageContext: Context ex.applicationContext
  2. cls: Class ex.MainActivity::class.java

IntentインスタンスにはputExtra()メソッドがある。これはdjangoでいうrequestがintentインスタンスで、requestの各keyやvalueに当たるものをputExtra()が担当しているイメージ。

sample ...

val intent:Intent = Intent(applicationContext, SubActivity::class.java)
intent.putExtra("option", "ラーメン")

画面の起動はintentインスタンスを引数としてActivityクラスのstartActivity()メソッドを渡す。

startActivity(intent)

オプションメニューについて

オプションメニューを実装するにはレイアウトファイルにオプションメニューを記述するわけではなく、レイアウトファイルと独立したオプションメニューファイルを作成する。
そしてメニューファイルはlayoutフォルダに格納するのではなく、menuフォルダに格納する。
だからres/menu/hoge.xmlとなるし、レイアウトファイルはres/layout/foo.xmlと違うことに留意したい。

menuファイルの書き方はmenu開始タグとmenu終了タグを使用する。menuタグの間にitemタグを挿入する。

    
<menu>
<item
android:id=""
app:showAsAction=""
android:title=""

android:icon=""/>

<item
android:id=""
app:showAsAction=""
android:title=""

android:icon=""/>
</menu>

itemタグを使うには最低限3つの属性を定める必要がある。そしてオプションとしてandroid:iconがある。

Androidでデータベースを利用する

データベースヘルパークラスが必要になる。

SQLiteを使う場合

SQLiteOpenHelperを継承して使う。
https://developer.android.com/reference/kotlin/android/database/sqlite/SQLiteOpenHelper

Contextについて

Activity,ApplicationやServiceはContextのサブクラスである。

Contextの取得方法は、Activity内のthisやActivityやApplicationのgetApplicationContext、ViewやFragmentのgetContext。

KotlinとJavaの使い分けについて

ドキュメントを見る際にKotlinとJavaでも共通の部分もあるし、これはKotlinだけ、これはJavaだけのものという部分があってもやもやすると思う。これについてひとつ仮説がある。ViewやViewsetは共通した概念を用いる。その他マニフェストファイルやリソースのstringsも同じ知識を用いる。kotlinとjavaが異なるところは唯一Activityで記述するコーディングの部分で異なる。したがってViewを動的に(programaticaly)暑かったりする場合には、それぞれでメソッドの書き方が変わったり、アンドロイドを動かす仕組みロジックが変わってくる。結論としてActivityだけ書き方が変わる。