0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kotlinについて

Posted at

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("送信")
        }
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?