1.Kotlinの特徴について
Androidアプリ開発に適したプログラミング言語で次のような特徴がある。
- Javaと比較しコードの記述量が少ないのでスピーディな開発が可能
- Java仮想マシン上で動作するJVM言語であることから、Javaとの相互利用が可能
2.ソースコード比較
- セミコロンが不要かつ型推論があるので汎用性が高い
- ?を使ってnullを安全に処理できるためNullPointExceptionが回避しやすい(開発効率向上)
クラス定義
public class MainActivity extends AppCompatActivity {}
class MainActivity : AppCompatActivity()
変数宣言
String greeting = "Hello";
var greeting = "Hello"
定数宣言
final String = "Hello";
val greeting = "Hello"
null安全
String s = null;
val s: String? = null
関数定義
public void greet(String name) {...}
fun greet(name: String) {...}
配列
String[] arr = new String[3];
val arr = Array(3) {""}
for文①(範囲指定)
for (int i = 0; i < 5; i++) {
System.out.println(i + "回目の出力");
}
// forEach文
greetList.forEach((String greet) -> {
System.out.println(greet);
});
// 変数名 in 範囲)といった記述をする
for (i in 0..4) {
println("${i}回目の出力")
}
for文②(指定した数だけ加算)
for (int i = 0; i < 10; i+=3) {
System.out.println(i + "回目の出力");
}
for (i in 0..9 step 3) {
print("${i}回目の出力")
}
getter/setter
user.getName();
user.name
ラムダ式
list.forEach(new Consumer<String>() {...})
list.forEach { item -> ...}
Hello Worldの呼び出し比較
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
fun main() {
println("Hello World")
}
3.Jetpack Composeについて
Jetpack ComposeとはXMLベースUIの欠点を解消するために生まれたAndroid向け最新の宣言型UIツールキット。
フロントエンドビューを強制的に変更することなく、アプリのUIを再描画できるAPIを提供することでアプリのUI記述とメンテナンスが簡単になる。
①@Composableアノテーションをつけることで画面上の部品として機能させることが可能
⇒部品の使い回しが容易に可能となった
@Composable
fun Greeting(name: String) {
Text(text = "Hello, $name!")
}
従来であれば以下のように.xmlに以下のような内容を記載する必要があり冗長的になり易いかつ、ロジック関連とファイルが分かれるため管理がし辛かった
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
②状態によりUIが自動で更新される
従来の記述(ボタンがクリックされた挙動を受け取りcountを加算した後、テキストにcountを反映&出力)
TextView tv = findViewById(R.id.tv);
int count = 0;
button.setOnClickListener(v -> {
count++;
tv.setText("Count: " + count);
});
Jetpackを用いた実装(状態=countをComposeに監視させ、Composeが自動で再描画かつ最新のUIに更新)
@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("Count: $count")
}
}
番外編:状態管理の仕組みについて
remember
一時的な状態保持(画面回転でリセットされる)
アニメーションの進行状況、一時的なボタンのON/OFFなど
rememberSaveable
ユーザー入力やカウントなどUI状態(画面回転で維持される)
画面が回転したりプロセスが再起動しても状態を保持したいとき
State
状態の基本構造。rememberと併用が前提(画面回転でリセットされる)
値を監視してUI更新に使える「箱」
③レイアウトは①で作成した関数の組み合わせで作る
@Composable
fun MyScreen() {
Column (
verticalArrangement = Arrangement.Center
, horizontalAlignment = Alignment.CenterHorizontally
, modifier = Modifier.fillMaxSize()
) {
Greeting("Compose")
Button(onClick = { /* 処理 */ }) {
Text("ボタン")
}
}
}
4.dart(Flutter)との比較
Flutterの強み
- クロスプラットフォーム(iosアプリ、Androidアプリ)
- ホットリロードにより開発効率が良い
import 'package:flutter/material.dart';
class MyInputPage extends StatefulWidget {
@override
_MyInputPageState createState() => _MyInputPageState();
}
class _MyInputPageState extends State<MyInputPage> { // 関数定義
final TextEditingController _controller = TextEditingController(); // 状態管理
String message = "";
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: EdgeInsets.all(16),
child: Column(
children: [
TextField(
controller: _controller,
onChanged: (text) {
setState(() {
message = text;
});
},
),
SizedBox(height: 16),
ElevatedButton(
onPressed: () {
print("入力内容: $message");
},
child: Text("送信"),
)
],
),
),
);
}
}
@Composable
fun InputWithButton() {
var text by remember { mutableStateOf("") }
Column(modifier = Modifier.padding(16.dp)) {
TextField(
value = text,
onValueChange = { text = it },
label = { Text("入力してください") }
)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = {
println("入力内容: $text")
}) {
Text("送信")
}
}
}