컴포넌트에 바로 접근하기



컴포넌트 접근 할 때 findViewById(R.id.blahblah) 를 사용한다.

그러나 Kotlin 의 extension 을 사용하면, 간결하게 위젯의 id 에 접근할 수 있다.




이전에 build.gradle (app) 에 선언을 했을 것이다.


apply plugin: 'kotlin-android-extensions'





xml layout


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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="com.android.tech.kotlin.MainKotlinActivity">

<TextView
android:id="@+id/tv_kotlin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>

</android.support.constraint.ConstraintLayout>



TextView 의 id 값이 tv_kotlin 으로 선언 되있는 것을 .kt 파일에서 바로 접근할 수 있게 한다.



import kotlinx.android.synthetic.main.activity_main_kotlin.*

class MainKotlinActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main_kotlin)

//Xml id에 바로 접근
tv_kotlin.text = getMessage(1)
}

fun getMessage(msgType : Int) : String {
return if (msgType == 1) "아 너무 졸립다~" else "전혀 졸립지 않아요~"
}
}


TextView 의 id 값을 import 해서 바로 .text 로 바로 접근이 가능하다.

'안드로이드 > Kotlin (코틀린)' 카테고리의 다른 글

기본문법  (0) 2017.09.04
Kotlin -01 코틀린의 시작 (개발환경)  (0) 2017.08.22
Posted by 자바리즘
,

코틀린 설치





안드로이드 스튜디오 [ FILE ] - [ Settings ] 로 가셔서 kotlin 검색 후, 'Install' 을 합니다.

 


 

 


 


build.gradle (Application)


classpath 에 코틀린을 추가해 줍시다~

buildscript {

ext.kotlin_version = '1.1.3-2'

repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}



build.gradle (App)


상단에 plugin 추가

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'



dependencies 에 코틀린 라이브러리 추가

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])

compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support:design:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}




Activity 작성

[File] - [New] - [Kolin Activity] 선택해서 액티비티를 생성하세요.


class MainKotlinActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main_kotlin)

var tv_kotlin = findViewById(R.id.tv_kotlin) as TextView
tv_kotlin.text = getMessage(1)
}

fun getMessage(msgType : Int) : String {
return if (msgType == 1) "아 너무 졸립다~" else "졸립지 않아요~"
}
}



Run 시키면, '아 너무 졸립다~' 가 회면에 나오게 됩니다.


감사합니다.




'안드로이드 > Kotlin (코틀린)' 카테고리의 다른 글

기본문법  (0) 2017.09.04
Kotlin -02 컴포넌트 바로 접근하기  (0) 2017.08.22
Posted by 자바리즘
,

키스토어 정보 숨기기



build.gradle 에서 키스토어에 대한 정보를 미리 입력하여 빌드를 편하게 하는 기능이 있다.



signingConfigs {
        release {
            keyAlias '별칭'
            keyPassword '비밀번호'
            storeFile file('C:/경로/키스토어이름.keystore')
            storePassword '비밀번호'
        }
    }



위와 같이 편하게 할 수 있으나, '보안' 상 위험할 수 있다. 

안드로이드 개발자 사이트에서는 별도의 파일을 만들어서 keystore 정보를 사용하는 것을 권장하고 있다.





프로젝트 루트 디렉토리에 ' keystore.properties' 이름으로 파일을 생성한다. 파일 안에



storePassword=myStorePassword

keyPassword=mykeyPassword

keyAlias=myKeyAlias

storeFile=myStoreFileLocation



키스토어에 대한 정보를 입력한다. 싱글 쿼테이션으로 묶지 않고 입력한다. build.gradle 에서 keyAlias '앱별칭' 이런식으로 했었지만, properties 파일에서는 싱글쿼테이션을 사용할 경우 인식하지 못한다.





build.gradle 의 android 블럭 밖에 아래 구문을 붙여 넣어준다.

// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.
def keystorePropertiesFile = rootProject.file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties
.load(new FileInputStream(keystorePropertiesFile))

android
{
   
...
}




이제 signingConfigs 을 아래의 내용으로 복사해서 붙여넣자.
android {
    signingConfigs
{
       
release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties
['keyPassword']
            storeFile file
(keystoreProperties['storeFile'])
            storePassword keystoreProperties
['storePassword']
       
}
   
}
   
...
 
}





buildTypes 에서 signingConfigs 를 연결해줘야 합니다.

buildTypes {
        release
{
            signingConfig signingConfigs
.release
           
...
       
}
   
}





터미널에서 gradle build 또는 gradlew build 해서 빌드가 되는지 확인하자.

빌드가 된다면 설정을 올바르게 한 것 이다.







출처 : https://developer.android.com/studio/publish/app-signing.html?hl=ko

'안드로이드 > TIP' 카테고리의 다른 글

앱 에서 앱 으로 호출  (0) 2017.09.27
안드로이드 미러링 앱  (0) 2017.09.18
build.gradle lintOptions  (0) 2017.08.18
키스토어 정보 알아내기  (0) 2017.08.17
안드로이드 Signed Apk Error  (0) 2017.08.08
Posted by 자바리즘
,

* What went wrong:

Execution failed for task ':app:lint'.

> Lint found errors in the project; aborting build.


Fix the issues identified by lint, or add the following to your build script to proceed with errors:

...

android {

    lintOptions {

        abortOnError false

    }

}




빌드 시, 위와 같은 오류가 발생할 때가 있다.


build.gradle 의 android 블럭 안에

    lintOptions {
        abortOnError false
    }


선언 해주면 된다.


모듈이 여러 개라면, 각각의 build.gradle 에 추가를 하면 된다.


'안드로이드 > TIP' 카테고리의 다른 글

안드로이드 미러링 앱  (0) 2017.09.18
Keystore 정보 숨기기  (0) 2017.08.18
키스토어 정보 알아내기  (0) 2017.08.17
안드로이드 Signed Apk Error  (0) 2017.08.08
유용하게 개발하기  (0) 2017.06.21
Posted by 자바리즘
,

keytool -list -v -keystore 키스토어경로

'안드로이드 > TIP' 카테고리의 다른 글

Keystore 정보 숨기기  (0) 2017.08.18
build.gradle lintOptions  (0) 2017.08.18
안드로이드 Signed Apk Error  (0) 2017.08.08
유용하게 개발하기  (0) 2017.06.21
Status bar Icon Size  (0) 2015.03.20
Posted by 자바리즘
,

AppWidgetId 넘겨주기





static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {

        // Construct the RemoteViews object
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_app_widget);
        views.setTextViewText(R.id.appwidget_text, "Example");

        //Set AppWidgetId
        Intent intent = new Intent(context, WidgetConfigActivity.class);
        intent.setData(Uri.parse(String.valueOf(appWidgetId)));

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 
PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.appwidget_text, pendingIntent);

        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }



중요한부분


Intent intent = new Intent(context, WidgetConfigActivity.class);

intent.setData(Uri.parse(String.valueOf(appWidgetId)));


intent 의 setData 에 Uri 형태로 '위젯 ID' 를 넘겨준다.

WidgetConfigActivity 로 넘겼으니 이 액티비티에서 다시 받아와야 한다.






    Uri uri = intent.getData();
    int widgetId; 

    if(uri != null)
        widgetId= Integer.parseInt( uri.toString() );


uri.toString() 으로 String 형 값을 다시 Integer.parseInt 를 통해 int 형으로 변경한다.

id 는 int 형이여야 하기 때문이죠.






해당 id 의 앱위젯을 업데이트 합니다.


    AppWidgetManager mgr = AppWidgetManager.getInstance( getApplicationContext() );
    MyAppWidget.updateAppWidget( getApplicationContext(), mgr, widgetId );


'안드로이드 > AppWidget' 카테고리의 다른 글

App Widget -01  (0) 2017.08.16
Posted by 자바리즘
,

App Widget 시작


 


 

안드로이드 스튜디오

프로젝트 최상단 [app] 오른쪽 마우스 클릭 !


NEW    >    Widget    >    App Widget     선택

자동으로 앱위젯을 생성해 준다.


 

 

 

 

 

앱위젯 설정

 

 

 


 

매니페스트

 

매니페스트에 receiver 로 등록이 되어야 한다. 역시 자동으로 생성되고,

res > xml 폴더 밑에도 자동으로 provider 파일을 생성해준다.

 


 

 


XML > appwidget-provider

initialKeyguardLayout  :  잠금화면에서 보여질 레이아웃

initialLayout  :  홈화면에서 보여질 레이아웃

minHeight  :  최소 높이

minWidth  :   최소 넓이

previewImage  :  위젯 선택할 때 나타날 이미지

resizeMode  :  가로 세로 리사이즈 모드

updatePeriodMillis  :  업데이트 주기 (30분 밑으로는 업데이트 설정이 안됩니다)

configure  :  설정 액티비티

widgetCategory  :  위젯이 보여질 카테고리 (홈스크린, 잠금화면)

 

 





AppWidgetProvider

public class MyAppWidget extends AppWidgetProvider {

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {

CharSequence widgetText = context.getString(R.string.appwidget_text);

PreferenceTool tool = new PreferenceTool(context);
String getStr = tool.getString(String.valueOf(appWidgetId), widgetText.toString());

Log.i(Const.TAG, "updateAppWidget() get Preference String : " + getStr + ", widgetId: " + appWidgetId);

// Construct the RemoteViews object
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_app_widget);
views.setTextViewText(R.id.appwidget_text, getStr);

Intent intent = new Intent(context, WidgetConfigActivity.class);
intent.setData(Uri.parse(String.valueOf(appWidgetId)));

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.appwidget_text, pendingIntent);

// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}

@Override
public void onEnabled(Context context) {
// Enter relevant functionality for when the first widget is created
}

@Override
public void onDisabled(Context context) {
// Enter relevant functionality for when the last widget is disabled
}
}

 

onUpdate  :  위젯이 업데이트 신호를 받을 때 호출 되는 함수

onEnabled  :  위젯을 처음 활성화 했을 때 호출 되는 함수

onDisabled  :  위젯이 비활성화 될 때 호출 되는 함수

onReceived  :  Broadcast 메시지를 받을 때 호출되는 함수

 

 


 




출처 : https://developer.android.com/guide/topics/appwidgets/index.html?hl=ko#MetaData

'안드로이드 > AppWidget' 카테고리의 다른 글

AppWidget -02  (0) 2017.08.17
Posted by 자바리즘
,