Introduction to Kotlin (Google I/O '17)

안녕하세요 저희를 응원하지 마시고 다음 발표자를 응원해 주세요 전 호만 기이고 Android 플랫폼 팀을 대표합니다 이분은 토르 노비이고 도구 팀을 대표하죠 저희 때문에 여기 오신 건 아니죠 특별한 발표자 분들을 위해 오셨죠 그렇죠, 로맨과 저는 코틀린의 공식 발표에 대해 정말 기뻐하고 있습니다 아직 모르시는 분들을 위해 저희 둘 다 코틀린을 정말 좋아합니다 그럼 발표자분의 시간을 더는 뺏지 않겠습니다 그럼 지체 없이 시작하시죠 안녕하세요 좋습니다 얼마 전 이런 생각이 들었습니다 제가 처음으로 코틀린에 대해 발표한 건 45년 전이었다는 거죠 900명이 올 수 있는 방에 7명이 왔었죠 오늘 더 많은 분들이 찾아주신 걸 보니 좋습니다 감사합니다 어쨌든 전 대략 30분이 있죠 사실 그보다 짧습니다 코틀린에 대한 정신없는 투어를 드리기 위해 28분이 있으니 언어 전체를 다루진 않겠습니다 최대한 많이 보여드리려고 노력할 것이고 사용법과 혜택을 받을 수 있는 곳에 대해 설명하겠습니다 모두 라이브 코딩으로 해보려고 합니다 뭔가 잘못될 경우 Google 비디오가 있습니다 유튜브 비디오도 어딘가 있을 테니 그걸 보시면 됩니다 그럼 여러분이 이미 본 적 있는 아주 간단한 것으로 시작하죠 데이터 클래스입니다 전 메인이라는 파일에 있습니다 전 머니라는 새로운 타입을 만들어 보겠습니다 amount라고 쓰고 이는 Int이죠 압니다, 지금은 아무 것도 없죠 그리고 이는 통화 유형의 문자열을 가질 겁니다 됐죠? 이는 모두 속성이고 속성만 읽게 될 겁니다 이는 여러분이 이미 친숙하신 거죠 기본적으로 데이터 클래스입니다 제가 미리 만든 자바와 비교해 보도록 하죠 수직으로 나누겠습니다 자바 머니를 불러오죠 이쪽으로 내려 갑시다 자바 머니, 됐죠 제가 방금 쓴 것과 동등한 것이죠 자바빈은 기본적으로 게터를 2개 제공하는 데이터 클래스이죠 변경할 수 없고 읽기 전용입니다 여기 데이터 모디파이어가 하는 일은 여러 가지를 제공해 줍니다 toString도 주고 clone도 줍니다 코틀린에서는 이를 copy라 부르고 equals도 하죠 hashCode를 합니다 그럼 괜찮다고 하시겠죠 그런데 이게 왜 필요할까요? 좋은 IDE라면 저를 위해 이걸 만들어 줄 테니 말이죠 그렇죠, 맞는 말입니다 그러나 문제는 그건 유지해야 할 코드라는 거죠 새로운 속성을 추가할 때마다 다시 돌아가서 그 코드를 바꿔야 할 겁니다 또 다른 문제는 그 코드가 여러분을 위해 IDE가 만든 표준 코드인지 아님 여러분이 조금 수정한 것인지 모른다는 점이죠 그렇죠? 따라서 단순히 첫 라인에 적어 넣는 걸 하지 않아도 된다는 의미가 아닙니다 좋습니다 이제 가서 메인 기능을 만들겠습니다 이건 닫겠습니다 이건 코틀린의 상단 입력부입니다 클래스에 퍼블릭 스태틱 보이드 메인이 있죠 코틀린에는 그게 필요 없습니다 코틀린에서는 모든 것을 톱 수준에 적으면 됩니다 좋은 식으로 하는 일종의 자바스크립트 같죠 하실 필요 없죠 다시 말씀드리자면 제가 오늘 보여드릴 모든 기능과 모든 것을 이 파일에 톱 수준으로 그냥 첨부할 거지만 그렇다고 다른 멤버 기능이 없다는 의미는 아닙니다 어떠한 클래스나 심지어 데이터 클래스도 멤버 기능을 가질 수 있습니다 간결성을 위해 그리고 여러분께 보여드리려는 목적으로 전 그냥 톱 수준에 넣겠습니다, 아셨죠? 그럼 머니에 대한 새 인스턴스를 만들겠습니다 예컨대 티켓이라고 부르겠습니다 머니는 100이라고 쓰고 달러로 쓰겠죠 외현 타입에 들어가겠지만 여기서는 타입 추론을 하겠습니다 코틀린은 굉장히 강력한 타입 추론이고 추론할 수 있는 만큼 여러분을 위해 할 겁니다 따라서 타입을 외현적으로 말해 줄 필요 없는 거죠 그러고 나서 예컨대 팝콘이라고 하고 티켓, 카피라고 하죠 이게 하는 일은 기본적으로 이전 것과 모든 속성을 복사해주는 것입니다 파라미터를 넘기지 않으면 이전과 같은 값을 가져가는 거죠 그럼 새 파라미터를 넘겨 보죠 예컨대 스페인에서는 팝콘이 영화관에 입장하는 것보다 7배 더 비싸니 그건 500유로 정도 되겠죠 그렇죠? 이제 예컨대 이런 걸 할 수 있죠 티켓이 팝콘과 같지 않다면 printIn "이들은 다릅니다!"하는 거죠 이것이 하는 일은 속성 비교를 하나씩 하는 겁니다 포인트 비교를 하진 않습니다 포인트 비교를 위해선 3가지 등식이 있어야죠 자바스크립트와는 다르게 기억해야 할 600개의 다른 위치 차트가 없습니다 참고로 이건 폰트 합자로 혼동하지 마시기 바랍니다 새로운 문자를 소개한 건 아닙니다 좋습니다 그럼 이제 가서 이를 실행하면 "이들은 다릅니다!"를 보게 되죠 그리고 이걸 100으로 바꾸고 달러로 넣어서 실행하면 아무 말도 하지 않겠죠 같은 값이니까 말이죠 그렇죠? 저희가 계속 신장시켜 온 기능 중 하나는 자바와 코틀린 사이의 인터롭이죠 이 자바 머니가 여기 있죠 가서 인스턴트를 만들어 보겠습니다 자바머니는 JavaMoney와 같다고 하고 이는 100이겠죠 달러일 테죠 javaMoney를 하면 보시다시피 게터가 없죠 게터가 하나 있긴 하죠 제가 금액을 얻을 수 있도록 말이죠 하지만 getAmount라고 하고 완성하면 IDE가 이미 속성으로 대치할 겁니다 저희는 게터나 세터같은 게 없고 속성만 있을 뿐이기 때문이죠 따라서 이는 코틀린에서 자바로 소비되는 거죠 여기 자바로 가서 퍼블릭 스태틱 보이드 메인을 만들어 보죠 그런 후 봅시다

타입을 디클레어 해야죠 머니는 새 머니와 같고 100와 달러이다 됐죠 다른 점 하나는 코틀린에서 세미콜론이 선택적이라는 거죠 선택적인 이유는 이걸 써야 하는지 말아야 하는지에 관한 끝없는 논쟁을 위한 거죠 자바스크립트와 경쟁하려는 겁니다 moneygetAmount라고 하면 이제 전 자바에서 코틀린 타입을 쓰고 있으니 게터와 세터가 생기는 거죠 따라서 여러분이 어떻게 사용하는가에 따라 관용구가 되겠죠 이는 다른 자바 파일과 다른 코틀린 파일이 하나의 프로젝트에서 아무 문제 없이 매끄럽게 작동하는 거죠 그럼 이제 기능을 만들어 보겠습니다 sendPayment라는 기능을 만들어 보죠 머니가 필요하죠 Money라고 치고 머니를 printin하게 될 겁니다 물론 문자열 보건이 있죠 sending moneyamount 라고 하면 되겠죠 이 중괄호는 안 쓰셔도 됩니다 넘기고 있는 단일 속성일 뿐이고 잠시 후에 보실 겁니다 이제 이걸 예를 들어 sendPayment 티켓이라고 하면 되겠죠 코틀린은 또한 보시다시피 리턴 타입을 정의내리지 않습니다 기본값으로 이건 유닛이고 보이드 같은 거지만 보이드는 아니죠 이는 사실 싱글톤, 즉 오브젝트의 단일 인스턴스인 거죠 이것이 유닛이라면 여기 넣을 필요 없겠죠? 그럼 여기 새로운 파라미터를 넣고 예컨대 메시지라고 하죠 이건 문자열을 가지게 될 것이고 기본값 파라미터를 가지면 되겠죠 여기 보시면 기본값 파라미터를 만들었기 때문에 컴필레이션 오류가 없죠 이는 과부하된 기능의 측면에서 많이 절약해 줍니다 과부하된 멤버 기능에서 말이죠 그냥 기본값 파라미터가 있으면 되고 그 다음엔 마음대로 하면 되죠 기본값 파라미터가 여러 개 있어도 되죠 여러 개의 기본값 파라미터가 있어도 되고 무엇을 전할지 번갈아 보낼 수 있으므로 파라미터 이름도 정할 수 있죠 따라서 사실 메시지는 "행운을 빌어!"와 같다고 쓰고 머니는 티켓과 같다고 쓸 수 있겠죠 이는 유용할 수 있습니다 예컨대 레거시 코드를 쓸 때 수정할 수 없는 기능이 있다고 치면 600개의 파라미터가 있는 거죠 아마 그 중 500개는 진실 거짓 불리안이라면 각 포지션 마다 어떤 파라미터를 전할지 일종의 통찰력을 주는 거겠죠 네 사람들이 망칠 때 정말 좋습니다 박수칠 때 말이죠 잘 되고 있다고 생각하고 있던 참이었죠 좋습니다, 다시 해 보죠 편집해 주세요, 성인 감독 차원에서 좋습니다 코틀린의 다른 특징은 정말 쉬운 기능이 있다는 점이죠 근본적으로 단일 값으로 리턴하는 것처럼 그냥 단일 수식 기능을 할 수 있습니다 외현 타입을 삭제했고 중괄호도 삭제하고 그냥 제가 원하는 실제 기능으로 리턴하는 거죠 아셨죠? 사실 수식의 개념은 코틀린에서 많은 부분에 나타납니다 예컨대 다른 기능을 만들어 보죠 ConvertToDollars라고 부르는 기능이죠 이는 머니를 가져갈 겁니다 머니로 리턴하겠죠 그러고 나서 할 일은 이건 when 스테이트먼트가 있고 이건 케이스이죠 따라서 통화가 달러이면 그대로의 머니가 리턴하는 거죠 아무 것도 할 필요 없으니 말이죠 유로이면 리턴하겠죠 moneyamount 곱하기 죄송해요, 새 인스턴스를 만들어야겠죠 머니, 그러고 나서 money

amount 곱하기 BigDecimal 110 그러면 달러가 되겠죠 그 외에는 IllegalArgument Exception을 던지고 "당신이 관심 있어 하는 통화가 아님" 이는 결국 when을 수식으로 취급할 수 있죠 따라서 이 리턴을 없애고 이 리턴도 없애고 여기에만 넣으면 이것이 그냥 when은 항상 수식을 리턴하는 것으로 만들어주는 거죠 사실 여기 리턴도 지울 수 있습니다 Money도 없애고 이것도 없애면 단일 수식이 생긴거죠 아셨죠? 단일 수식 기능입니다 이제 여기서 보시다시피 이건 오류를 주고 있죠 BigDecimal을 int로 운용하려고 했으니 말이죠 이를 리팩터하면 되겠죠 그리고 이걸 BigDecimal로 부르겠습니다 BigDecimal에 대해 말하자면 여기도 있죠 BigDecimal, BigDecimal 100 그리고 BigDecimal BigDecimal을 입력하는 거 좋습니다 즐겁습니다 여기 이게 있죠 이제 BogDecimal을 보시면 BigDecimal을 새로 만들어서 bd1는 BigDecimal 100과 같다고 하죠 보시다시피 bd1은 많은 기능이 있죠 나누기, 곱하기 등등 말이죠 백분율 같은 것을 하고 싶다면 어떨까요? BigDecimal의 백분율을 원하는 거죠 보통은 기본적으로 거기에서 인헤리트한 후 여러분 각자의 버전을 만들겠지만 코틀린에서는 저희가 추가한 기능 중 하나는 C#과 익숙하시면 확장 기능이라고 불리는 것으로 기본적으로 어떠한 클래스나 타입도 확장시킬 수 있다는 겁니다 따라서 BigDecimal의 기능을 가지고 확장시키고자 하는 클래스의 이름을 넣고 이것이 백분율이길 원한다고 하면 되죠 그리고 제가 하고 싶은 백분율은 예컨대 정수이고 그럼 된 거죠 봅시다 이것이 확장 기능이라는 점에서 그 클래스, 오브젝트의 인스턴스를 가지게 되는 거죠 좋습니다 이것으로 레퍼런스 할 수 있는 거죠 그러고 나서 이건 백분율로 곱해지고 다시 BigDecimal로 둘러쌓여야겠죠 백분율 그런 후 나누고 또 다른 BigDecimal 100이죠 뭐가 잘못 됐죠, 백분율이어야죠 백분율 좋아요, 이제 bdi에 백분율이 생긴 거죠 그렇죠 percent7이라고 하면 특정 백분율을 주는 거죠 그리고 이 확장 기능은 패키지 내에서 정의된 어디에서든 포함되는 겁니다 따라서 이 경우 comjetbrainsgio에 있죠 거기 포함될 겁니다 따라서 확장 기능을 만들 수 있고 표준 라이브러리가 실제로 여러 확장 기능을 포함하고 있다는 걸 볼 수 있으실 겁니다 이제 한 걸음 더 나아가 보겠습니다 사실 모든 것을 확장시킬 수 있기 때문이죠 가서 정수를 확장시켜보죠 fun Int이라고 하고 percentOf를 치면 그 반대를 할 겁니다 어떤 것의 10프로를 원한다고 하죠 그럼 예컨대 머니라고 하고 돈의 10프로를 원하죠 리턴하겠죠 봅시다, 머니를 리턴하겠죠 amount

multiply가 될 것이고 여기는 실제 인스턴스를 참조할테니 this일 것이고 다시 한번 this는 BigDecimal로 쌓여야 하고 100으로 나눠지겠죠 좋습니다 순서가 똑바로 된 것 같습니다 실행이 잘못되도 상관 없어요 아무도 신경 안 쓰죠 어쨌든 이제 이렇게 할 수 있죠 7 percentOf BigDecimal 100라고 하죠 됐죠? 아니죠, 죄송합니다 머니 머니라고 하고 아직 박수치지 말아 주세요 머니 그냥 가지고 있는 머니를 가져오죠 7percentOf(popcorn) 됐죠? 좀 더 괜찮은 걸 해보죠 사실 이렇게 하고 싶습니다 7 percentOf popcorn이라고 하고 싶죠 괜찮을 겁니다 그렇게 하셔도 되죠 여기 구불구불한 것 보이시나요? Alt, 엔터, 'infix' 첨가 됐죠 단일 파라미터를 가진 어떠한 확장 기능도 infix 표시로 불러올 수 있습니다 그리고 제가 한 건 거기 infix를 추가한 것이죠 이것이 코틀린으로 DSL 접근을 할 수 있게 만드는 겁니다 좋습니다 제가 정말 하기 싫어하는 것 중 하나는 BigDecimal을 쓰는 거죠 귀찮죠 코틀린에서 타입 롱의 값을 만들고 싶다면 long 100L라고 치면 타입 롱이 될 겁니다 이렇게 할 수 있다면 좋겠죠 bd2는 100BD와 같다 하지만 못합니다 이건 내장되지 않았죠 하지만 코틀린에 있는 것은 확장 속성이라는 겁니다 이건 확장 기능과 완전히 똑같은데 속성으로 확장시키는 것만 다르죠 따라서 bd같은 걸 할 수 있죠 이제 그럼 심지어 타입 정수에 확장 속성을 만들길 바라냐고 묻는 거죠 네 BigDecimal을 리턴하겠죠 그럼 여기에서 BigDecimal을 리턴할 것이고 이건 인스턴스죠 사실 더 쉽게 만들기 위해 이걸 수식으로 바꿀 수도 있죠 됐습니다 이제 100bd가 생겼죠 이걸 전할 때 BigDecimal보다 훨씬 근사하고 그냥 100

bd라고 하면 됩니다 아셨죠? 기능으로 할 수 있는 또 다른 것은 확장할 수 있는 특정 수식이 있다는 거죠 예컨대 더하기 연산자를 확장할 수 있습니다 전 이걸 다 입력하지 않고 절 위해 이 일을 해줄 작은 것을 해 보도록 하죠 제가 얼마나 빨리 타자 치는지 보셨죠? 제가 한 일은 이제 돈에 대한 더하기 연산을 치환한 것이죠 따라서 비용은 티켓 더하기 팝콘이라고 할 수 있죠 비용 금액에 추가할 수 있도록 해주는 겁니다 이를 더하기, 빼기 곱하기 등으로 할 수 있습니다 여러분이 사용할 수 있도록 하는 특정 연산을 따르도록 내장된 컨밴션이 많죠 좋습니다 여기에서 저희는 여러 타입을 만들었습니다 전부 지워서 집중할 수 있도록 해보죠 저희는 여러 타입을 만들었죠 제가 만든 이 타입를 보시면 전 실제로 타입을 구체화한 적 없지만 그러셔도 됩니다 예컨대 val train costs 라고 할 수 있죠 예컨대 트레인은 타입 머니이고 그러면 새로운 값으로 시작하는 거죠 100bd 그러고는 달러를 쓰는 거죠 train=null이라고 한다면 오류를 주겠죠 사실 2개의 오류가 날 겁니다 하나는 이것이 변경할 수 없는 변수이기 때문이죠 고치면 되겠죠 이걸 고칠 수 있도록 만들었습니다 IDE가 밑줄 그은 게 보이시죠 이건 피해야 하는 것이라고 지적해주는 겁니다 코틀린에서는 변경 불가능성을 강요하진 않지만 권장하고는 있습니다 모든 목록같은 것은 기본값으로 변경할 수 없죠 따라서 코틀린에서는 널을 할당할 수 없습니다 코틀린은 널 포인터 예외를 없애려고 하기 때문이죠 타입은 기본값으로 널이 될 수 없다고 하면서 말이죠 하지만 어떤 이유에서 널이 될 수 있는 타입이 있길 바랄 때도 있죠 지루할 때 말이죠 물음표를 추가하시면 되고 그러면 그런 타입에 널을 할당할 수 있는 기능을 줄 겁니다 보통 코틀린으로 작업하실 때 이걸 필요없을 수도 있죠 널이 될 수 있는 타입은 필요 없을 수도 있지만 자바와 인터롭하고 있으고 자바는 널이 될 수 있으니 말이죠 예컨대 이런 기능을 만든다면 fun javaMoney라고 하고 type JavaMoney의 머니를 가지고 이걸로 뭐든 하는 거죠 println moneyamount가 유효하다라고 해보죠 그럼 이건 널이 될 수 있죠 에컨대 이 타입으로 리턴하는 기능의 인스턴스로 불러진다면 널이 될 수 있죠 그리고 물음표를 추가해서 이걸 표시할 수 있죠 그렇게 하실 때 IDE가 오류를 주는 게 보이시죠 안전한 운용이라고만 하거나 느낌표 두 개가 유효하다고 하는 거죠 왜냐하면 이는 근본적으로 널 참조 예외와 부딪히게 될 것이라고 말하는 것이기 때문이죠 이를 해결하는 데에는 2가지 방법이 있습니다 먼저 예컨대 머니 널이 아니다고 할 수 있죠 그런 후 널이 아니면 운용하라고 할 수 있죠 이걸 위로 올리겠습니다 좋습니다 그게 하나의 방법이고 혹은 더 짧은 방식은 그냥 안전 운용이나 Elvis 운용을 쓰는 거죠 그건 여기 있죠 이제 그저 머니가 널이 아니면 뭔가를 하라고 할 수 있는 겁니다 기능을 원하면 그것도 가능합니다 널인 걸 알지만 그냥 자승자박하고 싶다는 의미죠 아셨죠? 여기서 조심하셔야 합니다 많은 경우 코틀린을 시작할 때 여기 작은 물결 표시가 있으니 이렇게 생각하기 쉽죠 널이 될 건지 사실 잘 모르겠어 널이 아니길 원하니까 그냥 널이 아닌 사례는 그냥 다루지 않고 그냥 이대로 해야지 그러다 앱을 실행하고는 이러시겠죠, 잠깐 코틀린은 널 참조 예외를 없앤다고 했는데 그렇죠 좋습니다 또 뭐가 있죠 그렇죠 다른 문제로 넘어가죠 고등 기능으로 말이죠 고등 기능과 다들 친숙하실 겁니다 기본적으로 기능을 가지고 혹은 기능을 리턴하는 기능으로 코틀린에도 있습니다 findEmails users 사용자 목록이라고 하면 되죠 그러고는 새 기능을 만들죠, 즉 서술어이고 여기 기능을 넘기고 있죠 문자열을 가지고 부리언을 리턴하는 기능입니다 됐죠? 그러면 이건 아마 사용자 목록을 리턴하겠죠 근본적으로 제가 하는 건 사용자 목록을 거르는 겁니다 좋습니다 이건 나중에 하죠 TODO "Later" 좋습니다 이 TODO는 내장되어 있습니다 실행되지 않은 예외 대신 이걸 쓰셔도 됩니다 오늘 다루지는 않겠지만 다른 것을 할 겁니다 Nothing은 코틀린에서 정말 좋은데 지금은 다루지 않겠습니다 걱정할 건 없죠 방금 지어냈습니다 좋아요 감사합니다 그럼 이걸 어떻게 쓸까요? findEmails를 할 수 있습니다 사실 사용자가 있으니 사용자가 만들도록 하죠 usersFromJSONFile라고 하고 여기 사용자가 있으니 usersjson이라고 하고 이는 사실 제가 이미 가지고 있는 기능이고 기본적으로 json을 이용해 파일에서 사용자를 읽어 냅니다 그리고 이건 여러분이 이미 본 적 있는 전형적인 데이터 클래스입니다 유일하게 새로운 점은 속성 역할을 가진 enum 클래스 또한 있다는 거죠 아셨죠? 이제 사용자라고 쓰면 되고 그럼 그 기능을 넘길 겁니다 이제 이름 기능을 넘길 수 있죠 컬럼 컬럼 참조를 사용하거나 lambda를 넘길 수도 있죠 코틀린에서 lamda는 이러한 신택스를 따릅니다 파라미터 이름을 넘기고 예컨대 파라미터 이름이 rightcom으로 끝난다고 하는 거죠 이제 com으로 끝나는 사용자 목록을 받게 되는 겁니다 코틀린에서 단일 파라미터가 있을 때 사실 외현적으로 언급하지 않도록 정해서 it으로 대처할 수 있습니다 Groovy와 유사하게 그냥 it을 쓰시면 됩니다 코틀린에서 할 수 있는 또 하나는 기능으로의 마지막 파라미터가 또 다른 기능일 때 실제로 괄호에 넣지 않아도 됩니다 약간 바깥에 있는 느낌이 들죠 다시 한번 말하지만 이건 좋은 DSL을 만들도록 해주는 특징 중 하나이고 여러 라인으로 할 수도 있습니다 이제 findEmails를 보시면 어떤 면에서는 언어의 일부인 것처럼 느껴질 수도 있지만 사실 그게 아니라 기능인 겁니다 그리고 비동기식 프로그래밍을 코루틴으로 실행했을 때 별로 였습니다 C#과 익숙하시다면 C#는 동기화한 후 기다리면 언어에서 키워드가 있죠 코틀린에는 없습니다 그냥 기능일 뿐이죠 따라서 여러분에게 다양한 것을 어떻게 할지 결정하는 데에 있어 융통성을 주는 겁니다 이 모든 것을 하실 필요는 없습니다 이 모든 것이 내장되어 있기 때문이죠 예컨대 dotComUsers라고 하면 users

filter라고 했을 때 보시다시피 이걸 완성하니 파라미터에서 포함 버전을 실제로 선택하는 거죠 emailendsWith com이라고 하면 되겠죠 itid로 분류하기로 하면 되죠 그러고 나서 이렇게 해보죠 itemail과 it

username 쌍으로 맵핑하기로 하면 됩니다 됐죠? 이 모든 기능은 실제로 출시된 작은 표준 라이브러리에 내장돼 있고 Android에서도 문제 없을 겁니다 아주 작습니다 그리고 모든 것은 생성 컬랙션에 확장 기능까지 가지는 겁니다 따라서 요즘 유행하는 모든 기능적인 것을 다 가지게 되는 겁니다 따라서 이건 한 쌍으로 주겠죠 사실 더 괜찮게 만들 수도 있죠 쌍으로 하는 대신 it to로 하면 말이죠 따라서 이메일에서 사용자 이름을 맵핑하죠 이게 뭘까요? 그냥 쌍을 만들어내는 infix 기능입니다 아셨죠? 전 때로 전체 맵을 다 살펴보진 않습니다 예컨대 전 단일 요소에만 돌아가고 싶은 거죠 여기서 할 수 있는 건 destructure 클래스입니다 코틀린에서 데이터 클래스이죠 id, 사용자 이름, 이메일 이렇게 할 수 있죠 그러고 나서 그냥 ID를 쓰는 거죠 이건 멋지지만 IDE가 불평하면서 이러겠죠 이 변수는 한 번도 안 쓰네 그런 경우 실제로 이걸 밑줄로 대처할 수 있습니다 그럼 된 거죠 따라서 원하는 값은 destructure하고 사용하고 싶지 않은 것은 밑줄로 대처하면 다 된 겁니다 좋습니다 또 무엇을 보여 드릴까요? 좋습니다 여기 다른 코드도 좀 있죠 산술적 데이터 개념 타입과 익숙하시다면 이건 근본적으로 이 타입이든 다른 타입이 될 수 있죠 부리언 인스턴스처럼 말이죠 코틀린에서는 하는 방법은 coclasses를 쓰는 거죠 이걸 시작하기 전에 여기를 열어 보겠습니다 보시다시피 사용자 결과가 오류를 보이고 있죠 기본값으로 코틀린에서는 클래스에서 인헤리트할 수 없기 때문이죠 따라서 모든 클래스는 근본적으로 최종입니다 클래스에서 인헤리트하고 싶다면 오픈 모디파이어를 사용해야 합니다 저는 실드를 사용했고 이 실드는 근본적으로 이건 사용자 결과가 가지는 위계질서라고 말하는 겁니다 사용자 결과에서 인헤리트 될 다른 클래스는 어디에도 없을 거라는 거죠 사용자 결과에서 인헤리트될 모든 것은 같은 파일에 있거나 혹은 물론 서브클래스로 만들어야 한다는 거죠 그럼 이걸 위로 옮기면 이건 서브클래스이겠지만 이걸 사용자 결과로 프리픽스해야 겠죠 좋습니다 전 클래스 밖으로 만들었습니다 왜 그랬을까요? 보기 좋으니까 아닙니다 이건 사실 기능을 인보크하는 경우에 좋은 겁니다 이러시겠죠, 좋아, 성공하면 값으로 리턴하길 원해 널이면 메시지로 보내야지 그러면 성공할 때 리턴하고 싶은 값이 포함된 이 타입이 있을 것이고 메시지가 있을 때 리턴하고 싶은 타입을 포함한 것도 있고 그러면 오류 상황에 적용되는 속성이 무엇인지 비오류 상황에 적용되는 속성이 무엇인지 그 시매틱을 이해해야 하고 아니면 그냥 예외로 던져버리겠죠 이 경우 두 타입을 리턴하는 기능을 사용하면 되겠죠 그러면 그 결과에 기초해 다른 것을 하는 겁니다 예를 들어 이렇게 해 보죠 인스턴트 val을 만들고 결과는 유저결과와 같고 죄송해요, retreiverusers죠 이제 when을 할 수 있죠 결과가 성공이면 예컨대 이렇게 할 수 있겠죠 결과를 받을 것이고 그런 후 users ForEach printin 이름을 하면 되죠 됐죠? 사용자이름 그러고 나서 실패를 해야죠 Result println resultmessage 됐죠? 그럼 이제 결과에 근거해서 즉 리턴되는 타입에 기초해서 다양한 것을 할 수 있죠 여기 하나 보이는 건 이것이 녹색이 됐다는 거죠 큰 화면에서 보이시는지는 모르겠지만 이것이 녹색이 됐습니다 이건 스마트 캐스트입니다 이것이 코틀린에 있는 또 다른 겁니다 제가 널 확인을 하고 있을 때 보였죠 스마트 캐스팅이기 때문에 이건 널이 아니라고 알려주는 거죠 외현적으로 다시 와서 이렇게 말하지 않으셔도 됩니다 이건 타입 성공인 걸 아니 가서 타입 석세스라고 캐스트하고 속성에 접근하라고 말이죠 컴파일러가 대신 해 줄 겁니다 그게 스마트 캐스팅이죠 좋습니다 안드레이에게 넘기기 전 마지막으로 중요한 것은 그냥 빨리 언급할 내용은 여러분이 보고 계신 필터 맵 같은 이 많은 것이 근본적으로 열정적인 평가입니다 하지만 또한 게으른 평가를 하는 능력도 있습니다 예컨대 val을 할 때 죄송합니다, generateSequence 그러고 나서 예컨대 1이라고 하고 그럼 여기 it 곱하기 10이라고 하고 나서 values를 하겠죠 이제 valuestake(10)이라고 하고 forEach println it라고 하는 거죠 이제 이건 시퀀스를 만드는 겁니다 무제한의 발전기이죠 절대 멈추지 않을 겁니다 1에서 시작해서 10배로 되는 거죠 하지만 제가 하는 얘기는 10개의 요소만 가지고 프린트하고 싶다는 거죠 기본적으로 이건 10에 도달할 때까지 소비하고 프린트하죠, 이건 필요 없고 아룸다은 크리스마스 트리를 프린트했습니다 한쪽으로 치우쳤죠 피라미드든 뭐든 여기서 멈추죠 여러분이 가진 어떤 것이든 예컨대 저희가 가진 사용자들 usersJson에서 온 사용자들은 asSequence로 해서 게으른 평가로 바꿀 수도 있는 거죠 됐죠? 오늘 시간은 이게 다입니다 분명 언어가 훨씬 더 많죠 온라인에 가셔서 많이 배우세요 감사합니다 안드레이에게 넘기겠습니다 감사합니다, 하디 안녕하세요 보셨듯 코틀린은 이미 많은 것을 가지고 있지만 전 현존하는 것을 배우기 전에 새로운 미래를 추가하는 못된 사람이죠 이제 이야기를 들려 드릴텐데 클리커를 먼저 찾아야겠습니다 클리커 있나요? 없군요, 알겠습니다 그럼 클리커 없이 이야기를 하도록 하죠 제가 오늘 할 일은 코틀린의 미래 버전에서 어떤 기능을 가질지에 대해 이야기하는 겁니다 감사합니다 지금 저희가 일하고 있는 첫 번째 큰 것은 플랫폼으로 다양한 플랫폼을 지원합니다 역사적으로 코틀린은 JVM 바이트코드로 컴파일 되죠 자바 프로그래밍 언어와 마찬가지입니다 데스크탑에서 서버를 실행할 수 있고 물론 Android에서도 할 수 있죠 그리고 어디든 같은 바이트코드입니다 그래서 새 버전뿐 아니라 예전 버전의 Android에서도 실행될 수 있죠 하지만 이 이야기는 여기서 끝나지 않습니다 새 플랫폼을 추가하기 때문이죠 최근에 저희는 추가했는데 신이 플랫폼을 좋아하지 않나 봅니다 최근에 자바스크립트를 추가했습니다 이는 코틀린이 이제 자바스크립트 코드를 컴파일할 수 있고 브라우저나 nodejs에서 실행될 수 있다는 거죠 이제 저희는 세 가지 주요한 아주 인기 있는 가상 머신을 지원합니다 JVM, Android Dalvik, 그리고 JavaScript VMs이죠 하지만 가상 기계가 실용적이지 않고 이용할 수 없는 경우가 미국에 많습니다 예컨대 iOS의 경우 가상 기계가 굉장히 제한적입니다 다이나믹 코드 생성을 할 수 없고 작은 임베디드 시스템의 경우 VM이 맞지 않죠 혹은 리눅스 명령 라인 도구의 경우 VM은 너무 오랫동안 시작하는 도구가 될 겁니다 따라서 이건 좀 곤란합니다 그래서 저희는 코틀린 네이티브라는 것을 만들고 있죠 현재 기술 미리보기로 사용 가능 합니다 저희는 LVM을 이용해 코틀린을 네이티브 코드로 컴파일하려고 노력 중이고 다양한 플랫폼에서 실행될 수 있는 독립적인 바이너리이죠 현재 iOS, Linux, Mac을 지원하고 윈도우는 작업 중입니다 따라서 이는 코틀린에 대한 비전으로 우리를 데려가 주고 이는 현대 애플리케이션의 모든 컴포넌트 안에서 원하는 플랫폼 상에서 실행될 수 있을 것이라는 거죠 많은 웹 애플리케이션이 서버와 고객 모두 코틀린으로 쓰여졌다고 생각해 보세요 혹은 예컨대 Android와 iOS 같은 모바일 플랫폼 사이에 코드를 재활용하는 것을 생각해 보세요 혹은 이전 사용 사례 두 가지를 섞어서 실제 멀티플랫폼 시나리오를 얻는다고 생각해 보세요 따라서 코틀린에 대한 우리의 비전은 한 프로젝트에서 다양한 모델이 다른 플랫폼으로 컴파일되는 겁니다 물론 코드도 공유하고 싶겠죠 다양한 많은 것을 지원한다면 다른 곳에서 같은 코드를 실행하고 싶을 겁니다 이것이 가능해지도록 저희는 노력 중입니다 하지만 아주 중요한 것이 있습니다 이전에 많은 프로젝트들은 플랫폼을 획일화하기 위해 노력해왔기 때문이죠 이는 종종 정말 다른 공통 분모로 끝나곤 했습니다 모든 플랫폼에서 이용할 수 있는 것만 가지고 하면 기본적으로 최소한의 인터페이스에 갖히는 거죠 그리고 저희는 그것을 원하지는 않습니다 저희는 여러분이 각 플랫폼에 맞춘 멋진 API를 사용할 수 있길 바랍니다 예컨대 가장 최신 버전의 Android 같은 것이나 여러분이 원하는 다른 것을 말이죠 코드를 공유하고 싶으시면 그때서야 공통된 API에 마지못해 의존해야겠죠 따라서 다양한 사업 원리 등을 가진 공통된 모델이 있고 코틀린으로도 쓰여진 각 플랫폼에 맞춰진 모형이 동시에 작동한다는 거죠 또한 이 둘은 서로 소통할 수 있습니다 따라서 필요할 때 플랫폼 API를 이용하면 되고 필요할 때 코틀린 코드를 사용해도 되는 거죠 따라서 요점은 우리의 미래는 멀티플랫폼이라는 겁니다 다음 다음 큰 부분은 coroutine입니다 원리는 이해하기 쉽습니다 모든 사람이 비동기식 코드를 써야 한다는 거죠 이 세상은 순차적인 실행을 하기엔 이제 너무 크기 때문이죠 이게 저희 현실이지만 힘들죠 비동기식 코드 써 보신 분 있나요? 꽤 많이 손을 드셨죠 이를 하지 않으신 분은 실제로 가까운 미래에 하게 되실 겁니다 문제는 순차적 코드를 쓰기가 실제로 어렵다는 거죠 혹은 여러분을 지원하는 언어를 배우기 전에 힘들었죠, 왜냐하면 언어는 상당히 도움을 줄 수 있기 때문이죠

기본적으로 코틀린에서 coroutine으로 하는 것은 동기식 코드를 쓰는 것과 같은 방식으로 비동기식 코드를 쓰는 겁니다 동기식 코드에서 뭘 사용하시죠? 루프, if, 브레이크와 컨티뉴 이런 것이죠? coroutine에서 비동기식 코드를 위해 여러분이 사용하는 것도 같은 겁니다 그래서 언어가 모든 것을 추적할 수 있고 여러분의 코드에 동기식 컴퓨터 사용을 위한 복잡한 통제를 표현하지 않아도 되는 거죠 콜백도 없고 근사한 기능 구조도 없죠 그냥 평범한 오래된 순차적으로 보이는 코드일 뿐입니다 멋지지 않나요? 감사합니다 coroutines에 대한 아이디어는 기본적으로 비동기식과 동기식에 대해 같은 추상화를 가진다는 것이죠 또한 스레드가 거의 없다고 생각하셔도 좋은 비유가 되겠죠 여기 코드 예시만 보여드리겠습니다 전통적으로 스레드로 해왔던 아주 많은 것들이 coroutine으로 가능하지만 coroutine은 굉장히 저렴합니다 슬라이드에 십만 개의 coroutine을 만드는 코드가 있습니다 생각해 보세요 평행으로 존재하는 십만 개의 coroutine과 각각이 1초 동안 기다리면서 리턴한다고 말이죠 따라서 이 프로그램은 1초 내에 완성됩니다 거의 1초이고 이는 물론 모든 coroutine이 동시에 기다리기 때문이죠 하지만 이걸 스레드로 하려고 하면 안될 겁니다 십만 개의 스레드는 메모리에 맞지 않죠 바로 그겁니다 따라서 coroutine으로 윈윈 상황이 된 겁니다 성능도 많고 굉장히 효율적이며 코드도 간단하죠 따라서 요점은 coroutine을 확인해 보시라는 겁니다 우리의 미래는 현재보다 훨씬 더 비가동식일 가능성이 높으니까 말이죠 이제 발표는 거의 끝났고 코틀린에 대해 더 배우고 싶으시면 웹사이트를 확인해 보세요 Android를 위한 섹션이 있습니다 또한 이 발표 바로 다음에 질의응답 시간이 있으니 섹션 C의 개발자 샌드박스로 오세요 저와 한디가 질문에 대답하고 있을 겁니다 와주셔서 감사합니다

How to Deal with Problems When Migrating from Kotlin Android Studio Project to AndroidX (2019)

좋습니다, 그래서 이것은 후속 비디오입니다 내 이전 비디오로 Android Studio 프로젝트를 Android X로 마이그레이션하십시오

이것은 코 틀린 스에게 특유한 것입니다 나는 몇몇 함정에 대해서 이야기 할 것이다 전환 할 때 발생할 수있는 문제 안드로이드 X에 Kotlin 안드로이드 스튜디오 프로젝트 먼저 첫 번째 비디오를 확인하십시오 내가 몇 가지 것들을 마이그레이션을 수행해야합니다

하지만 그걸 본 후에, 여기 와서 이걸 보렴 나머지 단계를 거치도록하겠습니다 희망을 갖고 Kotlin 프로젝트를 시작하도록 그것을 변환하고 나중에 Android X로 이전합니다 시작합시다 (낙관적 인 하우스 음악) 본 적이 없다면 이 시리즈의 이전 비디오 이걸보기 전에 할 수 있습니다

이 동영상에서 몇 가지 문제를 보여 드리겠습니다 Android X를 사용하도록 코드를 마이그레이션 할 때 발생할 수 있습니다 그러나, 나는 토론하지 않을 것이다 마이그레이션 프로세스 자체를 자세히 설명하고, 그것은 이전 비디오에 있습니다 이제 화면에 해당 동영상에 대한 링크가 있습니다

이 동영상에 대한 설명에도 나와 있습니다 그리고 계속해서 우리는 이주 할 Kotlin 프로젝트를 가지고 있습니다 그럼 언제 어떻게되는지 봅시다 Android X를 사용하도록 이전합니다 그래서 저는 리팩토링 메뉴에 올 것입니다

Android X로 이전을 선택하겠습니다 이걸 염두에두면 화면에 표시하고있다 Android Studio의 경우 실행중인 경우 Android Studio 33 이제 내가 할 일은 도구를 사용하여 백업 zip 파일을 만든 다음 더블 팩터를 클릭 할거야 위의 폴더에 그 파일을 넣을 것입니다

현재 프로젝트 그래서 아무 방법도 없다 이 프로젝트에 추가됩니다 나는 지금 내가 가진 것을 대체 할 것이다

그리고 실제로 사용법을 스캔하고 있음을 알 수 있습니다 무엇이 업데이트되어야하는지 리팩토링 프로세스를 수행합니다 나는 또한 마지막 비디오에서 언급했다 다음과 같은 대화 상자가 나타날 수 있습니다 변화가 감지되었음을 보여 주거나 말하기

이 대화를 듣는다면, 재방송 검색 버튼을 클릭하십시오 그래도 그 순간 이상하게 행동합니다 아마도 두 번째 리팩토링 검토 창, 미리보기 창 말하지만 리팩토링 버튼은 없습니다 그 경우에는 창을 클릭하고 리팩토링 버튼을, 원래의 창에서, 하지만 제 경우에는 그 중 아무 것도 나오지 않았습니다 알았어, 이제 리팩토링 도구를 클릭 할거야

그리고 끝내려면 시간이 걸릴거야 통과하고 알아 내기 때문에 무엇이 업데이트되어야하는지, 그리고 실제로 적절한 구성 요소를 다운로드하려고합니다 완료되면 우리는 실제로 바뀐 것을 확인하려고합니다 좋아, 이제 끝내자 그래서 제일 먼저 우리가 할거야, 우린 갈거야

모듈의 빌드 도트 그라디언트 파일을 확인하십시오 그래서 저는 Gradle 스크립트로갑니다 모듈 앱을 살펴보십시오 우리가 만든 gradle 파일 아래로 스크롤하여 살펴 본다면 여기에 꽤 오래된 버전이 있습니다

우리는이 모든 버전들이 이제 새로운 버전을 사용할 수있게되었습니다 기본적으로 Android X는 빠르게 변화하고 있습니다 그 순간에 우리는 각 라이브러리의 릴리스 버전 그때 나는 이것을 쏘고있다 전구 몇 개를 클릭하면됩니다 이 첫 번째 항목을 제외한 모든 항목이 실제로 변경됩니다

그리고 내가 이것을 처음으로하지 않을 이유는 이 버전 번호를 별도로 정의하기 때문에, Android Studio는이를 변경하는 옵션을 제공하지 않습니다 그러나 나는 다른 모든 것들을 모두 통과 할 수있다 그리고 지금 할거야 그래서 저는 이것들 각각을 선택할 것입니다 그리고 변화

그리고 분명히 이것을함으로써 프로젝트를 다시 동기화해야합니다 나는이 모든 것을 끝내고 다 할 것입니다 알았어 그래서 나는 그 모든 것을 바꾸었다 내가 언급했던 그 첫번째 입구 이외의

그리고 지금 다시 동기화해야합니다 또는 지금 동기화를 클릭하여 동기화 할 수 있습니다 그러면 프로젝트가 다시 동기화됩니다 끝나면 볼 수 있습니다 그것의 각종 파일을 지금 다운로드하는, 화면 하단의 상태 표시 줄에 완료되면 우리는 모양을 가지고 어떤 문제가 발생했는지 확인하십시오

그리고 일반적으로 당신이 이것을 할 때 그것은 좋은 것입니다 프로젝트의 모든 파일을 검토하는 아이디어, 문제를 확인하십시오 하지만 지금 내가 말할 두 가지 주요한 것들은, 이 작업이 아직 완료되면 현재 사용하지 않은 수입입니다 잘못된 재정의뿐만 아니라 이 작업을 마무리하고 우리는 다시 와서 그것을 통해 갈 것입니다 알았어, 이제는 그레고리를 볼 수있어

프로젝트 빌드, 빌드가 완료되었습니다 방금 경고를 받았습니다 우리가 떠날거야, 우리는 그걸 바꾸려하지 않을거야 우리가 원하는 경우 수동으로 입력 할 수 있습니다 사실, 내가 왜 그렇게하지 않겠습니까? 수명주기 버전을 검토하고 변경하십시오

210 대시 알파 21 대시 0 대시

알파 2 그냥 해보고 다시 동기화하겠습니다 그냥 우리는 다른 경고가 없다 우리의 빌드 gradle 파일 좋아, 이제 너에게 보여주고 싶어

소개 될 오류 중 그래서 첫 번째가 열릴거야 일부 Kotlin 코드 및이 프로젝트에서 첫 번째 것은 날짜 선택기 조각입니다 클래스에서 살펴 보겠습니다 그리고 우리가 여기에있는 오류를 살펴 본다면, 우리가 그 위에 마우스를 가져 가면 볼 수 있습니다 첨부는 아무것도 무시합니다

그리고 그 이유는 서명은 Android X 코드에서 변경되었습니다 그래서 여기 52 행에서 컨텍스트 매개 변수 이 nullable 컨텍스트를 선언하십시오 Java에는 null 허용되지 않는 유형이 없습니다 하지만 Google은 주석을 추가하고 있습니다 Kotlin이 알 수 있도록 Android 프레임 워크 코드 일부 기능은 null 인수로 불려 갔다

그리고 그것은 실제로 여기서 일어난 일입니다 그리고 컨트롤이나 명령으로 볼 수 있습니다 슈퍼 첨부 기능을 54 번 라인에서 클릭하십시오 그래서 그렇게 할거야 우리는 지금 소스 코드를보고 있습니다

그리고 310 행에서 볼 수 있습니다 컨텍스트 매개 변수가 표시됩니다 그 주석을 사용해 null가 아닌 경우, 그래서 그것을 고치는 것은 매우 쉽습니다 우리가 할 수있는 것은 돌아온 것뿐입니다 매개 변수 유형에서 물음표를 제거하십시오

사용 된 컨텍스트 인수 함수 내부 및 nullable 유형 마커, 내가 한 것처럼, 이제 우리에게 경고를 주었고 그것은 불필요한 것입니다 안전한 전화 교환 원, 여기 57 번 줄에 있습니다 Android X 라이브러리는 Google이 있기 때문에 Kotlin에서 사용 이러한 null이 아닌 주석을 추가합니다 안전 호출 연산자를 그렇게 많이 사용할 필요는 없습니다 지금 기능을 무시할 때

내가 할 일은 그 안전한 전화를 지우는 것이다 우리는 다음 문제가 무엇인지 알게 될 것입니다 이제 우리는 중복 된 것을 볼 수 있습니다 to 문자열을 호출하십시오 내가 보여줄 수있는 예제가 필요했다

Android X가 코드를 변경하는 방식 하지만 그 라인은 현재 일을 마쳤고 따라서 to 문자열 함수 호출을 삭제할 수 있습니다 그래서 나는 그것을 할거야, 난 그냥 갈거야 달러 문맥에서 벗어나이 코드의 나머지 부분을 삭제하십시오 권리 좋아, 그 수업을 고쳤어

내가 바라는 다음 일은 커서 리사이클 뷰 어댑터 클래스 이제 가져 오기 섹션에서 찾을 수 있습니다 사용하지 않은 가져 오기가 실제로 표시됩니다 내 경우에는 그다지 올랐지 만 그것은 당신을 위해 올지도 모릅니다 그러나 문제는 완전한 자격으로 인해서 온다

마이그레이션 프로세스가 실제로 채택한 이름 예를 들어 17 행에서 볼 수 있습니다 안드로이드 X dot recycler보기 도트 위젯 이것은 리사이틀 뷰의 정규화 된 이름입니다 그래서 나는 그것을 제거 할 것입니다 그리고 수입을 받아 들일 것입니다

알았어 그래서 내가 실제로 고쳤다 다시 돌아가서 그 코드를 그대로 되돌려 놓을 것입니다 이제 다시 이것은 특히 나쁜 문제는 아니었다 하지만 사용하지 않은 가져 오기가 표시되는 경우 아마 당신이 고치기를 원할지도 모르는 사소한 성가심, 내 경우에는 실제로는 그렇지 않지만 거기에서 보았 듯이 완전한 경로 이름을 사용하십시오

그래서 우리가 해낸 것은 우리가했습니다 그 정규화 된 이름을 제거했습니다 Android X를 검색 할 것입니다 그리고 나는 다른 것들도 제거 할 것입니다 41 번 줄에 하나 더 있습니다

보시다시피 나는 그것을 제거 할 것입니다 나는 기본적으로 수색을 할 것이다 이제 그게 전부입니다 알았어 그래서 나는 그 두 가지를 바로 잡았다

이제 다른 예제를 살펴보면, 우리는 우리 프로젝트로 돌아갈 것이다 우리의 기간 보고서를보십시오 이제 당신은 아마도 거기에서 잠깐 보았을 것입니다 사용되지 않은 수입이있었습니다 실제로 나타나지 않는 이유는 내 취향에 있기 때문에

일반적으로 자동 가져 오기입니다 즉시 최적화 된 가져 오기가 있습니다 따라서 실제로 사용되지 않는 수입품은 숨어 있습니다

하지만 기본적으로 여전히 같은 것을 사용하고 있습니다 또는 그것은 그 정규화 된 이름과 동일한 이슈입니다 그리고 나는 그것을 사용하지 않는 것이 더 좋다고 생각한다 그 정규화 된 이름 우리가 할 수있는 일은 Android X를 검색하면됩니다

거기에 또 하나가 있다는 것을 알 수 있습니다 우리는 이것을 리니어 매니저로 대체 할 수 있습니다 나는 지금 모든 것을 통과하지는 않을 것이다 좋아, 다른 것도있어 기본적으로 더 많이 같습니다

그래서 나는 그 이상을 고치지 않을 것입니다 하지만 몇 가지 다른 문제가 있습니다 그 앱이 현재 실행되는 것을 막을 것입니다 첫 번째 관심을 끌고 싶습니다 주요 활동 클래스입니다

여기에 오류가 있습니다 기본적으로 우리는 번들을 변경해야합니다 물음표를 null이 아닌 유형 번들에 추가 그래서 우리는 단지 물음표를 제거 할 것입니다 그리고 그 오류를 수정합니다 그리고 주요 활동 단편

같은 문제가 있습니다 기본적으로 이전에 본 컨텍스트와 함께, nullable이 아닌 유형을 다시 제거 할 것입니다 중복 문자열 호출을 수정하려고합니다

좋아, 그거 좋은데 따라서 이러한 문제를 볼 수 있습니다 찾기 쉽고 수정하기 쉽습니다 그리고 앱을 실행하기 전에 앱이 여전히 작동하는지 확인하기 전에 나는 경고로 끝낼거야 우리는 정규 자격을 변경했습니다

클래스 이름을 단순화합니다 그리고 꽤 많이 있습니다 다른 클래스의 일부에서는 논쟁의 여지가있는 단편 활동 확장 그 (것)들의 짐을 가지고있다, 그리고 그것은 분명히 위로 정리되는 것으로 할 수 있습니다 프로젝트를 진행할 때 쉽게 할 수 있습니다 이 이름을 자동으로 단순화하는 습관을 가지며, 하지만 한 가지만하면 안됩니다

레이아웃 리소스 파일에서 그래서 우리는 나의 작업 레이아웃 파일 중 하나를 열 것입니다, 리소스 레이아웃 폴더에 있습니다 그리고 이름은 우리의 임무가 기간을 강조한다는 것입니다 이제 그걸 열어 봐 그리고 내가 텍스트보기인지 확인하십시오

나는 우리 다 그리고 우리는 단지 전체 화면으로 갈 것이다 먼저 제약 레이아웃이 완전 자격을 얻었습니다 Android X 도트 제약 레이아웃 레이아웃 도트 위젯에서 가져옵니다 레이아웃을 제약하는 것을 시도하거나 단순화하지 마십시오

아니면 앱을 망칠거야 그리고이 파일의 마지막 위젯 if 우리는 아래쪽으로 스크롤 리사이클 러 뷰는 정규화 된 것입니다

당신이 볼 수 있듯이, 다시 한번 그것을 내버려 둡니다 삭제할 참조를 변경하면 패키지 이름, 앱이 다운됩니다 레이아웃을 팽창 시키려고 할 때 알았어 그걸로 끝내자

그리고 앱이 제대로 작동하는지 확인해 봅시다 그리고 실제로 우리는 하나를 볼 수 있습니다 내가 고칠 필요가있는 다른 것, 아무 것도하지 않는 on attach override 그래서 나는 그것을 두 번 클릭 할 것이다 우리가 이전에 보았던 것과 같은 거기의 거래, null 허용되지 않는 유형을 없애고, 그로 인해 문제가 해결됩니다

그리고 우리는 그것을 다시 시도 할 것입니다 좋아, 우리는 그 다른 경고들을 무시할 것이다 지금은 화면 하단에 그러나 당신은이 시점에서 볼 수 있습니다 메인 화면이로드되고, 눈 모양 아이콘, 도구 모음 또는 도구 모음에서 탭하면, 보고서 화면을 볼 수 있습니다 이제 앱에 데이터가 없으므로 보고서가 비어 있습니다

하지만 우리는 적어도 그것이로드되고 있음을 알고 있습니다 메인 화면으로 돌아갈 수 있습니다 그리고 나는 또한 about 대화를 클릭 할 수 있습니다 확장 메뉴에서 그래서 잘 작동합니다

이제 분명히이 앱을 넣어야합니다 완전한 테스트 사이클을 통해, 앱에서 사용하는 라이브러리 변경 주요 변경 사항이며 테스트해야합니다 이후 앱을 철저히 우리는 분명히이 비디오에서 그렇게하지 않았습니다 좋아, 그게 프로젝트 야 마이그레이션 및 철저한 테스트 준비 및 미래 발달

알았어, 지켜봐 줘서 고마워, 질문이 있으면 의견을 남기십시오 네가 다음에 준비가 되었다면 프로그래밍 관련 비디오, 클릭 왼쪽 상단 모서리에있는 여기 링크 비 코딩을 보는 화면 프로그래밍 관련 질문, 왼쪽 하단에있는 링크를 클릭하십시오 화면을 자유롭게 구독 할 수 있습니다 여기에있는 링크를 클릭하면 다른 비디오에서 보자

Kotlin Android 高效開發:全新語言雲端世代

안녕, 모두 행크 야 이 과정은 Kotlin 안드로이드 APP의 개발 능력 Kotlin은 현재 가장 인기있는 프로그래밍 언어입니다

최신 Android 9을 코스에서 사용하십시오 Android Studio 3 개발 도구 2019 년은 안드로이드가 될 것입니다 개발 경쟁력의 경쟁력 Google IO 컨퍼런스에서 발표되었습니다 Kotlin은 Android 개발자가되었습니다 주요 공식 프로그래밍 언어 개최지의 박수 갈채 Kotlin이 얼마나 인기가 있는지 확인하십시오

개발자에게 사랑받는 2018 년 Kotlin을 사용하는 개발자 수 전년도 배율 코드의 거의 40 %를 줄일 수 있습니다 보다 간결하고 안전한 내 과정은 항상 직장을 목표로하고있다 효과적인 학습 방법 및 경로 설계 소프트웨어 분야에 진출하는 능력을 얻으려면 경쟁력 강화 그냥보고, 설명해 그 효과는 매우 제한되어있다 처음부터 끝까지 구현 능력 코스의 초점인가? 첫 번째 Android APP 효율적인 항목 온라인 과정 포괄적 인 5 성급 등급 획득 내 육체적 인 과정에는 수천 명의 산업 학생들이 있습니다

이유를 쓰는 방법을 알아라 처음부터 끝까지 만드는 법 아이디어를 APP로 구현합니다 성취감은 상상 이상입니다 우리와 함께 Zha Shi의 개발 역량을 함양합니다 앞 가장자리 만들기

Persist Date on DatePicker in Android using Android Studio – Kotlin

안녕하세요, CodeAndroid의 Vignesh 이 비디오에서는 datepicker에서 선택한 날짜를 유지하는 방법을 볼 것입니다 이것을 증명하기 위해 이미 프로젝트를 만들었습니다

레이아웃 파일에는 두 개의 버튼이 있습니다 btn_date 및 btn_time btn_date의 on-click, 나는 datepicker를 보여주고있다 btn_time의 on-click, 나는 timepicker를 보여주고있다 datepicker에서 오늘 다른 날짜를 선택하면 그러면 날짜가 여기에 올거야 하지만 문제는 버튼을 다시 클릭하면 오늘 날짜로 재설정됩니다

datepicker를 표시하기 위해 지금의 달력 객체를 사용하기 때문에 이 객체는 이제 onCreate ()에서 초기화됩니다 이것이이 가치가 전혀 변하지 않는 이유입니다 날짜를 23으로 선택하면 선택한 날짜 인 23을 유지하면서 날짜 표시기가 표시됩니다 그것을하는 방법을 볼 것이다 selectedDate 객체를 사용하는 대신이를 수행합니다 우리는 now 객체 자체를 사용할 필요가있다

그것이 날짜를 유지하는 가장 쉬운 방법입니다 나는 지금도 같은 시간에 객체를 사용하고있다 그래서 날짜와 시간은 같은 달력 객체를 사용할 것입니다 서버에 데이터를 보내야 할 때 now 객체를 사용하여 적절한 날짜를 생성 할 수 있습니다 애플리케이션을 실행 해 봅시다

너는 볼 수있다, 데이트는 13 시가 보이고 시간은 09:20에 나타난다 날짜를 21로 바꾸자 시간은 08:20 지금,이 btn_date를 클릭하면 기본적으로 21 feb를 선택해야합니다 너는 그것의 21 feb을 선택하는 것을 볼 수있다 similaryly, 시간은 08:20을 보이고 있습니다

기본적으로 08:20을 선택해야합니다 이처럼 우리는 datepicker와 timepicker에 데이터를 유지할 수 있습니다 그게 비디오 녀석들을위한 전부 야 나를지지하기를 원한다면 patreoncom/CodeAndroid에서 후원이되어 그렇게 할 수 있습니다

너가 좋아하길 바래 내 다음 비디오에서 뵙겠습니다 좋은 하루 되세요

Update Existing database in Android using Android Studio Kotlin

안녕 얘들 아, 그 Vignesh CodeAndroid에서 이 비디오에서는 Android에서 기존 데이터베이스를 읽는 방법을 보여줍니다 이를 증명하기 위해 이미 프로젝트를 만들었습니다

여기에는 런처 활동이 있습니다 안에 버튼이 있어요 버튼을 클릭하면 주요 활동을 시작합니다 MainActivity에서 DBHandler 객체가 있습니다 이것을 사용하여 테이블을 읽을 수 있습니다

테이블에 ID와 열이 포함됩니다 여기, 테이블 자체를 만드는 동안 Iam은 0에서 1000까지의 데이터를 데이터베이스에 삽입합니다 거래를 사용하여 왜냐하면 대량 삽입은 트랜잭션을 사용하는 데 시간이 덜 걸리기 때문입니다 MainActivity에서 RecyclerView를 사용하여 모든 데이터를 표시합니다 그래서 getAllData라는 메소드를 만들었습니다

테이블에서 모든 데이터를 읽고 반환합니다 getAllData를 호출하고 numberList라는 변수에 저장하는 DBHandler 객체 사용하기 어댑터가 numberList에서 값을 읽습니다 onBindViewHolder 메소드 내부 numberList에서 p1 번째 항목으로 TextView 텍스트 설정 자식 레이아웃에 다른 TextView가 있습니다 날씨를 표시하고자하는 숫자가 홀수 또는 짝수 인 경우 그러나 여기에서 일어나는 계산에 의해 정의됩니다 지금, 나는 테이블 안에 칼럼을 추가하고 싶다 iteslf 내가 저장하고 싶은 날씨는 숫자가 홀수입니다

기존 데이터베이스를 업데이트해야합니다 앱을 처음 설치하는 경우 우리는 그 칼럼을 가질 필요가있다 그래서 isOddNumber라는 컬럼을 추가하고있다 정수형이다 또한 데이터를 삽입하는 동안 열을 업데이트하려고합니다

그래서, isOddNumber를 숫자 % 2와 같게 추가합니다 (실제로 우리는 숫자 % 2 == 1을 할 필요가 있습니다) 앱이 이전 기기에 설치되는 경우 (이전 앱 상단) 이전 버전의 데이터베이스가있는 그런 다음 여기에서 데이터베이스를 업데이트해야합니다 if (oldVersion == 1 및 newVersion == 2) 그런 다음 데이터베이스를 업데이트하려고합니다 데이터베이스에 더 많은 데이터가 있다면 업데이트가 더 오래 걸릴 수 있습니다 ANR 때문에 일어날 수있다 aviod에 업데이트를 수행하기 위해 AsyncTask를 사용할 것입니다

AsyncTask를 확장 한 UpdateDB 클래스 내부 통과 Void, Void, Void 회원을 구현해 보겠습니다 업데이트를하기 위해 데이터베이스 객체가 필요합니다 그래서, 나는 데이터베이스 객체를 매개 변수로 취하고있다 업데이트를 진행하는 동안 진행률 표시를 보여주고 싶습니다 그래서 AsyncTask의 매개 변수로 컨텍스트를 가져옵니다

내부에서 재정의 onPreExecute 및 onPostExecute 진행 표시 줄 표시 및 숨기기 AsyncTask 내부에 대화 상자 객체 만들기 lateinit var 대화 상자는 AlertDialog 유형입니다 insidePreExecute 안에 AlertDialogBuild가 생성됩니다 customView를 대화 상자 레이아웃으로 설정 마지막으로 create를 호출하고 대화 상자에 스트로 닝하여 빌더에서 대화 상자 객체를 작성합니다 이제 show 메소드를 호출하여 대화 상자를 표시 할 수 있습니다

onPostExecute에서 대화 상자를 숨길 필요가 있습니다 대화 상자가 초기화되었는지 확인한 다음 dialogdismiss를 호출합니다 db와 컨텍스트를 전달하여 여기에 AsyncTask를 호출합니다 여기서 db는 null 일 수 있습니다

그래서 (db! = null) 다음 AsyncTask 호출하면 확인하고 있어요 우리는 여기서 데이터베이스 업데이트를 할 필요가있다 우리는 무효를 돌려 줄 필요가있다 그래서 nullable 무효로 만들고 null을 반환합니다 먼저 열을 추가해야하는 업데이트를 수행합니다

그래서 나는 칼럼을 추가하여 테이블을 변경하고있다 ALTER TABLE "TableName", 여기에 NumberList를 주어야합니다 우리는 열을 추가하여 COLUM을 추가하려고합니다 isOddNumber는 INTEGER 유형입니다 이제 execSQL을 사용하여이 쿼리를 실행해야합니다

이 쿼리를 실행 한 후 테이블에 새로운 열이 생깁니다 그 전에 우리는 모든 데이터를 읽을 필요가 있습니다 val getAllData는 "SELECT * FROM NumberList"와 같습니다 이 쿼리를 rawQuery 메서드를 사용하여 실행하고 queryResult라는 변수에 저장합니다 queryResult를 사용한 후 닫아야합니다

그래서 close를 queryResult에서 호출합니다 여기에서 우리는 queryresult에서 데이터를 읽을 필요가 있습니다 그래서 getAllData에서 코드를 복사하고 여기에 붙여 넣습니다 이제 우리는 테이블에서 모든 데이터를 읽고 결과에 저장합니다 그 후 우리는 테이블을 바꾸고있다

이제 새 열을 업데이트해야합니다 여기 또한 실행 시간을 줄이기 위해 트랜잭션을 사용할 것이다 for 루프를 사용하여 결과 배열을 읽습니다 내부에서 ContentValues ​​만들기 내부에 새롭게 추가 된 열만 넣고 싶습니다 cv

put ( "isOddNumber", 결과 [i] 번호 % 2 == 1) 우리가 명시 적으로주고 싶다면 우리는 이렇게 줄 수 있습니다 result [i] 숫자 % 2 == 1 (잘못 입력 한 경우) 이제이 열을 업데이트하려고합니다 db

update 내부에서 전달해야합니다 테이블 이름, ContenValues, 클래스 및 위치 인수 어디서 클래스 "ID =?" where argument for "arrayOf (result [i] idtoString ())" 모든 데이터를 업데이트 한 후 우리는 트랜잭션을 성공으로 만들어야합니다 db

setTransactionSuccessful () 마지막으로 endTransaction을 호출해야합니다 endTransaction을 호출하지 않으면 트랜잭션이 커밋되지 않습니다 endTransaction을 호출하는 것을 잊지 마세요 dalay를 시뮬레이트하기 위해 스레드를 사용하여 10 초 지연을 설정 중입니다 당신은 여기서 볼 수 있습니다 oldVersion == 1 && newVersion == 2 우리는 UpdateDB를 호출하고 있습니다

그래서 나는 DB_VERSION을 2로 변경하고있다 또한 Number 객체에 isOddNumber를 추가합니다 getAllData에서 테이블에서 isOddNumber를 가져와야합니다 그래서 정수로 isOddNumber를 얻고 그것을 1과 비교합니다 이제 RecyclerView에서이 플래그를 사용해야합니다

우리는 여기서 데이터베이스 만 사용하고 있습니다 AsyncTask 때문에 업데이트하기 전에 데이터베이스를 읽습니다 나는 DBHandler의 객체를 생성하는 것을 피하기 위해 getWritableDatabase라는 더미 함수 호출 어디에서 쓸 수있는 데이터베이스를 반환 할 것인가? 이제 대화 상자는 업데이트를 완료 할 때까지 버튼을 누르는 것을 허용하지 않습니다 이제 응용 프로그램을 시작합니다 당신은 대화 상자를 보여주는 것을 볼 수 있습니다 우리는 지연을 10 초로했습니다

그래서 그 대화 상자를 10 초 동안 보여줍니다 "목록으로 이동"을 클릭하면 홀수와 짝수가 제대로 표시되는지 확인할 수 있습니다 데이터가 데이터베이스에 올바르게 업데이트됨을 의미합니다 이처럼 AsyncTask를 사용하여 데이터베이스를 업데이트 할 수 있습니다 더 많은 버전이 있으면 여기에 "else if"를 추가 할 수 있습니다

oldVersion == 1 && newVersion == 3을 확인할 수있는 곳 이처럼 여러 조건을 가질 수 있으며, 우리는 때때로 업데이트를 할 수 있습니다 이 비디오 녀석들을위한 모든 것 나를 지원하기를 원한다면 patreoncom/CodeAndroid에서 후원자가되어이를 지원할 수 있습니다 너가 좋아하길 바래 내 다음 비디오에서 뵙겠습니다 좋은 하루 되세요

Endless RecyclerView in Android using Android Studio – Kotlin

안녕 얘들 아, CodeAndroid의 Vignesh 이 비디오에서는 Android에서 Endless RecyclerView를 만드는 방법을 보여줍니다

이것은 RecyclerView와 함께 페이지 매김으로도 알려져 있습니다 이것을 증명하기 위해 "EndlessRecyclerView"라는 새로운 프로젝트를 만들고 있습니다 그 동안 에뮬레이터를 실행하고 응용 프로그램을 실행할 준비를 유지합니다 우리는 RecyclerView를 사용할 것입니다 그래서 우리의 의존성에 RecyclerView 라이브러리 추가하기

프로젝트를 동기화합시다 activity_mainxml을 엽니 다 여기에서 루트 레이아웃을 RelativeLayout으로 변경합니다 RecyclerView 추가하기 너비가 "match_parent"이고 높이가 "wrap_content"인 경우 RecyclerView에 대한 id를 recyclerView로 지정하기 처음에는 RecyclerView에 일부 데이터를로드합니다

그런 다음 다음 페이지 데이터를 가져 오기위한 API 호출을 호출합니다 그 때 우리는 진행률 표시 줄을 보여주고 싶습니다 따라서 ProgressBar의 너비를 "match_parent"로, 높이를 48dp로 추가하십시오 ProgressBar의 id를 "progressBar"로 지정 ProgressBar가 RecyclerView 아래에 있어야합니다 그래서 이것을 세로 형 LinearLayout 내부에 배치했습니다

이제 ProgressBar가 RecyclerView 아래에 정렬됩니다 RecyclerView 높이가 화면 높이와 같거나 클 때 progressBar가 사용자에게 표시되지 않습니다 그래서이 LinearLayout을 ScrollView로 감싸고 있습니다 죄송합니다 루트 RecyclerView가 필요 없습니다

그래서 나는 루트 레이아웃을 ScrollView로 변경하고 내부 레이아웃을 제거하려고합니다 우리는 레이아웃을 완료했습니다 "MainActivitykt"열기 RecyclerView 용 어댑터가 필요합니다 그래서 NumberAdapter라는 클래스를 생성합니다

RecyclerViewAdapter를 확장합니다 내부에서 ViewHolder를 전달해야합니다 NumberViewHolder라는 클래스를 생성합니다 RecyclerView

ViewHolder를 확장합니다 내부에서 인수를보기로 전달해야합니다 그래서 뷰를 클래스의 매개 변수로 추가합니다 이제 어댑터의 ViewHolder로 전달할 수 있습니다 누락 된 회원을 구현해 보겠습니다

onCreateViewHolder에서 ViewHolder 객체를 반환해야합니다 레이아웃 파일이 필요하다는 것을 만들려면 그래서 새로운 Resource 파일을 만들고 TextView처럼 루트 요소를 변경하십시오 파일 이름을 rv_child_number로 지정합니다 TextView 내부에서는 태그를 추가하지 않을 것입니다 그래서 같은 줄에 TextView를 끝내고 있습니다

TextView 높이를 "wrap_content"로 변경하고 여백을 16dp로 추가 마지막으로 id를 "tv_number" 뷰를 전달할 NumberViewHolder 내부를 반환합니다 그래서 LayoutInflater를 사용하여 rv_child_number 레이아웃을 팽창시키고 그것을 전달합니다 getItemCount에서 RecyclerView 크기를 반환해야합니다 그래서 문자열 목록을 저장하기 위해 numberList라는 전역 변수를 생성합니다 여기서는 activity 객체를 사용하여 목록에 액세스하고 크기를 반환합니다

NumberViewHolder 안에 TextView 객체를 추가해야합니다 그것을 tv_number에 연결해야하는 내부 onBindViewHolder 안에 tvNumber 텍스트를 다음과 같이 설정합니다 numberList의 첫 번째 항목 페이지 매김의 경우 페이지 번호가 필요합니다 기본적으로 나는 그것을 초기화하고있다 통신이 일어나고 있는지 여부를 확인하기 위해 isLoading이라는 플래그를 추가합니다

또한 한 페이지를 가져올 레코드의 수를 알려주는 limit가 필요합니다 스크롤을하는 동안 어댑터 및 layoutManager에 액세스해야합니다 그래서 나는 그 객체를 전역 변수로 만들고있다 layoutManager를 초기화하고 이것을 recyclerView의 layoutManager로 설정하십시오 네트워크 통신 조롱을 위해 getPage라는 함수 생성하기 내부가 numberList에 내용을 추가합니다

처음에는 0을 시작으로하고 싶습니다 페이지 -1에 한계를 곱하십시오 페이지에 한도를 곱하여 끝내기 시작과 끝 사이의 for 루프 실행 접두사가 "Item"인 numberList에 항목을 추가하면 Handler ()를 사용하여 5 초 지연 추가 어댑터가 초기화되었는지 여부를 확인하는 내부 초기화 된 경우 어댑터 객체에서 notifyDataSetChanged를 호출합니다 그렇지 않으면 어댑터 객체를 초기화합니다 그리고 그것을 recyclerView 용 어댑터로 설정하십시오

onCreate에서이 getPage ()를 호출합니다 이제 응용 프로그램을 시작합니다 앱을로드하는 동안 우리는 recyclerView에 대한 데이터가 없다는 것을 알 수 있습니다 5 초 후에 데이터가 recyclerView에 추가됩니다 progressBar가 연결이 발생할 때만 표시되기를 원합니다

VisPage 내부에서 VISIBLE로 표시되도록 가시성을 GONE으로 만드는 어댑터를 새로 고친 다음 이제 페이지 매김에 대해 알게 될 것입니다 recyclerView의 스크롤을 들으려면 OnScrollListener를 추가해야합니다 내부에서 RecyclerView 객체를 전달해야합니다 OnScrollListener OnScrolled라는 메서드 재정의 if (dy> 0) 즉, recyclerView가 세로로 스크롤 된 것을 의미합니다 내부 우리는 우리가 recycler의 바닥에 도달 한 날씨를 확인해야합니다

그렇게하기 위해서는 화면에 몇 개의 항목이 있는지 알아야합니다 최고 항목 위치 란 무엇입니까? 및 recyclerView 크기 layoutManager의 childCount를 사용하여 항목 수 표시하기 visibleItemCount라는 변수에 저장합니다 최상위 항목 위치 가져 오기 사용하기 findFirstCompletlyVisibleItemPosition을 pastVisibleItem이라는 변수에 저장합니다 마지막으로 어댑터에서 recyclerView 크기 가져 오기 total이라는 변수에 저장 isLoading이 false 인 경우 다음 페이지 데이터를 가져올 수 있습니다 내부 우리는 우리가 바닥에 도달했는지 여부를 확인해야합니다

visibleItemCount + pastVisibleItem이 total보다 크거나 같으면 그것이 사실이라면 우리는 바닥에 도달했습니다 그러면 다음 페이지 데이터를 얻을 수 있습니다 나는 한 페이지 수를 증가시키고 getPage를 호출한다 getPage 내부에서 isLoading을 true로 설정 처음에는 이 경우 네트워크 호출 후 5 초로 isLoading을 false로 만듭니다 이제 응용 프로그램을 시작합니다

처음 10 개 항목이 isLoading이고 progressBar가 진행되는 것을 볼 수 있습니다 하지만 다음 페이지를 호출하지 않습니다 왜냐하면 우리는 dy> 0을 주었기 때문입니다 여기서 스크롤은 일어나지 않습니다 그래서 우리는 계속 0으로 항상 염색합니다

이것이 우리가 두 번째 페이지 데이터를 얻지 못하는 이유입니다 그래서 나는 dy 상태를 언급하고있다 이제 응용 프로그램을 시작합니다 우리는 첫 번째 페이지 데이터를 얻고 있습니다 5 초 후 두 번째 페이지 데이터가 표시됩니다

우리가 recyclerView를 스크롤하여 아래쪽에 도달하면 다음 페이지 데이터를 가져 오는 중입니다 이와 같이 사용자가 recyclerView의 맨 아래에 도달하면 더 많은 데이터를로드 할 수 있습니다 이 비디오 녀석을위한 전부입니다 나를지지하고 싶다면 wwwpatreon

com/codeandroid에서 후원자가되어 당신을 도울 수 있습니다 너가 좋아하길 바래 내 다음 비디오에서 뵙겠습니다 좋은 하루 되세요

Android Toast Tutorial With Example | Kotlin | FineStack |

안녕하세요, FineStack에 오신 것을 환영합니다 오늘, 나는 간단한 안드로이드 응용 프로그램을 만들 예정입니다

그러면 화면에 토스트 메시지가 표시됩니다 이제 응용 프로그램을 만듭니다 나는이 비디오에서 코 틀린을 사용할 것이다 이제 레이아웃을 빠르게 만들자 사용자가 무엇을 입력 하든지 그냥 인쇄 할 것입니다

그래서 우리는 일반 텍스트보기와 버튼이 필요합니다 두보기의 ID를 변경합니다 이제 응용 프로그램을 작성해 보겠습니다 나는 사용자가 버튼을 누를 때마다 사용자의 메시지를 출력 할 것이다 버튼의 클릭 리스너 기능을 설정해 보겠습니다

리스너에서 Toast를 만들어 변수에 저장해야합니다 왜냐하면 우리는 show 함수를 호출해야하기 때문입니다 ToastmakeText () 함수에서 세 개의 매개 변수를 전달해야합니다 먼저 컨텍스트

둘째, 화면에 나타날 문자열입니다 그리고 마지막으로, 기간 길이를 짧게 또는 길게 선택해야합니다 다른 기간은 설정할 수 없습니다 이제 우리는 우리의 토스트가 있습니다

show () 함수를 호출 해 봅시다 자, 코드가 실행되고있는 것을 볼 수 있습니다 그러나 사용자가 메시지를 제공하지 않고 버튼을 누르면 그런 다음 빈 토스트를 인쇄합니다 우리는 그것을 원하지 않는다 그래서 우리는 조건 연산자가 필요합니다

일반 텍스트보기에 텍스트가있는 경우 그런 다음 메시지를 인쇄합니다 그렇지 않으면 버튼이 아무 것도하지 않습니다 자, 볼 수 있듯이 버튼이 작동하지 않습니다 왜냐하면 우리는 텍스트를주지 않았기 때문입니다 텍스트를주고 나면 메시지를 인쇄합니다

끝까지이 비디오를 시청 해 주셔서 감사합니다 이 비디오가 마음에 들면, 같은 버튼을 클릭하십시오 질문이 있으면 주저하지 말고 아래에 의견을 남기십시오 그리고 우리 채널을 구독하면 더 많은 비디오를 얻을 수 있습니다 나는 다음 비디오에서 너를 볼거야

Drag and Drop RecyclerView in Android using Android Studio – Kotlin

얘들 아 CodeAndroid의 Vignesh입니다

이 비디오에서는 항목 RecyclerView를 끌어다 놓는 방법을 보여줍니다 이것을 설명하기 위해 ToDo List Application 코드를 사용하려고합니다 하위 작업 내에서 하위 작업 순서를 지정하는 아이콘이 필요합니다 항목 작업 열기, 여기서는 RecyclerView를위한 touchHelper를 설정하려고합니다 우리가 항목을 드래그 앤 드롭 할 수있게 해줍니다 나중에 이미지 뷰를 추가합니다

val touchHelper가 ItemTouchHelper와 같으면 콜백을 전달해야합니다 ItemTouchHelper의 객체, 우리는 SimpleCallback을 사용할 것입니다 내부에서 dragDirection과 swipeDirection을 전달해야합니다 항목을 위아래로 이동할 수 있습니다 그래서 ItemTouchHelper

UP 또는 ItemTouchHelperDOWN을 제공하고 있습니다 따라서 항목을 이동할 수있는 방법 swipeDirection의 경우 항목을 스 와이프 할 수 없음을 의미하는 0을 제공합니다 누락 된 회원을 구현해 보겠습니다 이 onSwiped는 swipeDirection을 0으로 지정했기 때문에 호출되지 않습니다

항목을 드래그하는 동안이 onMove가 호출됩니다 여기에서 우리는 아이템을 교환해야합니다 그래서 p1에서 소스 어댑터 위치를 얻고 있습니다 sourcePosition이라는 값에 저장 마찬가지로 p2 ViewHolder에서 targetPosition 가져 오기 이제 RecyclerView 목록의 항목을 바꿔야합니다 이를 위해 우리는 목록에 액세스해야합니다

그래서 RecyclerView 데이터를 저장하기 위해 list라는 전역 값을 생성합니다 전역 변수에 목록을 저장하고 어댑터에 전달하는 refreshList에 "Collections"클래스를 사용하여 sourcePosition을 사용하여 목록의 항목을 targetPosition으로 교체합니다 스와핑은 Collections 클래스 자체에서 수행됩니다 그래서 우리는 아무것도 처리 할 필요가 없습니다 항목을 교환 한 후 어댑터에 대한 변경 사항을 알릴 필요가 있습니다

그래서 나는 어댑터를 전역 변수에 저장하고있다 전역 변수를 RecyclerView의 어댑터로 설정하기 notifyItemMoved를 호출 할 필요가있는 것을 통지하기 위해서 내부에서 sourcePosition과 targetPosition을 전달해야합니다 이 onMove는 Boolean을 반환해야하므로 true를 반환합니다 마지막으로 attachToRecyclerView를 사용하여 RecyclerView에 touchHelper를 연결합니다 자, 응용 프로그램을 시작합니다

이제는 길게 눌러 작업을 이동할 수 있습니다 길게 누르지 않으려면 아이콘을 줄 수 있습니다 해당 사용자를 사용하면 쉽게 항목을 이동할 수 있습니다 그것을하는 방법을 볼 수 있습니다 아이콘 소스의 경우 드로어 블 폴더 안에있는 이동 아이콘을 복사하고 있습니다

item 자식의 레이아웃 파일에서 ImageView를 추가해야합니다 그래서 ImageView 삭제를 복제하고 있습니다 소스를 ic_move로 변경하고 id를 iv_move로 변경하십시오 이동 아이콘 전에 삭제 아이콘을 원합니다 그래서 toLeftOf와 toStartOf를 iv_move로 추가합니다 우리는 이것을 ViewHolder 내부에 링크해야한다

그 후 이동 아이콘에 대한 onTouchListener actionMasked 이벤트가 ACTION_DOWN과 같으면 드래그를 시작해야합니다 touchHelper에 액세스해야합니다 그래서이 touchHelper를 전역 변수로 변환하려고합니다 여기서 우리는 null 경고를 얻고 있으므로 null-safety를 추가합니다 null이 아닌 경우 RecyclerView에 연결하고, 그렇지 않으면 아무것도하지 않습니다

ViewHolper를 전달하여 드래그를 시작하는 touchHelper 사용 여기서도 리턴 유형으로 부울이 필요합니다 그러나 여기 나는 거짓을 전달하고있다 자, 응용 프로그램을 시작합니다 길게 누르지 않아도 항목을 이동할 수있는 항목을 볼 수 있습니다 이 재정렬은 로컬에 저장됩니다

활동을 다시 불러 오면 준비가 끝납니다 배열을 유지하려면 서버 또는 데이터베이스에 순서를 저장해야합니다 이 비디오 녀석들을위한 모든 것 나를 지원하기 원한다면 wwwpatreoncom/CodeAndroid에서 애호가가되어 그렇게 할 수 있습니다

너가 좋아하길 바래 내 다음 비디오에서 보자 좋은 하루 되세요