명령어 : keytool -list -v -keystore debug.keystore





두번째 방법(메소드 만들어서사용)


try {
            PackageInfo info = getPackageManager().getPackageInfo("your.package.name", PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (NameNotFoundException e) {
         e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
         e.printStackTrace();
        }
    }



'Developer > Android' 카테고리의 다른 글

lombok 어노테이션으로 getter/setter을 없애기  (0) 2016.12.07
touch evnet flow  (0) 2016.11.10
setWillNotDraw(false)  (0) 2016.11.10
유용한 라이브러리  (0) 2016.11.05
include merge 태그 차이점  (0) 2016.10.25


1. 그래들 추가

compile 'org.projectlombok:lombok:1.16.6'

compile 'javax.annotation:jsr250-api:1.0'



2.플러그인 설치하기



3.사용법


@Data

EqualsAndHashCode(callSuper=false)


'Developer > Android' 카테고리의 다른 글

해시키 뽑아오는 방법  (0) 2017.02.24
touch evnet flow  (0) 2016.11.10
setWillNotDraw(false)  (0) 2016.11.10
유용한 라이브러리  (0) 2016.11.05
include merge 태그 차이점  (0) 2016.10.25

Activity 를 하나 상속받아서 view 를 하나 만들었다고 하자. 이 때 그 view 위에서 touch 를 하게 되면 아래와 같은 경로로 event 가 전달된다.

말로 설명을 하자면, activity의 dispatchTouchEvent() 가 호출되면서 window 의 superDispatchTouchEvent(ev) 를 호출한다. 이 superDispatchTouchEvent() 가 최상위에 있는 Dispatch 해주는 녀석이라고 봐도 무방할 듯 하다. 아무튼 이 녀석으로부터 시작해서 child 의 dispatchTouchEvent(event) 를 호출하고, 그 child 의 child 의 dispatchTouchEvent(event)를 호출하고, 또 그 child의 child 의 child 의 dispatchTouchEvent(event)를 호출한다. 이런 식으로 쭉 밑으로 내려 가다보면, View 의 dispatchTouchEvent(event) 로 가게 되고, 여기서 최종적으로 View 의 OnTouchEvent() 를 호출하게 된다.

하지만 참고로 Window 가 가장 밑에 있는 녀석을 이야기 하는 것이다. 가장 마지막의 child 가 가장 상위의 widget 이 되는 것이다.


출처 : http://i5on9i.blogspot.kr/2012/12/ontouch-ontouchevent.html

'Developer > Android' 카테고리의 다른 글

해시키 뽑아오는 방법  (0) 2017.02.24
lombok 어노테이션으로 getter/setter을 없애기  (0) 2016.12.07
setWillNotDraw(false)  (0) 2016.11.10
유용한 라이브러리  (0) 2016.11.05
include merge 태그 차이점  (0) 2016.10.25


ViewGroup을 상속하여 onDraw()를 override하면,
invalidate()시에 onDraw()가 호출되지 않는다.

왜, 그럴까?

ViewGroup은 뭔가를 그리는 기능이 아니라, child view를 관리하는 객체이기 때문이다.
그래서, 그려질 필요가 있을때는 dispatchDraw (Canvas canvas)가 호출된다.

그래도 그리고 싶을때는 어떻게 해야 할 까?
setWillNotDraw(false)를 추가하면 onDraw()가 호출되고 해당 부분을 그리면 된다.

왜, 이렇게 했을까?

setWillNotDraw()는 최적화를 위한 메쏘드다. ViewGroup과 같이 관리만 하는 것은
draw 부분을 skip하려는 것이다.

[출처] [삽질 금지] 왜 onDraw()가 호출되지 않는 이유는?|작성자 이카이


'Developer > Android' 카테고리의 다른 글

lombok 어노테이션으로 getter/setter을 없애기  (0) 2016.12.07
touch evnet flow  (0) 2016.11.10
유용한 라이브러리  (0) 2016.11.05
include merge 태그 차이점  (0) 2016.10.25
custom view 만들기  (0) 2016.10.03

gdg 커니님 세션


UI

- Android Onboarder
- TapTargetView
- Xalligraphy

Network & Image

- Retrofit & Okhttp
- Glide
- Fresco

'Developer > Android' 카테고리의 다른 글

touch evnet flow  (0) 2016.11.10
setWillNotDraw(false)  (0) 2016.11.10
include merge 태그 차이점  (0) 2016.10.25
custom view 만들기  (0) 2016.10.03
[Android] 문자열로 Resource 가져오기  (0) 2016.09.16

xml를 사용하다 보면 include 해서 뷰를 포함한다.


포함하게 되면 include  특성상 뷰 그룹안에 담아야 해서 뷰계층 부하시킨다.


mrege를 하게 되면 태그는 없어지고 딱 붙게된다.


단 선언된 id가 사라지게 된다. ㅠㅠ

'Developer > Android' 카테고리의 다른 글

setWillNotDraw(false)  (0) 2016.11.10
유용한 라이브러리  (0) 2016.11.05
custom view 만들기  (0) 2016.10.03
[Android] 문자열로 Resource 가져오기  (0) 2016.09.16
ViewPager 속성값  (0) 2016.09.12
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// height 진짜 크기 구하기
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = 0;
switch(heightMode) {
case MeasureSpec.UNSPECIFIED: // mode 가 셋팅되지 않은 크기가 넘어올때
heightSize = heightMeasureSpec;
break;
case MeasureSpec.AT_MOST: // wrap_content (뷰 내부의 크기에 따라 크기가 달라짐)
heightSize = 20;
break;
case MeasureSpec.EXACTLY: // fill_parent, match_parent (외부에서 이미 크기가 지정되었음)
heightSize = MeasureSpec.getSize(heightMeasureSpec);
break;
}

// width 진짜 크기 구하기
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = 0;
switch(widthMode) {
case MeasureSpec.UNSPECIFIED: // mode 가 셋팅되지 않은 크기가 넘어올때
widthSize = widthMeasureSpec;
break;
case MeasureSpec.AT_MOST: // wrap_content (뷰 내부의 크기에 따라 크기가 달라짐)
widthSize = 100;
break;
case MeasureSpec.EXACTLY: // fill_parent, match_parent (외부에서 이미 크기가 지정되었음)
widthSize = MeasureSpec.getSize(widthMeasureSpec);
break;
}


Log.w(Constants.TAG,"onMeasure("+widthMeasureSpec+","+heightMeasureSpec+")");

setMeasuredDimension(widthSize, heightSize);
}


'Developer > Android' 카테고리의 다른 글

유용한 라이브러리  (0) 2016.11.05
include merge 태그 차이점  (0) 2016.10.25
[Android] 문자열로 Resource 가져오기  (0) 2016.09.16
ViewPager 속성값  (0) 2016.09.12
배경이 투명한 액티비티 만들기  (0) 2016.09.06

문자열로 해당 Resource (혹은 레이아웃에 포함된 View) 의 ID 값을 가져온다;

-----------------------------------------------------------------
getResources().getIdentifier(파일명디렉토리명패키지명);
또는,
getResources().getIdentifier(패키지명:디렉토리/파일명nullnull);
으로도 가능하다.
-----------------------------------------------------------------

String resName = "@drawable/imgEnd";
String packName = this.getPackageName(); // 패키지명
int resID = getResources().getIdentifier(resName, "drawable", packName);

String viewName = "imgViewEnd";
String packName = this.getPackageName(); // 패키지명
int resID = getResources().getIdentifier(resName, "id", packName);


주로 리소스/ 뷰의 이름을 조합형식으로 만들어 가져와야 할 경우에
이 같은 코드를 사용하여 처리할 수 있다.


예를 들어,

for (int i=0; i < 3; i++) {
    String resName = "@drawable/img_" + i;
    // 결론적으로 이미지 리소스 이름은 img_1, img_2, img_3 이 되겠다;
    int resID = getResources().getIdentifier(resName, "drawable", packName);

    ImageView iv = (ImageView)findViewById(R.id.imgView);
    iv.setImageResource(resID); // 이미지뷰의 이미지를 설정한다;
}

이렇게 사용이 가능하다.

ViewPager.SCROLL_STATE_SETTLING : 마지막 위치에 도달

ViewPager.SCROLL_STATE_IDLE : 스크롤이 정지되어 있는 상태
ViewPager.SCROLL_STATE_DRAGGING : 스크롤 상태가 드래그 될때


등록방법




매니페스트와 스타일 추가

<activity android:name=".Main3Activity" android:theme="@style/Theme.AppCompat.Translucent" />
<style name="Theme.AppCompat.Translucent">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>

타이틀 바 없애기


supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main3);

ranslucent Background Activity


액티비티에 다음 테마속성을 적용

<activity android:name=".notify.NotifyActivity" android:theme="@android:style/Theme.Translucent"/>



AppCompat의 경우, themes.xml에 테마를 만든 후 이를 android:theme="@style/Theme.AppCompat.Translucent"로 사용

<style name="Theme.AppCompat.Translucent">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>


+ Recent posts