728x90

액션바 오른쪽위 메뉴인 옵션메뉴 뷰를 사용해보자.

onCreateOptionsMenu()메서드를 오버라이드 하여 옵션메뉴를 생성한다.

 

옵션메뉴 안에있는 메뉴를 클릭했을때 발생하는 이벤트처리는 

onOptionsItemSelected() 메서드를 오버라이드하여 처리한다. 

 

옵션메뉴를 생성하는 방법에는 두가지가있다. 

1. 메뉴xml을 이용해서 만드는방법과

2. kt파일에서 하드코딩하여 옵션을 만드는 방법이 있다.

 

1. menu1레이아웃을 먼저 만든다.

 

 

 

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    >
    
    <item
        android:id = "@+id/itemRed"
        android:title=" 배경색 (빨강)"
        tools:ignore="MissingConstraints">
    </item>



    <item
        android:id = "@+id/itemGreen"
        android:title=" 배경색 (초록)"
        tools:ignore="MissingConstraints">
    </item>


    <item
        android:id = "@+id/itemBlue"
        android:title=" 배경색 (파랑)"
        tools:ignore="MissingConstraints">
    </item>

    <item android:title="버튼변경 >> ">
        <menu>
            <item
                android:id="@+id/subRotate"
                android:title="버튼 45도 회전"/>
            <item
                android:id="@+id/subSize"
                android:title="버튼 2배 확대">
            </item>
        </menu>
    </item>
</menu>

 

파일명은 menu1.xml파일이다 

 

코드를 설명하면 menu1.xml파일은 3개의 아이템이 각각 존재하며

버튼변경>> 이라는 하나의 아이템속 메뉴안에 두개의 아이템이 존재한다.

item을 선언할때 꼭 id값과 title값을 까먹지말고 정의해야 한다.

 

 

이제 메인엑티비티.kt파일에서 오버라이드하여 메뉴를 활성시켜야된다.

 

 

 

 

 override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        super.onCreateOptionsMenu(menu)
        var mInflater = menuInflater
        mInflater.inflate(R.layout.menu1, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.itemRed ->{
                baselayout.setBackgroundColor(Color.RED)
                return true
            }
            R.id.itemBlue ->{
                baselayout.setBackgroundColor(Color.BLUE)
                return true
            }
            R.id.itemGreen ->{
                baselayout.setBackgroundColor(Color.GREEN)
                return true
            }
            R.id.subRotate ->{
                //돌리기
                button1.rotation = 45f
                return true

            }
            R.id.subSize -> {
                //확대


                button1.scaleX = 2f
                return true
            }
        }

        return super.onOptionsItemSelected(item)
    }

}

 

 

 

2. 하드코딩을 통한 옵션메뉴 만들기

 

옵션메뉴 만들기

override fun onCreateOptionsMenu(menu: Menu?): Boolean {

         menu!!.add(0, 1, 0, "배경색 (빨강)")
         menu!!.add(0, 2, 0, "배경색 (초록)")
         menu!!.add(0, 3, 0, "배경색 (파랑)")
         menu!!.add(0, 3, 0, "버튼 확대")
         menu!!.add(0, 3, 0, "버튼 돌리기")
         return super.onCreateOptionsMenu(menu)
     }

 

옵션메뉴 클릭이벤트 처리 

 

 

 

override fun onOptionsItemSelected(item: MenuItem): Boolean {
         when (item.itemId) {
             1 -> {
                 baselayout.setBackgroundColor(Color.RED)
                 return true
             }
             2 -> {
                 baselayout.setBackgroundColor(Color.BLUE)
                 return true
             }
             3 -> {
                 baselayout.setBackgroundColor(Color.GREEN)
                 return true
             }
             4->{
                //버튼확대
             }
             5->{
                 //버튼돌리기기
             }

         }
     return true
     }
728x90
728x90

코틀린 기본 문법정리

2강에서 build.gradle 앱수준에서

plugins부분에 id 'kotlin-android-extensions' 을 추가하였다

목차 

 

1. 자료형,변수,값 선언

2. 리스트

3. 흐름제어(when , for)

4. 함수정의

5. 클래스,함수 정의

6. 상속

7. 람다식

 

코틀린은 값의 변경여부를 중요하게 생각합니다.

그래서 항상 변수를 선언할때 이변수가 변경가능한 변수인지, 변경이 불가능한 변수인지 키워드를 통해 정의합니다.

 

val : 변경 불가능한 값

var : 변경 가능한 값 

 

fun main(){
    var a:Int = 10
    val b:Int = 20
    a = 20
    b = 40 // b는 val(변경불가능한상수)로 정의했기때문에 값을변경할수없음 오류
}

 

Nullable

 

코틀린은 변경가능한 변수인지도 중요하게 여기지만, 해당 변수가 null값이 들어갈수 있는지 아닌지 또한 중요하게 여기고있습니다. 

 

 

 

<코드설명>

9: c는 변경이 가능한 Int형변수로 3으로 초기화해줌

10: c에 null값을 넣었지만 c는 null값이 들어갈수없는 변수이므로 에러

11. d는 변경이 가능한 Int형변수로 4로 초기화해주며 null값이 들어갈수있음

12. d에 null값을 넣어줌

 

 

LIST

 

코틀린에서의 리스트는 크게 두가지로 나눌수있습니다

1. List<>와 

2. MutableList<>

 

List의 경우 값을 변경 삭제  추가가 되지않습니다.

반면 MutableList의 경우 배열의 요소를 변경, 추가 , 삭제가 가능합니다.

 

 

흐름제어(반복문 for , when)

 

for

 

 

when

 

자바에서의 switch문과 비슷하지만 아주 조금 다르다

default대신 else를 사용하며 , ->를 사용하며 in 6..15등을 사용한다(6~15)

 

 

문자열 템플릿

  • + : 문자열 붙이기
  • ``$변수명,${변수명}` : 문자열 중간에 변수가 들어가야 할 경우

val str1 = "안녕" val str2 = "하세요" println(str1+str2) // 안녕하세요

 

 

배열

  • arrayOf()
  • 배열의 생성과 초기화를 함께 수행 / 컴파일러가 자료형을 유추할 수 있을 때는 이를 생략!
  • 배열의 요소에 접근하려면 [] 대괄호에 인덱스적으면 됨

배열,리스트 선언시 <>안에 특정 자료형을 넣어서 정의했을경우 그배열은 그 자료형값만 들어갈수있음

 

함수정의

 

코틀린에서는 함수를 정의할때 fun 키워드를 사용합니다.

 

728x90
728x90

 

1. 패키지 정의 가져오기 

 

주의) 패키지는 소스코드의 맨위에 있어야함

다른 언어들과 패키지정의나 다른라이브러리를 참조하는 import가 같음

 

package com.dowellcomputer.myapplication0316
import kotlin.text.*

 

2. 기본 출력함수

 

package com.dowellcomputer.myapplication0316

fun main(){
    println("안녕하세요")
}

 

코틀린의 메인함수는 fun main(){ } 형태를 지니고있으며

println함수는 출력을하고 줄바꿈을 해줌

 

3. 함수이용

 

package com.dowellcomputer.myapplication0316

fun main(args : Array<String>){
    println(sum(5,4))
    println(sub(5,4))
}

fun sum(a: Int , b: Int): Int {
    return (a+b)
}

fun sub(a : Int , b: Int) = a-b

 

sum함수는 Int(정수)형을 반환하는 함수이며

메인함수에서 println(sum(5,4))부분에서 5와4를 넘겨줬으므로 반환값 5,4의 합 9가 출력이됩니다

sub함수처럼 간단하게 표현할수도있습니다 .

 

4. 변수선언

 

fun main(args : Array<String>){
    
    var age : Int  = 5
    var a  = 6
    val name: String = "jinsol"
    val id = "201921263"
}

 

재정의가 가능한 변수를 var

재정의가 불가능한 변수를 val 

 

변수명뒤에 : 타입 이 오게됩니다

( var or val ) 변수명 : 타입명 

하지만 파이썬과 마찬가지로 타입명을 생략하고 바로 값을넣어줄수도있습니다

var a = 6 부분은 a는 정수형타입이 될것이며

vall id 는 String(문자열) 타입이 될것입니다

 

5. 클래스와 객체

 

class HelloCLass{
    var age:Int = 0
    
init{
    println("hi2")
}

    constructor() //값을 넘기지는 못하지만 초기화 가능
    constructor(age:Int)  { // constructor(age:Int ) // 보조생성자 값을 넘기면서 초기화가능 set
        this.age = age
    }

   
}

클래스 선언은 class 클래스명 {   } 을통해 선언합니다

클래스안에 init는 클래스가 호출됐을떄 최초로 초기화되는 부분이며

constructor() 과 constructor(age:Int)가 두개가 존재하는 이유는 매우 중요합니다.

 

만약 메인함수에서 


1번 ) var cls = HelloCLass()
2번 ) var cls2 = HelloCLass(1)

이런식으로 호출했을때

1번은 init이 된후에 age 에 0이 담기게 됩니다. 여기서 중요한점은

constructor()이 없을경우 빌드에러가 납니다

2번은 1번과마찬가지로 constructor(age:Int) { this.age = age ) 코드가 없을경우 빌드에러가 납니다.

 

메인함수에서 사용법은 아래와 같은방식으로 사용됩니다.

fun main(){
    var cls = HelloCLass(1)
    println(cls.age)
}

 

 

class Rectangle(var height: Double, var length: Double) {
    var perimeter = (height + length) * 2
}

val rectangle = Rectangle(5.0, 2.0)
println("The perimeter is ${rectangle.perimeter}")

 

이런식으로 간단하게 표현할수도있습니다.

 

open class Shape

class Rectangle(var height: Double, var length: Double): Shape {
    var perimeter = (height + length) * 2
}

 

클래스 간의 상속은 콜론 ( :)으로 선언됩니다 . . 클래스를 상속 가능하게 만들려면 open.을 키워드로 붙여줍니다.

 

6.문자열 문제


    var a = 1
    val s1 = "a is $a"
    println(s1)
    a = 2
    println(s1)
    val s23 = "${s1.replace("is", "was")}, but now is $a"
    println(s23)

 

해당코드의 실행결과는?

 

실행결과 : a is 1
	  a is 1
  	  a was 1, but now is 2

 

7. 조건문과 반복문

 

fun maxof(a:Int , b:Int){
    if (a > b) {
        return a
    } else {
        return b
    }
}

 

fun maxOf(a: Int, b: Int) = if (a > b) a else b

kotlin에서 if 조건문은 자바와 같으므로 생략하겠습니다.

 

 

val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
    println(item)
}

listOf는 재정의가 불가능한 list입니다.

mutableListOf()은 재정의가 가능한 list입니다.

해당 for루프에서 출력결과는 items리스트의 각각 요소들이 출력될것입니다.

 

for(i in 1..10 step 2)
            Log.d("test","반복문 i = ${i}입니다")
for(i in 10 downTo  1 step 2 )
            Log.d("test","-반복문  i = ${i}입니다")

 

val items = listOf("apple", "banana", "kiwifruit")
var index = 0
while (index < items.size) {
    println("item at $index is ${items[index]}")
    index++
}

 

var i : Int


    for(i in 1 .. 10) println("counting : {$i}")

 

※ kotlin에서 null값

 

var a : Int = null은 틀린 문법입니다

변수에 null값을 넣으려면 타입명뒤에 ?를 붙이고 null값을 넣어줘야됩니다.

    var nu : Int? = 10
    var nul : Int? = null

    println("nu : $nu   nul : $nul")
728x90

+ Recent posts