반응형

VMware 실행 시 오류가 발생하면서 실행을 못하는 문제가 발생했습니다.

처음에는 lock 파일 문제인 줄 알고 모두 삭제 후 재 실행해도 오류가 계속 발생했습니다.

오류 메시지 하단 링크를 클릭하니까 해결 방법이 있습니다.

오류 메시지 링크를 클릭해주세요.

"VMware Workstation and Device/Credential Guard are not compatible" error in VMware Workstation on Windows 10 host (2146361)

Device 오류를 해결하기 위해서는 두 가지만 해주면 됩니다.

첫 번째 "제어판" -> " 프로그램 및 기능" -> "Windows 기능 켜기/끄기"를 선택해주세요.

아래쪽에 있는 Hyper-V를 모두 언체크 해주세요.

그리고 재부팅 메시지가 발생하면 취소를 클릭해주세요. 아직 한 가지를 더 실행해야 합니다.

두 번째는 "cmd"를 관리자 권한으로 실행해주세요.

“bcdedit /set hypervisorlaunchtype off” 입력 후 정상적으로 실행되면 재부팅해주십시오.

재부팅 후 정상적으로 VMware가 동작하는 것을 확인할 수 있습니다.

감사합니다.

반응형
반응형

앱 프로그램이 인기가 높아지면거 1인 개발자들이 많아지고 있습니다.

앱에서 가장 중요한 부분은 디자인입니다.

하지만 디자인은 일반적으로 고정된 상태로만 확인 할 수 있어 전체 앱 컨셉(Concept)를 한눈에 확인할 수 없습니다.

오늘은 앱 디자인과 동시에 전체 흐름을 확인할 수 있는 무료 프로그램을 알아보겠습니다.

안드로이드, 아이폰 등 다양한 디바이스를 디자인할 수 있는 MARVEL 앱 사이트입니다.

Marvel - The design platform for digital products. Get started for free. (marvelapp.com)

 

Marvel - The design platform for digital products. Get started for free.

Try Marvel Enterprise for large teams - Design, test and ship amazing products at scale

marvelapp.com

MARVEL은 간단한 스케치를 대화식으로 표시가 가능합니다.

디자인된 앱은 다른 사람과 데모로 공유도 가능합니다.

연결된 링크를 클릭하면 MARVEL 홈페이지로 이동합니다.

회원 가입은 구글 연동을 이용해서 가입하시면 됩니다.

쉽게 가입할 수 있어 부담 없이 사용이 가능합니다.

메인 화면은 매우 심플합니다.

상단 우측에 있는 "Crete Project" 버튼을 클릭하면 앱 디자인 프로젝트를 생성할 수 있습니다.

"Prototype", "User Test" 2가지 항목으로 선택할 수 있습니다.

"Prototype"은 앱 디자인 툴을 이용해서 디자인할 수 있습니다.

"User Test"는 생성된 디자인을 사용자와 공유할 수 있습니다.

MARVEL은 기본은 무료로 사용이 가능합니다.

아쉬운 점은 프로젝트, 테스트를 1개만 생성할 수 있습니다.

기능에 제한은 없고 프로젝트 생성과 테스트에 제한이 있습니다.

그래도 1개만 사용해도 처음 사용자는 충분하게 테스트가 가능합니다.

 

프로젝트를 생성하면 이름과 타입을 선택해야 합니다.

타입은 다양한 디바이스 크기를 선택할 수 있습니다.

상단 우측에 있는 디자인 버튼을 사용해서 프로젝트를 디자인할 수 있습니다.

디자인 화면은 우측에 Tool 박스가 있고, 좌측에는 디자인 정보를 확인할 수 있습니다.

디자인 타입도 안드로이드, 아이폰, 아이패드 등 다양한 선택이 가능합니다.

Tool 박스에서 아이템을 선택하면 자동으로 디자인 화면에 생성됩니다.

디자인이 완료되면 실행을 이용해서 전체 구성을 확인할 수 있습니다.

MARVEL 무료 사용 앱이지만, 기본 기능을 모두 사용할 수 있어 처음 사용하기 매우 좋다고 생각됩니다.

처음 앱을 개발하는 분이 그렇게 많은 프로젝트를 생성할 필요도 없기 때문에 1개의 프로젝트만 사용 가능하다면 적극 추천드립니다.

감사합니다.

반응형
반응형

티스토리를 4년 정도 운영 중입니다.

정말 열심히 운영한 건 아니지만 그래도 조금씩 블로그를 작성했지만, 방문자가 점점 줄어드는 것을 확인했습니다.

처음에는 열심히 안 해서 그런가 했는데, 요즘 아무리 열심히 해도 글이 검색이 안됩니다.

그래서 검색을 시작했습니다.

"티스토리 최적화 방법" 뭐 다른 방법이 있는 건가?

그래서 알게 된 내용은 충격적입니다.

티스토리 최적화의 기본은 daum 검색에서 주소를 치면 알 수 있다고 했습니다.

'헉' 역시 검색이 안됩니다.

처음부터 최적화가 안된 티스토리 블로그에 글을 쓰니까 검색아 안되나 봅니다.

그래서 최적화의 기본인 daum 검색에서 검색될 수 있도록 티스토리 블로그 주소를 등록하는 방법을 알아보겠습니다.

daum 검색에 등록하기 위해서는 먼저 daum 홈페이지 하단에 잇는 고객센터를 클릭해주세요.

고객센터를 클릭하면 다양한 화면이 보이는데, 그중에서 검색을 클릭해주세요.

검색을 클릭하면 다시 여러 개의 카테고리를 확인할 수 있습니다.

검색 결과 미노출 메뉴를 클릭해주세요.

검색결과 미노출에서 세 번째 내용 "원하는 사이트가 검색 결과에 나오지 않아요"을 클릭해주세요.

1번 아래쪽에 있는 "검색등록 바로가기"를 클릭해주세요.

신규등록이기 때문에 티스토리 블로그 주소를 URL에 등록합니다.

신규 등록에 따른 서비스 이용 동의 항목을 모두 체크해주세요.

검색등록에 필요한 제목, URL, 설명, 설명, 품목, 신청자 정보를 입력하고 "확인" 버튼을 클릭해주세요.

정상적으로 등록하면 메일에 신규등록 내용을 확인할 수 있습니다.

등록 후 하루 만에 결과가 나왔습니다.

결과는 등록 실패입니다.

홍보성 글이 많다고 등록이 안된다고 합니다.

짜집기에 스팸성이라고 하는데 그런 내용은 없는데 너무 이상하네요.

구글에서 검색을 해보니 많은 분들이 같은 사유로 등록이 불가능하다고 합니다.

결론적으로 다음 검색 등록은 처음 사이트를 만들고 바로 등록하는 걸 추천드립니다.

혹시 해결 방법이 생기면 다시 포스팅하겠습니다.

감사합니다.

반응형
반응형

코틀린이나 자바로 클래스를 정의할 경우 클래스 내부에 클래스를 다시 정의해야 하는 경우가 있습니다.

코틀린은 자바와 동일하게 최상위 클래스 내부에 클래스를 다시 배치할 수 있는 중첩 클래스(neted class)를 지원합니다.

중첩 클래스(neted class)

class nested{
    private val value:Int = 0

    class In{
        fun foo() = 7
    }
}

클래스 내부에 함수를 다른 클래스에 정의해서 접근할 수 있습니다.

nested class 내부에 In class를 정의하고 foo 메서드를 사용해서 멤버에 접근이 가능합니다.

nested.In().foo() 메서드를 사용해서 멤버 정보를 출력할 수 있습니다.

출력 결과 멤버에 저장된 7을 출력하게 됩니다.

중첩 클래스(neted class)에서 최상위 클래스에 정의된 인스턴스 변수나 메서드에 직접 접근이 불가능합니다.

중첩된 내부 클래스를 사용해서 객체 참조가 가능합니다.

class nested{
    private val value:Int = 0

    class In{
        fun foo() = 7
    }

    inner class innerIn{
        fun foo2() = 20
    }
}

코틀린(Kotlin) 중첩 클래스(neted class)에서 내부 클래스를 직접 접근하기 위해서는 inner 한정자를 사용해서 클래스를 정의하면 됩니다.

innerIn class는 inner로 정의 되었기 때문에 직접 foo2 메서드에 접근이 가능합니다.

nested를 선언하고 innerIn class에 직접 접근할 수 있습니다.

출력 결과 foo2 메서드에서 설정한 20을 확인할 수 있습니다.

중첩 클래스(neted class)는 내부 클래스를 직접 참조하거나, 간접적으로 참조할 수 있는 구조로 정의가 가능합니다.

Outer 클래스의 인스턴스를 먼저 만들어서 Inner 클래스를 접근하게 되면 모든 Outer 클래스를 멤버를 참조할 수 있어 하나의 인스턴스처럼 사용이 가능합니다.

감사합니다.

 

 

반응형
반응형

코틀린에서는 선언된 모든 하위 클래스를 확인할 수 있는 봉인 클래스(Sealed Class)가 있습니다.

봉인 클래스를 사용하면 상속 계층을 보호하면서 클래스를 정의할 수 있습니다.

봉인 클래스(Sealed Class)는 코틀린 1.1 이전 버전에서는 봉인 클래스를 내부에 정의했지만 1.1 버전부터는

봉인 클래스가 있는 파일 안에서 하위 클래스를 정의할 수 있게 되었습니다.

봉인 클래스가 하위에 정의되기 때문에 모든 하위 클래스를 한눈에 확인할 수 있습니다.

 

봉인 클래스(Sealed Class)

sealed class Mammal(val name:String)
class Cat(val catName: String) : Mammal(catName)
class Dog(val dogName:String) : Mammal(dogName)
class Human(val humanName:String, val job: String) : Mammal(humanName)

봉인 클래스(Sealed Class)를 선언하기 위해서는 sealed 한정자를 사용해서 선언하면 됩니다.

하위 클래스는 Mammal을 상속받아 접근이 가능합니다.

즉, 하위 클래스만 확장이 가능하고 개방이 안될 경우 다른 파일에서 사용이 불가능합니다.

개방은 조금 아래에서 확인해보겠습니다.

    fun greetMammal( mammal: Mammal) : String{
        when(mammal){
            is Cat -> return "안녕 고양이 ${mammal.name}"
            is Dog -> return "안녕 강아지 ${mammal.name}"
            is Human -> return "안녕 ${mammal.name} == 직업은 ${mammal.job}"
        }
    }
    
    Log.d(TAG,"-------- Sealed Classes ---------")

    Log.d(TAG, greetMammal(Cat("야옹이")))
        
    Log.d(TAG,"-------- Sealed END ---------")

greetMammal 함수를 사용해서 선언한 클래스를 when 제어문을 사용해서 확인할 수 있습니다.

Logcat View에서 봉인 클래스(Sealed Class) 출력 정보를 확인할 수 있습니다.

sealed class Mammal(val name:String)
class Cat(val catName: String) : Mammal(catName)
class Dog(val dogName:String) : Mammal(dogName)
class Human(val humanName:String, val job: String) : Mammal(humanName)

class Dog2: Cat("ddd")

봉인 클래스(Sealed Class)를 상속받은 클래스를 일반 클래스에서 상속받게 되면 봉인되어 있어 상속이 불가능합니다.

class Dog2에서 Cat class를 상속받으면 에러가 발생하는 것을 확인할 수 있습니다.

sealed class Mammal(val name:String)
open class Cat(val catName: String) : Mammal(catName)
class Dog(val dogName:String) : Mammal(dogName)
class Human(val humanName:String, val job: String) : Mammal(humanName)

class Dog2: Cat("ddd")

코틀린(Kotlin) 봉인 클래스(Sealed Class)를 다른 파일에서 사용하기 위해서는 open 한정자를 사용해서 개방을 해야 합니다.

Cat class를 개방하면 오류 없이 정상적으로 컴파일됩니다.

 

봉인 클래스(Sealed Class) 적용 사례

코틀린(Kotlin) 봉인 클래스(Sealed Class)는 상속 계층을 보호하는 기능이 가장 큰 특징이지만

링크 리스트나 이진트리 같은 데이터 형식 정의에 적용하면 데이터 상속에 따른 오류를 최소화할 수 있습니다.

또한 특정 클래스를 확장하지 못하게 하면서 특정 모듈에 API를 보호하면서 개발할 수 있습니다.

감사합니다.

play.kotlinlang.org/byExample/03_special_classes/03_Sealed%20Classes

 

Kotlin Playground: Edit, Run, Share Kotlin Code Online

 

play.kotlinlang.org

 

반응형
반응형

코틀린에서 개발 시 상수를 열거해야 하는 경우가 있습니다.

코틀린이나 JAVA에서는 상수를 열거하기 위해서

열거형 클래스(Enum Class)를 사용할 수 있습니다.

열거형 클래스(Enum Class) 사용하면 상수를 집합으로 관리할 수 있어 코드에 가독성이 높아집니다.

코틀린 열거형 클래스(Enum Class) 사용하기 위해서는 "enum class"로 선언됩니다.

순차적으로 적용되기 때문에 원하는 상수를 입력하면 됩니다.

enum class State{
    IDLE,
    RUNNING,
    FINISHED
}

fun enumprint(){
      val selecteditem = State.valueOf("IDLE")
      Log.d(TAG, (selecteditem == State.RUNNING).toString())
}

코틀린 열거형 클래스(Enum Class)는 자바와 동일하게 vlaueOf 메소드를 사용해서 열거형을 확인할 수 있습니다.

코드 실행 결과 "selecteditem"에 저장된 "IDLE" 열거형과 "State.RUNNING" 열거형이 다른 것을 확인할 수 있습니다.

상수 집합을 간단하게 사용할 수 있어 열거형 클래스(Enum Class)는 다양한 데이터 집합에 꼭 필요한 요소입니다.

    fun enumprint2()
    {
        for( state in State.values()){
            Log.d(TAG, "${state.name} == ${state.ordinal}")
        }
    }

열거형 클래스(Enum Class) 일반적으로 "values" 메소드를 사용해서 전체 열거형을 확인할 수 있습니다.

"name", "ordinal"을 사용해서 이름과 선언 값을 확인할 수 있습니다.

출력 결과 순차적으로 출력된 내용을 확인할 수 있습니다.

  fun enumprint3()
    {
        for( state in enumValues<State>())
        {
            Log.d(TAG, "enumValues : ${state.name} == ${state.ordinal}")
        }
    }

코틀린 열거형 클래스(Enum Class)는 도우미 메소드 enumValueOf를 이용해서도 열거형 클래스를 확인할 수 있습니다.

"enumValues"를 사용 후 열거형 클래스를 선언하면 전체 열거형 클래스를 for문으로 확인 가능합니다.

출력 결과 values 메소드를 사용한 결과와 동일한 내용을 확인할 수 있습니다.

코틀린(kotlin) 열거형 클래스(Enum Class)는 상수를 맞춤형 데이터로 연결할 수 있습니다.

일반적으로 선언할 경우 0번에서 부터 순차적으로 선언되지만, 별도 상수를 선언이 가능합니다.

코틀린 열거형 클래스(Enum Class) 선언 후 fun 별도 함수를 하나 추가했습니다.

enum class Color(val rgb: Int){
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF),
    YELLOW( 0xFFFF00);

    fun containsRed() = (this.rgb and 0xFF000 != 0)
}

fun enumprint4()
{
    val red = Color.RED
    Log.d(TAG, red.toString())
    Log.d(TAG, red.containsRed().toString())
    Log.d(TAG, Color.BLUE.containsRed().toString())
}

fun 함수는 열거형에 선언된 HEX 값을 확인하여 참, 거짓으로 리턴합니다.

red.containRed() 메서드를 실행하면 RED 값과 조건식이 맞기 때문에 참으로 출력됩니다.

반면 Color.BLUE.contatinsRed() 메서드를 선언하면 RED가 아니기 때문에 거짓을 리턴합니다.

코틀린(kotlin) 열거형 클래스(Enum Class) 집합된 상수를 사용할 수 있어 가독성이 떨어지는 Int형보다 편리하게 사용할 수 있는 클래스입니다.

다양한 열거형을 클래스 내부에서 사용하게 되면 가독성을 더욱더 높일 수 있습니다.

감사합니다.

play.kotlinlang.org/byExample/03_special_classes/02_Enum

 

Kotlin Playground: Edit, Run, Share Kotlin Code Online

 

play.kotlinlang.org

 

반응형
반응형

코틀린은 다양한 Class를 사용해서 가독성 높게 개발할 수 있습니다.

오늘은 데이터(Data)를 쉽게 사용할 수 있는 데이터 클래스(Data Class)를 알아보겠습니다.

서버에서 사용하는 데이터를 가져와서 저장하기 위해서 많이 사용되는 클래스입니다.

데이터 클래스(Data Class)는 애플리케이션 데이터 모델의 주요 구성요소입니다.

코틀린(Kotlin)에서는 클래스에 사용되는 속성에 게터, 세터가 지정됩니다.

var을 선언할 경우 읽기 쓰기 속성이기 때문에, 게터, 세터 모두 정의됩니다.

val을 선언할 경우는 읽기 속성만 있는 게터만 적용됩니다.

코틀린 데이터 클래스(Data Class)

데이터 클래스(Data Class)는 데이터의 무결성을 유지하기 위해서 val을 많이 사용합니다.

구조는 "data class"로 되어 있습니다.

class name을 지정하고 기본 인자를 선언하면 됩니다.

data class Book(val title:String, val price:Int, val type:Int)

Book 데이터 클래스는 val로 모두 선언되어 있어 직접 변경이 불가능합니다.

Book 데이터 클래스를 사용하기 위해서 다양한 함수를 적용했습니다.

fun books(){

        val book = Book("Kotlin", 20000, 1)

        Log.d(TAG, book.toString())

        val secondBook = Book("C#", 15000, 3)
        val thirdBook = Book("JAVA", 25000, 4)

        Log.d(TAG, book.hashCode().toString())
        Log.d(TAG, secondBook.hashCode().toString())
        Log.d(TAG, thirdBook.hashCode().toString())

        Log.d(TAG, book.copy().toString())
        Log.d(TAG,book.copy("Kotlin copy second").toString())
        Log.d(TAG,book.copy(price = 40000).toString())

        Log.d(TAG, secondBook.component1())
        Log.d(TAG, secondBook.component2().toString())
        Log.d(TAG, secondBook.component3().toString())

    }

클래스 선언은 JAVA와 다르게 new 없이 바로 선언하면 됩니다.

BOOK 클래스 타입을 확인하기 위해서. toString() 함수를 사용하면 모든 인수를 확인할 수 있습니다.

데이터 클래스는 두 인스턴스의 구조적 동등성을 비교하기 위해서 hashCode() 함수를 사용합니다.

hashCode() 함수를 사용할 경우 클래스 형식을 확인할 수 있습니다.

코틀린(Kotlin) 데이터 클래스(Data Class)는 직접 인수를 변경할 수 없기 때문에 copy() 함수를 사용해서 각 인수를 변경할 수 있습니다.

함수를 사용하기 위해서 MainActivity에 books() 함수를 호출했습니다.

데이터 클래스(Data Class) 인수를 확인하기 위해서는 component+번호() 함수를 사용할 수 있습니다.

데이터 클래스(Data Class) 인수에 따라서 함수가 순차적으로 변경됩니다.

함수 뒤에 자료형도 확인이 가능합니다.

모든 자료형은 .toString() 함수를 출력이 가능합니다.

Log View에서 출력된 데이터 클래스(Data Class) 정보를 확인할 수 있습니다.

.toString() 함수를 사용해서 인스턴스를 바로 확인할 수 있습니다.

HashCode() 함수를 사용하면 데이터 클래스의 Hash 값을 확인할 수 있습니다.

copy() 함수를 사용하면 인수를 변경할 수 있습니다.

코틀린(Kotlin) 데이터 클래스(Data Class)는 데이터 자료형을 프로그램에서 편리하게 사용할 수 있게 도와주는 매우 좋은 클래스입니다.

코틀린 파일을 따로 생성해서 데이터 클래스를 정의하면 더욱더 편리하게 사용할 수 있습니다.

감사합니다.

play.kotlinlang.org/byExample/03_special_classes/01_Data%20classes

 

Kotlin Playground: Edit, Run, Share Kotlin Code Online

 

play.kotlinlang.org

 

반응형
반응형

오늘은 Android에서 디버깅 로그 사용법을 알아보겠습니다.

디버깅 로그는 Print() 함수와 동일하게 cmd에 출력하는 구조입니다.

Android를 개발할 경우 코드를 확인하기 위해서 Toast를 많이 사용합니다.

하지만 Toast 메시지 함수는 많은 이벤트에서 사용하기 매우 불편한합니다.

Android에서 코트린을 사용해서 디버깅을 출력하기 위해서는 먼저 Logcat View를 활성화해야 합니다.

android Studio 하단에서 Logcat 탭을 클릭하면 컴파일 시 모든 내용을 확인할 수 있습니다.

로그를 출력할 경우 Logcat View 내용이 출력됩니다.

Android Kotlin Log CODE

기본적으로 로그를 사용하기 위해서는 "import android.util.Log"를 포함해야 합니다.

Log 함수는 TAG 값을 기준으로 메시지를 추가할 수 있습니다.

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val TAG:String = "MainActivity : "

        Log.d(TAG, "Log ----- START")
        Log.d(TAG, "Log ----- INSERT")
        Log.d(TAG, "Log ----- END")

}

TAG를 String 변수로 초기화 해주세요.

이후 Log를 추가하고 싶은 라인에 Log.d(TAG, 메시지)를 추가하면 됩니다.

Log는 Debug, Info, Error, VERBOSE 등 다양한 타입으로 출력이 가능합니다.

컴파일을 진행하면 Log를 Logcat View에서 확인할 수 있습니다.

Log 정보를 타입에 따라서 잘 사용하면 오류가 발생할 경우 쉽게 원인을 파악할 수 있습니다.

감사합니다.

developer.android.com/reference/kotlin/android/util/Log

 

Log  |  Android 개발자  |  Android Developers

 

developer.android.com

 

반응형
반응형

오늘은 코틀린 언어를 사용해서 Android에 설치된 모든 앱을 확인할 수 있는 프로그램을 만들어 보겠습니다.

코틀린(Kotlin)을 사용해서 설치된 안드로이드 앱을 확인하기 위해서는 많은 정보를 한눈에 확인할 수 있는 ListView를 사용하겠습니다.

안드로이드 ListView는 다양한 형태로 커스텀이 가능한 장점이 있습니다.

설치된 앱 이름과 아이콘을 ListView에 출력할 수 있는 구조로 만들어 보겠습니다.

먼저 ListView에 Item을 저장하기 위해서 새 파일 메뉴에서 kt class를 생성합니다.

item class에 String 변수 name과 Drawable 변수 image를 선언합니다.

package com.example.appcheck

import android.graphics.drawable.Drawable

class item ( val name : String,  val image : Drawable )

코틀린에서 class를 만드는 방법은 다양하지만, 쉽게 사용할 수 있는 생성자 초기화를 사용했습니다.

함수가 필요할 경우 "{, }"를 사용해서 선언하면 됩니다.

생성된 item class를 UI와 연동하기 위해서 layout 파일이 필요합니다.

신규 파일에서 layout을 선택하고 "main_lv_item.xml"을 생성해주세요.

main_lv_item.xml 파일에서 LinearLayout 하단에 item과 매핑할 수 있는 ImageView, TextView를 한 개씩 선언합니다.

가장 중요한 내용은 위치를 잡기 위해서 app:layout_constraintStart_toEndOf, app:layout_constraintTop_toTopOf에ImageView id인 AppImg로 설정해주세요.

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

    <ImageView
            android:id="@+id/AppImg"
            android:layout_width="52dp"
            android:layout_height="52dp"
            android:layout_marginBottom="4dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="4dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@mipmap/ic_launcher_round" />

    <TextView
            android:id="@+id/processname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:textSize="20sp"
            android:textStyle="bold"
            app:layout_constraintStart_toEndOf="@+id/AppImg"
            app:layout_constraintTop_toTopOf="@+id/AppImg"
            />
</LinearLayout>

class, layout이 설정되면 activity_main.xml에 ListView를 선언해주십시오.

ListView 사용법은 아래 링크를 참고해주세요.

developer.android.com/reference/android/widget/ListView

 

ListView  |  Android 개발자  |  Android Developers

 

developer.android.com

Android는 개발 관련 자료가 잘 정리되어 있어 공부하기 정말 좋습니다.

ListView는 id만 정확하게 입력하면 됩니다.

이젠 LisrView에 item을 연결하기 위한 Adapter가 필요합니다.

새 파일에서 코틀린(Kotlin) .kt class 파일을 생성해주세요.

기본적으로 BaseAdapter을 상속받아서 item Array에 item을 저장하면 됩니다.

BaseAdapter에서 사용하는 기본 함수를 override 해줍니다.

getView 함수에서 View를 호출하기 직전에 main_lv_item.xml에 입력된 name, image를 저장하는 구조입니다.

class MainListAdapter(val context: Context, val itemlist : ArrayList<item>) : BaseAdapter() {
    override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {

        val view:View = LayoutInflater.from(context).inflate(R.layout.main_lv_item, null)
        val processname = view.findViewById<TextView>(R.id.processname)
        val itemIcon = view.findViewById<ImageView>(R.id.AppImg)

        val positem = itemlist[p0]
        processname.text = positem.name
        itemIcon.setImageDrawable(positem.image)
        return view
    }

    override fun getItem(p0: Int): Any {
        return itemlist[p0]
    }

    override fun getItemId(p0: Int): Long {
        return 0
    }

    override fun getCount(): Int {
        return itemlist.size
    }
}

마지막으로 등록된 Adapter을 ListView에 연결해야 합니다.

MainActivity로 이동해주세요.

arrayListOf를 사용해서 item 리스트를 생성합니다.

설치된 앱을 확인하기 위해서는 packageManager을 사용해야 합니다.

developer.android.com/reference/android/content/pm/PackageManager#getInstalledPackages(int)

 

PackageManager  |  Android 개발자  |  Android Developers

 

developer.android.com

packageManager.getinstalledPackages() 함수는 패키지 정보를 반환합니다.

0으로 설정할 경우는 DIRECT_BOOT_AWARE로 설치된 앱 리스트만 리턴합니다.

만약 설치된 모든 리스트롤 확인하고 싶다면 MATCH_DIRECT_BOOT_UNAWARE로 입력하면 됩니다.

반환된 앱 정보를 사용해서 MainListAdapter에 item 리스트를 저장합니다.

 

컴파일 결과 설치된 앱 리스트를 아이콘과 함께 확인할 수 있습니다.

설치된 앱을 모두 확인하는 과정에서 조금 시간이 걸립니다.

이번 시간에는 아주 간단하게 ListView를 사용해서 설치된 앱 리스트를 확인했습니다.

감사합니다.

반응형
반응형

코틀린으로 안드로이드 개발 시 layout에 Activity_main.xml을 인식 못하는 오류가 발생했습니다.

소스에는 activity_main.xml이 존재하지만 찾을 수 없다는 오류가 출력됩니다.

Unresolved reference: activity_main 

이건 뭐여.

옵션 설정을 변경해도 동일한 에러가 계속 발생해서 구글링 해보니까.

import android.R 이 문제였습니다.

android.R이 import되면서 다른 내용을 찾고 있는 것으로 생각됩니다.

import android.R을 삭제하면 정상적으로 Activity_main을 확인할 수 있습니다.

 

반응형

+ Recent posts