ujum 2022. 7. 6. 12:00
728x90

~1:03:45

notion에서 갖고오니까 이미지도 깨지고 글도 깨지고 여러모로 불편하네염 일단 오키

붙여놓는다 나중에 수정 해야함

1. Android studio 설치

2. 파일 구성

📁res & java


xml

  • png파일이랑 다르게 vector로 구성
  • 아무리 확대해도 이미지 깨짐 없음

value

  • colors.xml
    • <color name =””>#FFF</color>
    • hexa 코드 : color #RGB
  • strings.xm
    • AndroidManifest.xml 에서 android:label = “@string/app_name”
    • string 참조

layout

  • 화면 구성
  • LinearLayout
    • android:orentation= “vertical” 수직 정렬(화면에서 격자 눌러도 됨)
    • android:weigthSum 가중치
  • <Button /> , <Button> </Button>
    • layout_width, high
      • “match_parent” 부모에 맞춰서
      • “wrap_content” 글자 크기 주변으로
      • dp, dpi, pixeldpi별 1dp해당하는 px 다름: 모든 해상도에 대응되기 위해서 사용, 휴대폰 종류에 상관없이 크기 변화pixel: px = dp * 단말 DPI / 기본 160
      • dp 사용 !
      • : dpi에 들어갔을 때 변화 생김
      • : dp = px * 기본 160(MDPI의 단위) / 단말 DPI
      • dp
    • layout_weightwidth = “0dp” 해야 가중치 제대로 적용 가능10 등분
    • width = “wrap_content” 등등 설정에 따라 모양 달라짐
    • android:layout_weight = “3”
    • text휴대폰 환경 설정에서 크기 조절하면 반영
    • textSize sp 글자 크기 반영(dp로 하면 반영 X)
    • onClick
      • [activity_sub.xml] Button click시 반응
      • android:onClick = “Btn1Click”
      • [SubActivity.java] activity_sub를 호출한 SubActivity에 함수 정의context 현재 띄워진 화면
      • 👀 Bug 뜨면 Logcat view v → alt+Enter → import class
      • public void Btn1Click(View v){ Toast.makeTest(context:this, resld:"ㅋㅋ", Toast.LENGTH_SHORT).show(); }
      • Toast message 를 원하는 곳에gravity 사용, Offset 얼마나 떨어져 있는가
      • public void Btn1Click(View v){ Toast toast = (context:this, resld:"ㅋㅋ", Toast.LENGTH_SHORT); toast.setGravitiy(gravity:Gravity.END | Gravity.BOTTOM, xOffset: 10, yOffset:10); toast.show(); }
    • findViewById
      • [activity_sub.xml] id 설정
      <Button
      	/*생략*/
      	android:id="@+id/Btn2"
      	/>
      
      • [SubActivity.java]
      View v = findViewById(R.id.Btn2); //int형식의 R.id.Btn2 받아오기
      Button Btn2 = findViewById(R.id.Btn2) //Button이 view의 상위 개념
      Btn2.setOnClickListener(new Vew.OnClickListener(){
      	@Override
      	public void onClick(View view){
      		Log.d(tag:"태그",msg:"값"); //빨간 줄 뜨면 Alt+Enter ->  import class
      	}
      });
      
      👀 Settings/LiveTemplates에서 logd 단축 함수? 사용 가능
    • Define → Java, Kotlin
    • startActivity
      • [activity_sub.xml] id 설정
      <Button
      /*생략*/
      android:id="@+id/Btn3"
      />
      
      • [SubActivity.java]
      findViewById(R.id.Btn3) setOnClickListener(new Vew.OnClickListener(){
      	@Override
      	public void onClick(View view){
      		startAcitivity(new Intent(packageContext:SubActivity.this, MainActivity.class));
      	}
      });
      
      1️⃣ startActivity : acitivity 로 실행하라Intent : 화면 넘겨줄 때 data 넘기기도 가능~[MainAcitivity.java] intent 값 받기[activity_main.xml] 받은 intent값을 화면에 표시하기[MainAcitivity.java] intent 값 받기3️⃣ MainActivity.java의 MainActivity class호출 → setContentView(R.layout.activity_main);👀 버그 발생 - LogCat : Manifest에 <activity android:name=”MainAcitivity”/> : 나도 있다~
    • ⇒ 화면 뜸
    • /*Log.d(tag:"로그",str);대신*/ EditText editText = findViewById(R.id.edit_text); editText.setText(str); //((EditText)findViewByID(R.id.edit_text)).setText(str));
    • <EditText android:id="@+id/edit_text" //참조하기 위한 id 설정 android:layout_width="wrap_context" android:layout_height="wrap_context" />
    • /*Oncreate class안*/ Intent intent = getIntent(); String str = intent.getExtras().getString(key:"키"); Log.d(tag:"로그", str);
    • Intent intent = new Intent(packageContext:SubActivity.this, MainActivity.class); //sub-> main class Intent.putExtra(name:"키", value:"위"); //값 전달 startActivity(intent);
    • 2️⃣ Intent 로 받아 가지고, 지금 있는 subactivity에서 MainAcitivity class를 호출
  • android: layout이나 hint등등 적용
  • EditText : 뭔가 적을 수 있는 박스

@ 참조

  • color, string 등 참조

📁manifest


AndroidManifest.xml

: 환경 설정, 무조건 소문자, 철자도 틀리면 안됨

  • 형식xmlns xml name space, 고유의 id(사이트) 정해줌⇒ AndroidManifest 를 통해 📁app 의 모든 것 제어allowBackup app이 파괴되었을 때 다시 백업을 허용하는가supportsRtl Right to left, 오른쪽에서 왼쪽 형식으로 layout지정(아이콘 앞, 글자 뒤)
    • “.MainActivity” class MainActivity 실행 (extends AppCompatActivity)
    • AppCompatAcitivity - Ctrl+O 함수 재구성 가능
    • <intent-filter 달려 있는 activity가 제일 먼저 실행됨
    • Android Life Cycle
    • CPU의 효율적인 사용을 위한 app 사용, 중지 cycle
    • 자세한 설명: Android studio 활동 수명 주기에 관한 이해
    • super. 부모 클래스 그대로 상속
  • <activity
  • icon res @mipmap 에서 갖고 오기
  • <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Test28" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
  • package 고유한 것, 겹치면 안되고 전부 소문자

3. Kotlin (vs. Java)

Basic syntax


📎 Kotlin syntax Kotlin이 사기인 이유 😮

java 함수 갖고 와도 Kotlin으로 변형 가능 😮

class MainAcitivity : AppCompatActivity(){
	/* @override 안하고 overrid 함수명 & 반환 형식 필요 없음 */
	override fun onCreate(savedInstanceState:Bundle?){ //변수명:형식?
		super.onCreate(savedInstanceState) //;필요없다~
		setContentView(R.layout.activity_main)

		/*화면 출력*/
		println("안녕 바보야") //log이런거 안해도 된다~

		/*함수 호출*/
		sum(a:1, b:2)
	}
}

?

null이 들어갈 수 있음

함수 선언 & 여러가지 함수 활용

💡 Kotlin 사기

/*fun으로 함수 선언*/
fun sum(a: Int, b:Int): Int{ //(변수명:형식), 반환 값이 있을 경우 : 반환 형식
	return a+b
}
  • a, b 형이 달라도 알아서 계산해줌
    fun sum(a:Int, b:Int) = a + b
    
  • ex) (a:Int, b:Float), Float형으로 반환
  • 함수 반환 값 없는 경우
  • fun sum(a:Int, b:Int) : Unit{ //:Unit 생략 가능 println(sum(a:1, b:2) }
  • $ 사용 : 변수 값 가져오기
  • maxOf 함수
  • fun maxOf(a:Int, b: Int) : Int{ if(a>b) return a else return b } // == fun maxOf(a: Int, b: Int) = if(a>b) a else b
  • parsInt 함수
  • /* "1"-> 1, string형식을 int로 변환해주는 함수 */ fun parseInt(str: String): Int? { var myNum : Int? = null /* 예외처리 구문 "문자문자" 같은 경우*/ try{ my Numb = str.toInt() } catch (nfe : NumberFormatException) {return null} return myNumb }
  • Any
  • fun getStringLength(obj: Any): Int? { //어떤 값이든 들어와도 됨 = 모든 형식의 부모 if(obj is String && obj.length>0) return obj.length return null //Int? 한 이유 }
  • listOf, for, while
  • val items : List<String> = listOF("apple", "banana", "kiwifruit") //: List<String> 생략 가능, list에 int형도 가능 /* for 문 */ for (item in items){ println(item) } /* index 참조하고 싶을 때 */ for (index in items.indices){ println(index) println("인덱스: $index, 값 : ${items[index]} "} //""안에서 값 받아올 때 $ } /* while 문 : 크기 제한 유무 상관 없음(무한 루프 조심) */ var index=0 while(index<items.size){ println("item at $index is ${items[index]}") index++ }
  • when
  • fun describe(obj: Any): String = when(obj) { 1 -> "One" "Hello" -> "Greeting" is Long -> "Long" !is String -> "Not a String" else -> "Unknown" //한 번 검사해서 해당하면 그 다음 거는 의미 없어짐 }
  • 범위
    val x= 10
    val y = 9
    if( x in 1..y+1) {
    	println("범위 안")
    }
    /* if( x>=1 && x<=y+1){
    	println("범위 안")
    } */
    
    val list = listOf("a", "b", "c")
    
    if(-1 !in 0..list.lastIndex){
    	println("-1은 범위 안에 없다")
    }
    if(list.size !in list.indices){ //list.indices 는 list 형식
    	println("리스트 인덱스 넘어갔다")
    }
    
    2️⃣ for 문 in, step3️⃣ when4️⃣ link 통한 list 정렬it : list
  • val fruits = listOf("banana", "avocado", "apple", "kiwifruit") fruits .filter { it.startsWith(prefix: "a") } //"a"로 시작하는 거 고르기 .sortedBy { it } //남은 거 정렬 .map { it.toUpperCase() } //대문자로 변경 .forEach { println(it) } //각각 하나씩 print
  • val items = setOf("apple", "banana", "kiwifruit") //listOf 대신 setOf 가능 when{ "orange" in items -> println("juicy") "apple" in items -> println("apple is fine too") }
  • /* for 문 내 범위*/ for(x in1..5){ println(x) } /* step */ for ( x in 1..10 step 2) { //x+2 한다는 듯. println(x) } println("띄고") for ( x in 9 downTo 0 step 3){ //0일 때 까지 9부터 x-3, downTo 대신 .. 쓰면 안됨 println(x) }
  • 1️⃣ if 문 in

변수 선언

val var

선언 후 변경 못함 선언 후 변경 가능
메모리 측면 성능 😀  
전역 변수 선언 시 초기화 필수 전역 변수 선언 시 초기화 필수
초기화 후 변수 형식 생략 가능 초기화 후 변수 형식 생략 가능

val 활용

val str = "코로나 조심" //문자열 적어줘서 :String 생략 가능
val str2 = str.replace(oldValue:"조심", newValue:"바보") + "!!"
//+로 문자열 연결 가능

주석 // , /* */

Ctrl+/ → 그 부분 //주석 처리 가능

Ctrl+Shift+/ → 그 부분 /* */ 주석 처리 가능

 

    •