안드로이드 앱 공부(2)(배열,안드로이드 앱의 생명주기,Intent)

김준영·2020년 7월 14일
0

  • Var 변수는 값이 변할 수 잇는 변수인데
    lateinit var mContext: String
    이처럼 나중에 초기화 하겠다는 lateinit 을 앞에 붙여서 최상단에 변수선언을 할 수 있고 혹은
    나중에 배울 null 초기화를 이용하여 초기화를 할 수 있다.
    var mContext : String?=null

Null 값 < 중요>

.?연산자는 앞의 변수가 Null 이 아닐때만 수행되고 null이면 null 을 반환함

  • Null값을 포함하는 변수는 nullable 유형이어야 함.
    fun Calculator(a:Int , b:Int ):Int { return a+b }

    여기서 a 혹은 b 에 null이 들어오면 NullPointException이 발생함.
fun Calculator(a: Int? ,b : Int?) :Int? {
        var result :Int?=null

        if(a!=null &&b!=null) {
            result = a+b
            return result
        }else {

        }
        return result
    }
  • type 에 ? 를 붙임으로써 null이 가능한 변수임을 명시적으로 표현함.

Ex) 데이터를 다룰 시 객체를 만들어서 객체안의 변수에 데이터를 대입하는데 .

class sampledata(
    val title:String,
    val description: String
)

처음에는 문제가 없지만. 만약 데이터 양이 늘어날시 .

class sampledata(
    val title:String,
    val description: String,
    val image : String,
    val name : String,
    val nickname : String? = null,
    val email : String?=null,
    val password : String?=null
)

초기화 해주는 것. 객체를 만들 때 쓰고 싶은 인자가 있고 안쓰고 싶은 인자가 있기 때문에 이런식으로 구현을 한다.

Elvis Operator

fun getdata(data:String?) {
        val mydata = data ?:"ㅎㅎ"
    }

코드를 작성하다보면 null 인경우 default 값을 주고 싶은 경우가 있음. 이럴때 Elvis연산자를 쓰면 된다

강제 NotNull 처리

fun Calculator(a: Int? ,b : Int?) :Int {
        var result :Int?=null
      

        if(a!=null &&b!=null) {
            result = a+b
            return result
        }else {
            //그 외 에 해당하는 로직 처리
        }
        return result!!
    }

!!을 쓰면 그 변수는 무조건 Null이 아니라는 것을 명시해줌
잘 쓰지 말라고 하는데 나는 많이 썻음.

When For While

fun fizzBuzz(i: Int) = when {
        i % 15 == 0 -> "FizzBuzz "
        i % 3 == 0 -> "Fizz "
        i % 5 == 0 -> "Buzz "
        else -> ""+i
    }
for ( i in 0 until 10) {

}
//ArrayList String 타입으로 생성한다
        var list = ArrayList<String>()
//다른 초기화 방법
        lateinit var list2 :ArrayList<String>
        list.add(":a")
        list2.add("a")

예시 1 ArrayList 는 리스트 , 즉 데이터를 다루는 부분이기 때문에
사용자가 데이터를 입력하면 그 데이터를 내가 설정한 클래스로 넣는다.

class mydata(
    val title : String?=null,
    val description : String ?=null
)

여기선 for 문을 통해 데이터를 임시로 만들어줌. 앱 을 만들때 이 부분에서 데이터베이스랑 연동한다.

  var mylist = ArrayList<mydata>()

  for( i in 0 until 10 ) {
       val sample = mydata(title=""+i,description = ""+i)
       mylist.add(sample)
   }

  • View 함수를 가져오는 법
    1.val textview :TextView = findviewById(R.id.~~)
val btnlogin :Button = findViewById(R.id.btn_login)
      btnlogin.setOnClickListener {
          sample2()
       }
  1. id 이름 import
btn_login.setOnClickListener {
            sample2()
 }
  • 자주 쓰는 메소드
  1. setText
    2.setonClickListener

StartActivity()
1.화면 이동

btnlogin.setOnClickListener {
          startActivity(Intent(this,sample3::class.java))
          //val intent = Intent(this,sample::class.java))
         // startActivity(intent)
 }
  1. 데이터 전달
btn_login.setOnClickListener {
            sample2()
 }
fun sample2(){
        val intent = Intent(this,sample3::class.java)
        intent.putExtra("sample2","뭘봐")
        startActivity(intent)
 }

데이터를 보냈으니 받는 곳이 있어야 겟지 ?

class sample3 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample3)
        //intent 로 받은 데이터를 getStringExtra 로 받아줌
        //그리고 setText를 통해 text를 바꿔줌
        val getintent = intent.getStringExtra("aa")
        text_sample3.setText(getintent)
        
        //여기는 startactivityforREsult 예제
        val exintent = Intent()
        exintent.putExtra("result","hi")
        setResult(Activity.RESULT_OK,exintent)
        finish()
    }

}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".sample3">

    <TextView
        android:id="@+id/text_sample3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="aaaa"
        android:textSize="36dp" />

</LinearLayout>

StartActivityforResult()

fun sample2_1() {
        val intent = Intent(this,sample3::class.java)
        //아까와 달리 인자값으로 intent 뿐만 아니라 하나가 더 넘어감
        //이 상수는 나중에 sample3로 부터 결과값은 받아온 후  어떤 요청에 따른 결과인지를 구분하기 위한
       //requestCode임
        startActivityForResult(intent,200)
}
//결과값 받는 부분
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode==200) {
            if(resultCode== Activity.RESULT_OK){
                //여기서 내가 하고싶은 작업을 하면됨.
            }
        }
    }

startActivity() 는 단순히 어떠한 액티비티를 시작하기 위한 용도로 사용된다면,
startActivityforResult() 는 시작한 액티비티를 통해 결과값을 받기 위해 사용되는 것 .
그래서 왜 쓰는데 ?
레이아웃을 짜면서 그 레이아웃은 한 화면이라는 걸 알게 됬고 하나의 앱은 무수히 많은 Activity 로 이루어 져 있다는 걸 느낌
특정 기능 UX/UI 흐름에 따라 여러가지 Activity를 구성해두었을때 , 각 기능에 맞는 Activity를 호출한다거나 할때 사용되는 것이 startactivity() ,startActivityforResult()

숙제 = startActivityforResult 공부해오기

0개의 댓글