반응형

지난 시간에 카메라를 사용해서 이미지 뷰에 연결하는 방법을 공부했습니다.

카메라 캡처를 사용해서 이미지를 사용하면 해상도가 떨어지기 때문에 원본이 손실되는 문제가 발생했습니다.

이번 시간에는 원본 이미지 손실을 최소화할 수 있는 이미지 저장 방법에 대해서 알아보겠습니다.

지난 시간에 배운 코틀린을 이용한 카메라 이미지 저장 실행 화면입니다.

원본 이미지 해상도가 많이 떨어지는 것을 확인할 수 있습니다.

해상도를 유지하기 위해서 먼저 촬영된 이미지를 원본 그대로 갤러리에 저장 후 로드하는 형태로 변경해보겠습니다.

카메라 원보 이미지를 저장하기 위해서 먼저 이미지 경로 Uri를 생성합니다.

fun createImageUri(filename:String, mimeType:String):Uri?{
        var values = ContentValues()
        values.put(MediaStore.Images.Media.DISPLAY_NAME,filename)
        values.put(MediaStore.Images.Media.MIME_TYPE, mimeType)
        return contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
    }

ContentValues를 사용해서 이미지 Uri를 생성합니다.

contentResolver는 contentProvider과 비즈니스 로직의 중계자 역할을 담당합니다.

ContentValues는 contentResolver이 사용하는 데이터 정보라고 생각하면 됩니다.

ContentValues에 이미지 이름과 타입을 저장합니다.

카메라를 동작하기 위해서 dispatchTakePictureIntentEx 함수를 추가합니다.

private var photoURI : Uri? = null
    private val REQUEST_CREATE_EX = 3

    private fun dispatchTakePictureIntentEx()
    {
        val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        val takePictureIntent : Intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        val uri : Uri? =   createImageUri("JPEG_${timeStamp}_", "image/jpg")
        photoURI = uri
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
        startActivityForResult(takePictureIntent, REQUEST_CREATE_EX)
    }

전역 경로 photoURI, 이벤트 ID REQUEST_CREATE_EX를 선언합니다.

이전 시간에 선언한 함수와 동일하 구성이기 때문에 Ex를 붙여서 이름을 변경했습니다.

timeStamp를 사용해서 이미지 이름을 시간에 따라서 생성합니다.

CreateimageUri 함수를 호출해서 이미지를 생성하고 카메라를 실행합니다.

fun loadBitmapFromMediaStoreBy(photoUri: Uri) : Bitmap?{
        var image: Bitmap? = null
        try{
            image = if(Build.VERSION.SDK_INT > 27){
                val source: ImageDecoder.Source =
                    ImageDecoder.createSource(this.contentResolver, photoUri)
                ImageDecoder.decodeBitmap(source)

            }else{
                MediaStore.Images.Media.getBitmap(this.contentResolver, photoUri)
            }
        }catch(e:IOException){
            e.printStackTrace()
        }
        return image
    }

생성된 Uri 경로에 이미지를 MediaStore를 사용해서 읽어옵니다.

 btnCamera.setOnClickListener{
                if(checkPermission()){
                    //dispatchTakePictureIntent()
                    dispatchTakePictureIntentEx()
                }
            else{
                    requestPermission()
                }
        }

기존에 연결되어 있던 버튼 이벤트에서 신규로 선언한 dispatchTakePictureIntentEx 함수를 실행합니다.

else if( requestCode == REQUEST_CREATE_EX)
{
    if( photoURI != null)
    {
           val bitmap = loadBitmapFromMediaStoreBy(photoURI!!)
           GImageView.setImageBitmap(bitmap)
           photoURI = null
    }
}

onActivityResult 함수에서 이벤트 ID REQUEST_CREATE_EX를 필터링 후

이미지를 로드하는 loadBitmapFromMediaStoreBy 함수를 호출해서 이미지 뷰에 연결합니다.

카메라 촬영 후 갤러리를 확인하면 카메라 이미지를 확인할 수 있습니다.

원본 이미지를 사용해서 이미지뷰에 연결하면 해상도가 동일한 것을 확인할 수 있습니다.

카메라 이미지 해상도를 원본과 동일하게하기 위해서 별도 저장 후 로드하는 방법을 사용하게 가장 좋은 방법입니다.

이미지 정보가 시간에 따라서 변경되기 때문에 이름을 고정하면 한 개의 사진만 업데이트됩니다.

코틀린을 사용하면 코드가 매우 간결하기 때문에 매우 편리합니다.

객체를 주고받을 때 NULL 존재하기 때문에 ?를 사용하는 부분만 확인하면 어렵지 않은 코드입니다.

감사합니다.

 

반응형
반응형

앱 프로그램이 인기가 높아지면거 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개의 프로젝트만 사용 가능하다면 적극 추천드립니다.

감사합니다.

반응형
반응형

오늘은 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

 

반응형
반응형

오늘은 코틀린을 사용해서 안드로이드 인트로 화면을 만들어 보겠습니다.

코틀린 안드로이드 인트로

기본적인 인트로 화면으로 이미지를 추가해서 전환하는 방식으로 코드를 진행하겠습니다.

코틀린 안드로이드 인트로

먼저 안드로이드 스튜디오 및 IntelliJ을 사용해서 안드로이드 컴파일할 수 있는 환경을 구성해주세요.

전 유료 버전인 IntelliJ를 사용해보겠습니다.

안드로이드 스튜디오 개발 회사에서 만든 툴이기 때문에 비슷한 부분이 많이 있습니다.

먼저 "Empty Activity" 프로젝트를 생성해줍니다.

코틀린 안드로이드 인트로

안드로이드 인트로화면은 Activity를 호출해주는 방식이기 때문에 먼저 IntroActivity를 생성해줍니다.

이번에는 안드로이드 인트로에 사용할 이미지를 등록해주세요.

drawable 폴더에서 우클릭을 사용해서 Explorer을 오픈해서 이미지를 복사하면 자동으로 drawable 하위에 이미지가 등록됩니다.

코틀린 안드로이드 인트로

등록된 이미지를 클릭하면 확인할 수 있습니다.

코틀린 안드로이드 인트로

처음에 신규로 생성한 introlActivity.kt 파일을 클릭해서 코드를 입력해주세요.

class introlActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_introl)

        var handler = Handler()
        handler.postDelayed( {
            var intent = Intent( this, MainActivity::class.java)
            startActivity(intent)
        }, 3000)
    }

    override fun onPause() {
        super.onPause()
        finish()
    }
}

Intent를 사용해서 MainActivity를 3초 후에 이동하는 코드입니다.

onPause가 호출되면서 대기상태일 때 introActivity는 종료시키는 코드도 추가해주세요.

 

 

 

코틀린 안드로이드 인트로

인트로 레이아웃은 ImageView를 사용해서 고정시켜줍니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".introlActivity">

    <ImageView
            android:id="@+id/introlImg"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:src="@drawable/moon"
    />

</androidx.constraintlayout.widget.ConstraintLayout>

마지막으로 등록된 메인 Activity 정보를 변경해줍니다.

코틀린 안드로이드 인트로

AndroidManifest.xml에서 MainActivity와 .introlActivity를 바꿔주면 IntrolActivity가 먼저 호출되면서

3초 후 MainActivity가 호출됩니다.

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

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
        </activity>
        <activity android:name=".introlActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

정상적으로 코딩되었다면 빌드해주세요.

코틀린 안드로이드 인트로

인트로로 설정된 Activity가 먼저 호출되는 것을 확인할 수 있습니다.

코틀린 안드로이드 인트로

3초 후 메인화면으로 이동합니다.

인트로 화면은 앱 실행과 동시에 사용자에게 가장 큰 기대를 줄 수 있는 중요한 내용입니다.

안드로이드 인트로 화면을 사용해서 앱을 더욱더 멋지게 개발해보세요.

감사합니다.

반응형
반응형

오늘은 코틀린을 사용해서 매주 부자를 만들어주는 로또 랜덤 번호 생성기를 구현해보겠습니다.

로또 번호는 45개의 번호 중 6개의 번호를 선택하는 규칙입니다.

로또 랜덤 볼을 개발하기 위해서는 먼저 로또 볼이 어떻게 구성되어 있는지 확인을 해야 합니다.

최종 로또 랜덤 볼 프로그램은 하단 버튼을 눌러 난수를 발생하여 겹치지 않는 6개의 번호를 생성하는 모습입니다.

로또 볼 이미지를 만들기 위해서 파워포인트를 사용해서 원형을 만들고 색상은 로또 사이트에서 확인하였습니다.

각 볼 이미지는 숫자는 자릿수가 2자리 이므로 위치를 45번 기준으로 정했습니다.

이미지는 아무렇게나 만들어 주세요. 중요한 건 45개의 이미지를 분리해야 합니다.

안드로이드 프로젝트는 "빈 프로젝트"로 설정하고,  코트린(Kotlin)을 선택해주세요.

"res -> drawable"를 선택하고 우클릭하여 "Show in Explorer"을 선택해서 폴더로 이동해주세요.

위에서 만든 45개의 이미지를 "drawable" 폴더에 복사해주십시오.

"drawable" 폴더에 이미지를 복사 후 Android Studio에서 "drawable" 하위에 자동으로 이미지가 등록됩니다.

자 그럼 이제 준비는 모두 완료되었습니다.

먼저 UI를 만들기 위해서 "layout" 하위 "activity_main.xml" 파일을 클릭합니다.

생성된 "<androidx.constraintlayout.widget.ConstraintLayout"를 삭제하고 "LinearLayout"를 새로 생성해줍니다.

ImageView, Button을 세로로 배치하기 위해서입니다.

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

orientation 속성은 "vertical"로 변경해주세요.

이제 볼을 저장하기 위한 ImageView를 6개 생성해줍니다.

ImageView는 위치를 고정하기 위해서 "layout_margin" 속성을 30px 정도 주었습니다.

<LinearLayout
        android:id="@+id/ll"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/ballView1"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
        <ImageView
            android:id="@+id/ballView2"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
        <ImageView
            android:id="@+id/ballView3"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
        <ImageView
            android:id="@+id/ballView4"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
        <ImageView
            android:id="@+id/ballView5"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
        <ImageView
            android:id="@+id/ballView6"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
    </LinearLayout>

ImageView를 하나의 View로 고정하기 위해서 LinearLayout 내부에 구현했습니다.

가장 중요한 내용은 ImageView 속성 ID를 순차적으로 입력해야 합니다.

즉 "@+id/ballView1", "@+id/ballView2", "@+id/ballView3"~ "@+id/ballView6"순으로 지정해주세요.

마지막으로 랜덤 실행을 하기 위해서 버튼을 설정합니다.

 <Button
        android:id="@+id/btStart"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="시작"
        android:textSize="20sp" />

코드가 정상적으로 등록되었다면 Design에서 사진과 같은 것을 확인할 수 있습니다.

상단에 볼을 구현하기 위한 6개의 이미지가 있고 아래쪽에 실행 버튼이 위치합니다.

자 이제 "java" 폴더 하위에 있는 MainActivity.kt 파일을 클릭합니다.

먼저 볼을 저장할 수 있는 전역 변수를 선언합니다.

val BallList = ArrayList<Bitmap>()

BallList는 전역으로 사용하기 위해서 onCreate 위쪽에 선언해주세요.

"drawable"에 저장된 45개의 이미지를 한 번에 로드해서 BallList에 등록하는 코드입니다.

getResources()를 사용해서 저장된 정보 ID를 추출할 수 있습니다.

처음 저장된 이름을 순차적으로 저장하면 for문을 사용해서 한번에 ID를 추출해서 BITMAP을 생성할 수 있습니다.

생성된 BITMAP은 크기를 지정해서 BallList에 "add"함수를 사용해서 저장합니다.

 

 

 

Toast.makeText(this@MainActivity, "Create lottovall image.", Toast.LENGTH_SHORT).show()
        for( i in 0..44)
        {
            var bmp : Int = getResources().getIdentifier("lottoball" + (i + 1), "drawable", packageName )
            var bitmap:Bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), bmp),
                70,70, false)
            BallList.add(bitmap)
        }

상단 Toast 메시지는 실행 구간을 확인하기 위해서 추가했습니다.

이제 저장된 45개의 이미지를 랜덤 하게 생성해서 이미지를 저장해보겠습니다.

먼저 버튼 클릭 이벤트를 설정합니다.

코틀린은 JAVA와 다르게 매우 직관적으로 클릭 이벤트를 설정할 수 있습니다.

val btn : Button = findViewById<Button>(R.id.btStart)

        btn.setOnClickListener{
            Toast.makeText(this@MainActivity, "button start.", Toast.LENGTH_SHORT).show()

            var set: TreeSet<Int> = TreeSet()

            while(set.size < 6){
                val random = Random()
                val num = random.nextInt(45)
                set.add(num)
            }

버튼 ID를 확인하고 setOnClickListener 함수를 설정해줍니다.

랜덤 번호는 겹치면 안 되기 때문에 TreeSet 이진 검색을 사용해서 저장해주세요.

코틀린은 JAVA와 동일한 알고리즘 클래스를 사용할 수 있습니다. 

마지막으로 랜덤으로 설정된 6개의 번호를 ImgView와 연결해줍니다.

Toast.makeText(this@MainActivity, "ball check.", Toast.LENGTH_SHORT).show()

            var nCount = 0
            for( i in set )
            {
                var tmpID : Int =  getResources().getIdentifier("ballView" + (nCount + 1),
                    "id", packageName )
                val imgView = findViewById<ImageView>(tmpID)
                imgView.setImageBitmap(BallList.get(i))
                nCount++
            }

            Toast.makeText(this@MainActivity, "button end.", Toast.LENGTH_SHORT).show()

for문을 사용해서 저장된 Treeset 이미지 번호를 전역 저장된 BallList에서 확인합니다.

ImageView 호출은 nCount를 사용해서 6번 반복하게 설정했습니다.

로또 랜덤 볼 생성 프로그램 실행 사진입니다.

하단 버튼을 클릭하면 새로운 번호가 출력되는 것을 확인할 수 있습니다.

코틀린과 JAVA를 두 개다 구현해보니 확실하게 코틀린이 더 편리합니다.

문법적으로도 매우 깔끔해서 가독성이 좋습니다.

오늘은 코틀린을 사용해서 로또 랜던 볼 생성 프로그램을 만들어 보았습니다.

감사합니다.

반응형
반응형

오늘은 코틀린(Kotlin) 안드로이드 배우기 #1 - ClickEvent, when에 대해서 알아보겠습니다.

코틀린(Korlin)을 사용하기 위해서는 기본적으로 안드로이드 스튜디오를 설치하면 바로 사용이 가능합니다.

안드로이드 설치는 다음 시간에 다루고 이번 시간에는 코틀린을 사용해서 버튼 이벤트 연결에 대해서 알아보겠습니다.

안드로이드 스튜디오 설치 상태에서 "NewProject"를 선택 후 EmptyActivity를 선택해 줍니다.

Project 설정에서 원하는 폴더에 Name, Package 명을 입력해 주세요.

가장 중요한 "Language"는 Kotlin을 선택해 줍니다.

 

 

 

이번 강좌에서는 MainActivity, activity_main.xml 두 개 파일만 사용하겠습니다.

먼저 정렬을 하기 위해서 activity_main.xml 파일에서 레이아웃을 변경해 주십시오.

레이아웃 변경 후 컨트롤을 등록하기 위해서 아래 코드를 입력해 주세요.

<?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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="7dp"
        android:onClick="onClick"
        android:id="@+id/btnStart"
        android:text="Start"
        tools:ignore="MissingConstraints"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:layout_gravity="center"
        android:layout_margin="25dp"
        android:id="@+id/MainText"/>

</LinearLayout>

세로 정렬을 사용하기 위해서 LinearLayout 속성 android:orientation="vertical"을 추가하고

이벤트를 사용하기 위해서 버튼, 텍스트 뷰를 추가해 줍니다.

"Shift" + F10을 클릭하면 컴파일 되면서 안드로이드가 실행됩니다.

버튼 이벤트 속성 중 android:onClick="onClick"은 Listener를 사용해서 이벤트를 연결하기 위해서 설정이 반드시 필요합니다.

이제 MainActivity로 이동합니다.

코틀린 확장자는. kt로 생성됩니다.

코틀린은 자바와 다르게 NULL 대한 처리를 명확하게 처리하여 오류를 최소화해 줍니다.

버튼 이벤트를 연결하기 위해서 View.OnClickListerner을 상속받습니다.

코틀린은 NULL을 구분하기 위해서'?'를 사용합니다.

즉 변수 뒤에'?' 가 있을 경우 NULL을 허용한다는 뜻입니다

'?'가 없을 경우는 NULL을 허용할 수 없어 컴파일이 안됩니다.

when문은 자바에서 사용하는 switch 문과 동일합니다.

버튼에 설정한 onClick를 연결하기 위해서 상속된 Listener 가상 함수 onClick을 override 합니다.

onClick 함수에서는 코틀린 when을 사용해서 버튼 ID를 구분해서 텍스트 뷰를 변경하는 로직을 추가합니다.

override fun onClick(v: View?) {
       when(v?.id)
       {
           R.id.btnStart->{
               var tView = findViewById<TextView>(R.id.MainText)
               if( bCheck) {
                   tView.setText("Click Button")
                   bCheck = false
               }
               else
               {
                   tView.setText(R.string.sRString1)
                   bCheck = true
               }
           }
       }
    }

코틀린은 형 변환을 자유롭게 하기 위해서 생성 시 만 설정해 줍니다.

findViewById<형변환Class>

코드를 추가하고 컴파일 하면 버튼을 클릭하면 텍스트 뷰가 변경되는 것을 확인할 수 있습니다.

이상으로 코틀린(Kotlin) 안드로이드 배우기 #1 강좌를 마치겠습니다.

감사합니다.

#코틀린, #안드로이드, #Kotlin, #안드로이드강좌, #onClick, #when

반응형
반응형

오늘은 Android Studio에서 구글 앱 광고 AdMob을 실행하는 방법을 알아보겠습니다.

먼저 Android 광고 달기를 실행하기 위해서는 광고 ID가 필요합니다.

ID 생성 및 가입은 다음 시간에 확인하고, 이번에는 구글에서 제공하는 테스트 ID를 사용하겠습니다.

https://developers.google.com/admob/android/test-ads?hl=ko

테스트 광고  |  Android  |  Google Developers

홈 제품 Google AdMob 모바일 광고 SDK(Android) 테스트 광고 목차 기본 요건 샘플 광고 단위 테스트 기기 사용 테스트 기기 추가 미디에이션을 이용한 테스트 이 가이드에는 광고 통합에서 테스트 광고를 사용하는 방법이 나와 있습니다. 개발 중에는 테스트 광고를 사용하여 광고를 클릭해도 Google 광고주에게 비용이 청구되지 않게 하는 것이 중요합니다. 테스트 모드가 아닌 상태에서 광고를 너무 많이 클릭하면 무효 활동으로 계정이 신고될 수 있습니다. 테스트 광고는 두 가지 방법으로 얻을 수 있습니다. Google의 샘...

developers.google.com

혹 발행된 ID를 사용해서 테스트할 경우 불이익이 발생할 수 있으니 테스트 시는 반드시

위 사진에서 원하는 ID를 사용하세요.

Android 광고 달기 위해서 먼저 Android Studio에서 비어있는 앱을 하나 생성해주십시오.

Android 광고 달기를 위해서 Gradle Scripts 하단에 있는 build.gradle(Module.app)를 클릭해주세요.

Module.app 하단에 dependencies 안쪽에 아래 코드를 입력해주세요.

implementation 'com.google.android.gms:play-services-ads:17.2.0'

Android 광고 달기 다음 단계는 위쪽에 있는 AdViewTest를 선택해주세요.

활성화된 파일 아래쪽을 보면 allprojects가 보일 겁니다.

아래 코드를 입력해주세요.

maven{ url "https://maven.google.com" }

 

 

 

Android 광고 달기 다음 단계는 AdMob 옵션 설정을 하기 위해서 AndroidManifest.xml을 선택해주세요.

application 내부에 아래 코드를 입력해주세요.

<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="true"/>

요즘 코드에서 value에 ID를 넣을 경우 실행 오류가 발생하니 그냥 'true'로 설정하고 MainActive 및 View에서 ID를 접근하겠습니다.

Android 광고 달기 다음 단계는 AdMob View를 만들기 위해서 layout 아래 있는 activity_main.xml을 선택해주세요.

LinearLayout 내부에 View 코드를 입력해주세요.

  <com.google.android.gms.ads.AdView
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        ads:adSize="BANNER"
        ads:adUnitId="ca-app-pub-3940256099942544/6300978111">
    </com.google.android.gms.ads.AdView>

adUnitId는 일단 테스트 광고 ID를 넣고 나중에 개발이 완료되면 발급받은 ID로 변경해주십시오.

Android 광고 달기 마지막 단계 View를 보여주기 위해서 MainActivity로 이동합니다.

 

각 위치에 아래 코드를 복사해주세요.

import com.google.android.gms.ads.AdRequest; 
import com.google.android.gms.ads.AdView; 
import com.google.android.gms.ads.MobileAds; 
private AdView mAdView; 
MobileAds.initialize(this, "\tca-app-pub-3940256099942544/6300978111"); 
mAdView = findViewById(R.id.adView); 
AdRequest adRequest = new AdRequest.Builder().build(); 
mAdView.loadAd(adRequest);

Android 광고 달기 모든 코드를 완료하면 아래 사진처럼 상단에 광고를 확인할 수 있습니다.

Android 광고 달기 방법은 여러 가지 있지만 개인적으로 가장 심플한 거 같아서 정리해봤습니다.

안드로이드 개발에 입문하시는 분들에게 도움이 되었으면 합니다.

이상으로 Android 광고 달기를 마치겠습니다.

감사합니다.

#안드로이드, #앱, #AdMob, #앱광고, #강좌, #Android, #광고달기

반응형

+ Recent posts