우선 자바 소스

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_write_letter:
                obtainViewModel().sendLetter()
                return true;
            default: 
                return false;
        }
    }

아래는 코틀린

  override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
        R.id.menu_write_letter -> {
            obtainViewModel().sendLetter()
            true
        }
        else -> {
            false
        }
    }

코틀린의 메소드는 = 으로 바로 값을 리턴 시킬수 있다.

when은 switch랑 비슷한것 같은데 뭐가 차이가 날까 ~ 궁금해서 구글링 해서 찾아보니~

2가지가 있었다.

1.Auto-casting

2.when without arguments

1번 예를 한번 보면

when(view){
    is TextView -> toast(view.text)
    else -> 
}

is TextView 한다음에는 view가 TextView로 자동 캐스팅되어서 사용할 수 있다는 점이 편리하다.

2번 예를 한번 보면

val str = when{
    x in 1..5 -> "cheap"
    s.contains("money") -> "Welcome"
    else -> ""
}

when(argument) 를 사용하지 않고 when {} 으로 바로 사용.

꼭지점 두루뭉실한 사각형 만들기

drawable/파일명.xml 만들어 준다.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="@color/white"/>

    <stroke android:width="1dp"
        android:color="@color/gray"/>

    <padding android:bottom="10dp"
        android:left="10dp"
        android:right="10dp"
        android:top="10dp"/>

    <corners android:radius="7dp"/>
</shape>

solid 안에 컬러는 도형의 내부 색상

stroke 바깥 선 색상과 두께

padding 은 도형 안쪽 여백

corners radius 속성을 먹이면 사각형은 꼭지점 부분이 두루뭉실하게 변함 값이 높을수록 더 심해짐

메뉴 아이템을 res/menu 아래에 만들어 주면 된다. menu는 기본적으로 없어서 만들어 줘야함.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_answer_letter"
        android:title="@string/answer"
        app:showAsAction="always"/>
</menu>

Fragment 에서 우선 Override 할 메소드는 onCreateOptionMenu , opOptionsItemSelected 두가지 !!

Activity 에서는 onCreateOptionsMenu 메뉴가 불리지만 Fragment 에서는 setHasOptionsMenu(true) 셋팅을 해줘야 불리게 된다.

위치는 OnCreateView 안에 넣어주면 됨.

그럼 정상적으로 onCreateOptionsMenu 메뉴가 불리게 된다.

 override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater) {
        inflater.inflate(R.menu.menu_detail_letter, menu)
        super.onCreateOptionsMenu(menu, inflater)
    }

다음은 메뉴 아이템이 선택 되면 불리는 메소드

override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId){
       R.id.menu_answer_letter ->{
           locateListener?.openAnswer(letter)
           true
       }
        else ->{
            false
        }
}

확실히 자바 쓰다가 코틀린으로 쓰니까 간결하긴 하네 ㅎㅎ

무선으로 빌드 하는 방법

처음에는 usb 연결이 필요하다.

터미널에서 adb tcpip 5555 치면

restarting in TCP mode port : 5555

5555포트가 열린거임

adb connect 주소:5555 라고 치면

connected to 주소:5555 라고 나온다.

그럼 연결 성공

usb를 빼고

adb devices 로 연결된 디바이스를 확인할 수 있다.

딤처리 된 팝업을 추가 할 일이 생겨 아래의 구조로 작성함

DrawerLayout 사용하는 layout 에서의 구조


<DrawerLayout>
    <ConstraintLayout> 
        메인 뷰
    </ConstraintLayout>

    <NavigationView>  
    </NavigationView>

    <ConstraintLayout>  
        딤처리 팝업
    </ConstraintLayout>
</DrawerLayout>

이런식으로 구성 했다.

근데 딤처리 팝업 뜨고 나서만 NavigationView 에 있는 뷰들이 클릭을 먹지 않음…

딤처리 팝업을 확인 누르면 VISIBLE -> GONE 상태로 변경되서 상관이 없어야 할텐데 클릭이 되지 않는 문제..

처음에는 문제 초점을 딤처리 팝업에서의 setClickable 에 뒀다.

하지만 효과가 없고 구글링해서 찾아보니 DrawerLayout안에 NavigationView의 위치는 맨 마지막으로 와야한다고 나와있었다.


<DrawerLayout>
    <ConstraintLayout>  
        메인 뷰
    </ConstraintLayout>

    <ConstraintLayout>  
        딤처리 팝업
    </ConstraintLayout>

    <NavigationView>  
    </NavigationView>

</DrawerLayout>

그렇게 처리하니 이슈가 사라짐!!

기억하자 NavigationView의 위치는 맨 마지막에 와야함!!