2018.04.15 01:59


Android Studio build error about gradle

Could not find com.android.tools.build.gradle:3.0.0-alpha7


위와 같이 gradle 버전을 찾지 못할때

자신의 android studio 설치 폴더상의 gradle 버전을 확인해서 build.gradle 상에 설정해준다.


 

  1. open the file path(just as the log said): file:/C:/Users/dmin/Documents/android-studio/gradle/m2repository/com/android/tools/build/gradle/
  2. found this file

  3. just change classpath 'com.android.tools.build.gradle:3.0.0-alpha7' to classpath 'com.android.tools.build.gradle:* * * ' ; * * * is the exist gradle file;

  4. buildscript {
      repositories {
        ...
        // You need to add the following repository to download the
        // new plugin.
        google()
      }
    
      dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-alpha5'
      } 
    }







Posted by injunech
2017.12.11 11:03


[Android] SDK 환경변수 설정


1. 환경변수 설정


> 윈도우버튼 마우스 오른쪽 버튼으로 시스템 실행 > 고급시스템 설정 > 환경 변수

> 혹은 윈도우 검색에 '시스템 환경변수 편집' 검색해서 환경변수 제어판 실행



> 환경 변수 : 시스템 변수 -> 새로만들기 


> 변수 이름에 Android-SDK, 변수 값에 본인의 Android SDK 설치 경로 입력



> 시스템변수 Path 에 JAVA JDK 폴더 경로 추가

  Android SDK 가 설치된 platform-tools 폴더 내에 adb.exe 파일이 존재한다.
  (\Android\Sdk\platform-tools)



  > Android-SDK 변수명과 platform-tools 폴더 경로를 추가하여 PATH에 환경 변수를 추가해준다.

     %Android-SDK%\platform-tools





2. Android SDK 환경변수 설정 확인


> Ctrl + R 눌러 실행 창에서 cmd 로 command 창 실행


> adb sherll 입력해서 아래와 같이 device 가 연결 된다면 완료




Posted by injunech
2017.12.09 01:55


[Android] Gradle 이란?


 Gradle 이란 빌드 배포 도구(build tool) 입니다.

프로젝트를 생성하면 다음과 같은 구조로 파일들이 생성됩니다.  안드로이드 스튜디오로 프로젝트를 만들면 Gradle이란 것도 같이 생성되는 것을 볼 수 있습니다. 

안드로이드 스튜디오(IDE)와 빌드 시스템이 서로 독립적이기 때문입니다. 이클립스에서는 프로젝트 빌드를 이클립스 내에서 담당했지만, 안드로이드 스튜디오는 코드의 편집만을 담당할 뿐, 빌드는 Gradle을 통해 모두 수행됩니다. 때문에, 간혹 안드로이드 스튜디오의 프로젝트 설정과 Gradle 빌드 설정이 동기화되지 않아 스튜디오에서 에러로 표시하는 경우도 있습니다. 하지만, 빌드 절차와 IDE가 분리되어 있기 떄문에 프로젝트를 더 깔끔하게 관리할 수 있게 되었습니다.


* 이전에는 라이브러리를 추가하려면 jar파일을 받아서 설정해줘야 했지만 라이브러리들이 많아짐에 따라 자동화 도구가 필요해지게 되었고 ant, maven, gradle 등의 라이브러리 관리 도구가 등장했습니다. 안드로이드 스튜디오에서는 Gradle을 채택하여 쓰고있습니다.


Gradle 공식 홈페이지 (https://gradle.org/)

https://gradle.org/install/


build.gradle

 모듈의 빌드 방법이 정의된 빌드스크립트입니다. 빌드에 사용할 SDK 버전부터 시작하여 애플리케이션 버전, 사용하는 라이브러리 등 다양한 항목을 설정하는 것이 가능합니다.


파일 내부의 옵션들에 대해서 하나씩 살펴보겠습니다.

    1. apply plugin: ‘com.android.application’

 apply plugin: ‘com.android.application’은 안드로이드 플러그인 사용을 gradle에 적용하는 것이다.  이 옵션은 top-level에서 선언되어야 합니다.


2. android {…}

 안드로이드와 관련된 빌드 설정은 이곳 안에서 세팅 됩니다.


3. compileSdkVersion, buildToolsVersion

 compileSdkVersion은 앱 컴파일시 사용할 SDK 버전을 지정합니다. buildToolsVersion 역시 사용할 빌드툴의 버전을 명시하는 부분입니다.


4. defaultConfig{…}

 AndroidManifest.xml에서 사용하는 설정들에 대해서 동적인 옵션을 주고 싶을 때 이 블록내에 포함시킵니다. 예를들면 versionCode나 versionName등의 값을 이곳에서 설정 할 수 있습니다.


5. buildTypes{…}

 dev, alpha, beta, release 같이 빌드 타입 종류를 지정합니다.


6. dependencies{…}

 라이브러리와 같은 의존성 추가 시 이곳에 작성합니다.


Gradle 및 Android Studio Build 구조에 대한 내용은 아래 구글 Dev안드로이드 링크 참조

https://developer.android.com/studio/build/index.html




Posted by injunech
2017.02.19 01:07


Color 지정방법에 대한 다양한 방법 소개


You can use various functions from the Color class to get the same effect of course.

  • holder.text.setTextColor(Color.RED);

  • Color.parseColor (Manual) (like LEX uses)

    text.setTextColor(Color.parseColor("#FFFFFF"));
  • Color.rgb and Color.argb (Manual rgb) (Manual argb) (like Ganapathy uses)

    holder.text.setTextColor(Color.rgb(200,0,0));
    holder.text.setTextColor(Color.argb(0,200,0,0));
  • And of course, if you want to define your color in an XML file, you can do this:

    <color name="errorColor">#f00</color>

    because the getColor() function is deprecated1, you need to use it like so:

    ContextCompat.getColor(context, R.color.your_color);
  • You can also insert plain HEX, like so:

    myTextView.setTextColor(0xAARRGGBB);

    Where you have an alpha-channel first, then the color value.

Check out the complete manual of course, public class Color extends Object.


https://developer.android.com/reference/android/graphics/Color.html#parseColor(java.lang.String)





Posted by injunech
2016.10.01 21:13


[Android] 알람 링톤 (Alarm Ringtone) 선택하기



알람의 벨소리(링톤) 을 선택하고 싶을 때 참고하세요.


DialogPicker를 startActivityForResult()로 호출 하고

해당 Dialog 에서 선택된 Ringtone 의 Uri 를 onActivityResult() 콜백 함수에서 받아온다.


onActivityResult() 콜백 함수 내에서 999 호출 되었을때 

선택된 Ringtone 의 URI 를 저장하거나 해당 링톤을 재생하거나 원하는 대로 코딩하면 됩니다.


private void showRingtonePickerDialog() {
    Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select ringtone for notifications:");
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_NOTIFICATION);
    startActivityForResult(intent, 777);
}



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
           case 999:
                    Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
                    if (uri != null) {
                        String ringtonePath = uri.toString();
                        Toast.makeText(getApplicationContext(), "ringtone="+ringtonePath, Toast.LENGTH_LONG).show();
                    }
           break;
 
        default:
           break;
        }
    }
}



# intent 에서 아래의 옵션을 설정 하여 보여주고싶은 Alarm Ringtone 의 목록 설정


Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select ringtone");
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);

// 아래 4가지중 선택
// intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALL);
// intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM);
// intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,  RingtoneManager.TYPE_RINGTONE);







Posted by injunech
2016.09.23 01:26


ListView를 보시면 화면을 터치한 후 드래그하는 속도에 따라 ListView의 스크롤링 속도가 변하는 것을 볼 수 있습니다. 천천히 하면 스크롤도 천천히 되고 빠르게 드래그하면 바퀴 돌 듯이 ListView가 스크롤 되지요. 이런 효과는 어떻게 구현될 수 있을까요? 안드로이드에서 제공하는 클래스를 통해 쉽게 구현할 수 있습니다. 다음의 코드를 보시죠.


public class MyOnTouchListener implements OnTouchListener {

    private VelocityTracker mVelocityTracker;

    public boolean onTouch(View v, MotionEvent event) {

        if (mVelocityTracker == null) {

            mVelocityTracker = VelocityTracker.obtain();

        }

        mVelocityTracker.addMovement(event);


        switch (event.getAction()) { 

        case MotionEvent.ACTION_DOWN:

            Log.v(TAG"ACTION_DOWN");

            break



        case MotionEvent.ACTION_MOVE:

            Log.v(TAG"ACTION_MOVE");

            mVelocityTracker.computeCurrentVelocity(1);

            float velocity = mVelocityTracker.getXVelocity();

            break


        case MotionEvent.ACTION_UP:

            Log.v(TAG"ACTION_UP");

            if (mVelocityTracker != null) {

                mVelocityTracker.recycle();

                mVelocityTracker = null;

            }

            break

        } 

        return true;

    }

}


요점은 VelocityTracker가 드래그의 속도를 측정해준다는 것입니다. 위의 예제에서는 VelocityTracker의 5가지 메소드가 사용되었습니다.

1. obtain()
   이것은 정적 메소드입니다. VelocityTracker의 인스턴스를 구하기 위한 팩토리 메소드입니다.
2. addMovement(MotionEvent e)
   속도를 측정하기 위해서 VelocityTracker 인스턴스에 MotionEvent를 입력합니다.
3. computeCurrentVelocity(int unit)
   입력된 데이타를 기반으로 속도를 측정합니다. unit은 측정 시간 단위이며 1은 1밀리초를, 1000은 1초를 의미합니다. 다시 말해 unit이 1이라면 1밀리초동안의 픽셀단위의 이동 거리를 측정합니다.
4. getXVelocity()
   X축으로의 속도를 구합니다. Y축으로의 속도는 getYVelocity()를 사용하면 됩니다. 
5. recycle()
   객체를 재사용할 수 있도록 초기화 합니다.
   드래깅 속도 측정은 빈번하게 일어나는 연산입니다. 하지만 이를 위해서 각각의 OnTouchListener가 VelocityTracker의 인스턴스를 하나씩 점유하는 것은 분명 낭비입니다.(안드로이드는 임베디드 시스템을 위한 운영체제임!) 따라서 VelocityTracker 객체의 생성은 팩토리 메소드에 위임하고 객체는 사용 후 반환합니다. 그러면 결과적으로 VelocityTracker 객체 하나가 모든 드래깅 동작에 공유되어 사용될 수 있습니다. 




출처 : http://anddev.tistory.com/16




Posted by injunech
2016.09.14 01:20



# String to Int



 int numInt = Integer.parseInt(numStr);


 


# Int to String



 String numStr2 = String.valueOf(numInt);
 



Posted by injunech
2016.03.25 00:56


android TextView setTextSize 할 때, default 설정은 sp 이며
px로 입력하려면 아래와 같이 설정한다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="typo14">9sp</dimen>
</resources>


setTextSize(TypedValue.COMPLEX_UNIT_SP, 9);
setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.typo14));
textview_msg.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);

출처:

http://stackoverflow.com/questions/6784353/inconsistency-when-setting-textview-font-size-in-code-and-in-resources



Posted by injunech
2016.01.14 22:33


[Android] EditText 키보드 엔터(Enter)키 기능 변경


안드로이드에서 EditText에 텍스트를 입력할 때 소프트 키보드의 엔터키가 상황에 따라 다르게 나타나는 것을 종종 볼 수 있습니다. 예를 들어 아래의 그림처럼 인터넷 브라우져 주소창이면 '이동' 또는 '검색' 으로, 검색창이면 '검색'으로, 정보 입력창이면 '완료' 등을 볼 수 있죠. 이렇게 소프트 키보드의 엔터키를 상황에 맞게 바꿔주는 방법에 대해서 알아보도록 하겠습니다.





엔터키를 변경하기 위해서는 우선 EditText가 존재하는 xml에서 imeOptions와 inputType 어트리뷰트를 설정해줍니다. 예시는 엔터키를 '검색'으로 바꾼 예입니다.


xml 코드 예시


<EditText

...

android:imeOptions="actionSearch"

android:inputType="text"

/>


Java 코드 예시


editText.setImeOptions(EditorInfo.IME_ACTION_SEARCH);

editText.setInputType(InputType.TYPE_CLASS_TEXT);


imeOptions 에 적용될 수 있는 어트리뷰트는 다음과 같습니다.


xml 코드


android:imeOptions="normal"     // 특별한 의미 없음

android:imeOptions="actionUnspecified"     // 특별한 의미 없음

android:imeOptions="actionNone"     // 특별한 의미 없음

android:imeOptions="actionGo"     // '이동'의 의미 (예 : 웹 브라우져에서 사용)

android:imeOptions="actionSearch"     // '검색'의 의미 (예 : 네이버 검색창)

android:imeOptions="actionSend"     // '보내기'의 의미 (예 : 메세지 작성시 사용)

android:imeOptions="actionNext"     // '다음'의 의미 (예 : 회원가입시 다음 필드로 이동시)

android:imeOptions="actionDone"     // '완료'의 의미 (예 : 정보 입력창)

android:imeOptions="actionPrevious"     // '이전'의 의미 (예 : 회원가입시 이전 필드로 이동시) - API11부터 가능


Java 코드


EditorInfo.IME_ACTION_NONE    // 특별한 의미 없음

EditorInfo.IME_ACTION_UNSPECIFIED    // 특별한 의미 없음

EditorInfo.IME_ACTION_GO     // '이동'의 의미 (예 : 웹 브라우져에서 사용)

EditorInfo.IME_ACTION_SEARCH     // '검색'의 의미 (예 : 네이버 검색창)

EditorInfo.IME_ACTION_SEND     // '보내기'의 의미 (예 : 메세지 작성시 사용)

EditorInfo.IME_ACTION_NEXT     // '다음'의 의미 (예 : 회원가입시 다음 필드로 이동시)

EditorInfo.IME_ACTION_DONE     // '완료'의 의미 (예 : 정보 입력창)

EditorInfo.IME_ACTION_PREVIOUS     // '이전'의 의미 (예 : 회원가입시 이전 필드로 이동시) - API11부터 가능


위와 같이 작성해주고 Java 코드 에서 EditText에 OnEditorActionListener 인터페이스를 연결해줘야합니다.


editText.setOnEditorActionListener(new OnEditorActionListener() { 

@Override

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

switch (actionId) {

case EditorInfo.IME_ACTION_SEARCH:

Toast.makeText(getApplicationContext(), "검색", Toast.LENGTH_LONG).show();

break;

default:

Toast.makeText(getApplicationContext(), "기본", Toast.LENGTH_LONG).show();

return false;

}

return true;

}

});


여기까지 다 완료 해주면 소프트 키보드의 엔터키가 검색으로 바뀌고 클릭 되었을 때 이벤트를 받아 올 수 있습니다.







Posted by injunech
2015.11.29 22:36


startActivityForResult() 메서드를 실행시킬 경우 Activity로 돌아올 때 onResume() 메서드와 onActivityResult() 메서드의  우선순위는?

먼저 Activity의 생명 주기를 확인해보겠습니다.



사진 찍기 이후와 갤러리를 다녀오고 난 다음에 Activity로 돌아와 onActivityResult() 메서드가 실행되는 것을 로그로 찍어 봤는데 다음과 같은 경우가 있었습니다.

Case 1

onPause()
onStop()
————————— (갤러리나 사진을 찍으러 다녀옴)
onActivityResult()
onRestart()
onStart() ← Point View
onResume() ← Point View

Case 2

onPause()
onStop()
————————— (갤러리나 사진을 찍으러 다녀옴)
onRestart()
onActivityResult()
onStart() ← Point View
onResume() ← Point View

Case 3

onPause()
onStop()
onDestroy()
————————— (갤러리나 사진을 찍으러 다녀옴)
onCreate()
onStart() ← Point View
onActivityResult()
onResume() ← Point View

정리

뭔가 일정하지 않습니다. 하지만 정리해보면 아래와 같습니다.

onActivityResult() 메서드는

  1. onStart() 메서드 전·후로 실행 된다.
  2. onResume() 메서드 전에 꼭 실행 된다.

결론

onResume() 메서드는 Activity로 돌아올 경우 꼭 실행이 되는 메서드입니다. startActivityForResult() 메서드를 실행시킬 경우 Activity로 돌아올 때onResume() 메서드와 onActivityResult() 메서드 중 어떤 것이 우선순위가 있는 것인지 확인해보지 않고서는 헷갈리기 쉬운 부분 입니다.

로그를 찍어 확인해 봤으니 이젠 잊지 말아야겠네요. (잊을까봐 여기에 정리해놓습니다… 흑…)

startActivityForResult() 메서드가 먼저 실행되고 onResume() 메서드가 나중 실행된다!




Posted by injunech