[Android] 키보드 위에 레이아웃, 버튼 올리기

Posted by Find my true self Fimtrus
2016.07.26 15:52 Programming/Android

자주 작업할 때는 적용 시키기가 쉽지만,,


한동안 작업을 하지 않다가, 막상 버튼을 키보드 위에 올리려고 하면,


가물가물...



먼저 적용하려고 하는 Activity의 Manifest 정보에


android:windowSoftInputMode="adjustResize"

를 추가한다.


이 옵션은 키보드가 화면을 가렸을 때


현재 보여지는 화면의 크기로 리사이징을 할 것인지에 대한 값이다.


따라서 위의 옵션을 주게 되면 Activity 화면 크기 자체가 줄어들게 된다.


그리고 적용시킬 레이아웃 또는 버튼에 아래와 같이 추가하면 된다.




RelativeLayout에서 alignParentBottom을 주면 키보드 위로 올라오게 배치할 수 있었지만..


가끔 안먹을 때가 있어서...고민을 많이 하게 되는데.


위와 같이 적용시 간단하게 적용이 가능하다.



이 댓글을 비밀 댓글로

[Hybrid, Web] 키 입력시 숫자만 가능하도록 세팅.

Posted by Find my true self Fimtrus
2016.06.10 15:05 Programming/Hybrid App

오래만에 글 올리네요.


모바일 웹 그리고 일반적인 웹의 input tag 에서 키 입력 제어하는 방법입니다.


모바일 웹의 경우 type 으로 숫자키보드를 보이게 하거나, pattern 에 정규식을 넣어서 숫자를 제어하는 경우가 많습니다.


하지만! 가끔씩.....적용이 안되는 단말기가 있더군요. 특히 type의 경우 tel로 해놓아도 커스텀 키보드의 경우는 지원되지 않는 경우도 발생합니다.


키 입력시 자바스크립트로 제어 코드를 넣는다면 간단히 해결 가능합니다.


아래와 같은 input tag에....


<input type="tel" title="TEST용" style="width:100%; ime-mode:disabled;" maxlength="13" onkeypress="validate(event)">


onkeypress 이벤트에 validate 라는 function을 넣어주면 됩니다.


function validate() {
	if (event.keyCode >=48 && event.keyCode <= 57 ) {
		return true;
	} else {
		event.returnValue = false;
	}
}


keyCode 48~57까지가 0~9이므로, 숫자가 입력 되었을 경우, 정상적으로 동작하고,


그 이외 코드가 들어 왔을때는 returnValue를 false로 줌으로써 해당 키 입력 이벤트에 대한 값을 무시해 버립니다.


이렇게 해서 간단하게 제어가 가능합니다.



이 댓글을 비밀 댓글로

[Android] 클릭 이벤트를 뒤에 배치된 레이아웃에 전달되지 않게 하기

Posted by Find my true self Fimtrus
2015.11.27 17:22 Programming/Android

느낌은 아는데 제목을 정하기가 쉽지 않군요.


레이아웃을 작업할 때 뒤에 배치된 버튼이나 레이아웃에 대한 클릭이벤트를 무시하고 싶을 때가 있습니다.


화면 전체를 덮는 레이아웃을 만들어서 하위에 있는 이벤트를 막는 경우도 있구요.


아래의 코드를 화면 전체를 덮는 최 상단 레이아웃에 적용 시키면, 하위에 있는 레이아웃에 클릭이벤트가 전달되지 않습니다.


 


mTopLayout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});


위의 코드에서  핵심은 return 값을 true 주는 것인데 Developer 에는 아래 와 같이 적혀 있습니다.


Returns
  • True if the listener has consumed the event, false otherwise.

해석해 보면 true로 설정할 경우 이벤트를 없애고(즉, 다음에 받을 차례인 리스너들에게 전달하지 않는다는 뜻입니다),  


false 인 경우 이벤트를 넘겨준다는 말이군요.


클릭이벤트 때문에 고생하시는 분들 위의 코드를 적용해보세요~




이 댓글을 비밀 댓글로

[Javascript,Java]ReplaceAll 에서 점, dot(.) 문제 해결하기.

Posted by Find my true self Fimtrus
2015.10.08 15:37 Programming/Web

자바스크립트에는 replaceAll이 존재하지 않는데 기본으로 제공하는 것처럼 포스팅 했군요.


 replaceAll 관련 function을 추가하는 포스팅을 했었는데요.


관련 페이지를 첨부합니다.


[Javascript] 자바스크립트에서 replaceAll 하기 (Click!)


======================================================================================


자바스크립트에서 replace를 사용하였을때 점(.)이 다른 문자로 잘 치환되나,


replaceAll을 사용하였을 경우 모든 문자로 인식하는 문제점이 있다.


물론 자바에서도 마찬가지 인데, 간단하게 아래와 같이 사용하면 점(.)을 다른 문자로 치환할 수 있다.



//replaceAll 테스트
"2015.10.08".replaceAll("\\.", "/");


엔터 위에 있는 원 통화 표시 문자를 두개 넣고, 점( .) 을 입력하면,


"2015.10.08"  이 "2015/10/08"로 정상적으로 변환된다.



이 댓글을 비밀 댓글로

[Javascript] backspace, delete 키 이벤트 잡기

Posted by Find my true self Fimtrus
2015.06.08 09:33 Programming/Web

웹에는 많은 이벤트들이 존재하는데요.


흔히 키 입력이벤트를 잡아낼 때, keypress 또는 keyup 이벤트를 사용합니다.


하지만...두 이벤트들은 backspace, delete 키는 잡아내지 못한다는 점...


두 이벤트를 포함해서 잡아내고 싶을때는


"keydown" 을 사용하시면 됩니다.


아래의 필드에 키를 입력해 보시면 이벤트 차이를 알 수 있습니다.



- keypress


- keydown



이 댓글을 비밀 댓글로

[Android] 앱 캐시 제거(Webview 등)

Posted by Find my true self Fimtrus
2015.04.27 11:02 Programming/Android

오랜만에 글쓰네요..


프로젝트가 안정화 단계에 접어들다보니 포스팅할만한 내용이 없었네요.


하이브리드 앱을 제작하다보면 앱캐시로 인해 변경된 화면이 표시가 안되는 경우가 종종 있었는데요.


앱캐시를 확실하게 날릴 수 있는 코드입니다.


/**
 * 앱 캐시를 가차없이 지운다.
 */
public static void clearApplicationCache(Context context, File file) {

	File dir = null;

	if (file == null) {
		dir = context.getCacheDir();
	} else {
		dir = file;
	}

	if (dir == null)
		return;

	File[] children = dir.listFiles();
	try {
		for (int i = 0; i < children.length; i++)
			if (children[i].isDirectory())
				Util.clearApplicationCache(context, children[i]);
			else
				children[i].delete();
	} catch (Exception e) {
	}
};

어느 블로거님께서 쓰신글을 참조했는데요, recursive 하게 만드셨었는데 쓰신글 보면 함수가 완성이 덜되어 있더라구요.


그래서 수정하였습니다.


위와 같이 만들게 되면 앱캐시와 관련된 모든파일을 삭제하게 됩니다.


그러면 하이브리드에서의 캐시문제는 끝!!



참고 : http://ccdev.tistory.com/5


이 댓글을 비밀 댓글로

[Android] Notification에 큰 이미지 적용하기

Posted by Find my true self Fimtrus
2014.12.30 14:47 Programming/Android

최근에 많은 앱들이 젤리빈(Android 4.1) 버전에서 추가된 BicPictureStyle을 이용하여 


노티바에 큰 이미지를 보여주고 있다.



두손가락을 이용해 위로 드래그 하게 되면 접히고, 아래로 드래그 하면 큰이미지가 보이면서 열리게 된다.


즉..접혔을때의 컨텐츠와 열렸을때 서로 다른 컨텐츠를 지정할 수 있다.


필자는 다양한 버전을 지원하기 위해 v4 support library를 사용하였으며


해당 값들의 세팅은 임의로 지정하였다.



/**
  * 먼저 NotificationCompat Builder를 선언한다.
  *  Builder의 경우 접혔을 때 노티바에 표시할 컨텐츠를 설정한다.
  */
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
	.setSmallIcon(R.drawable.ic_launcher) //작은아이콘 세팅
	.setContentTitle(context.getResources().getString(R.string.title) ) //노티바에 표시될 타이틀
        .setContentText(context.getResources().getString(R.string.message) ) //노티바에 표시된 Description
        .setAutoCancel(true) //클릭하게 되면 사라지도록...
        .setVibrate(new long[] { 1000, 1000 }) //노티가 등록될 때 진동 패턴 1초씩 두번.
        .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE); //노티가 등록될 때 사운드와 진동이 오도록, 기본 사운드가 울리도록.

/**
  * 두 손가락으로 드래그 했을 때 표시된 컨텐츠를 설정한다.
  */
BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle(builder); //상단의 빌더를 인자로 받음..
Bitmap bigPictureBitmap  = BitmapFactory.decodeResource(context.getResources(), R.drawable.i_hero); //드래그 후 공간에 표시할 이미지.
	bigPictureStyle.bigPicture(bigPictureBitmap) //상단의 비트맵을 넣어준다.
	.setBigContentTitle(context.getResources().getString( R.string.big_title) ) //열렸을때의 타이틀
	.setSummaryText(context.getResources().getString( R.string.big_message) ); //열렸을때의 Description


위와 같이 설정을 하게 되면 기존에 드래그해도 반응이 없던 노티가


아래로 커지면서 큰이미지를 표시하게 된다.


혹시...이해가 잘안된다면 아래 샘플을 참고..



notificationSample.zip



이 댓글을 비밀 댓글로
    • 안녕하세요
    • 2015.05.11 17:00
    안드로이드 개발에 많은 도움이 되었습니다. 감사합니다.
    한 가지 질문이 있습니다 ~
    BigPictureStyle 를 이용하여 push 알림에 이미지를 추가까지 완료를 하였는데요..
    닫힌 상태로 push 알림이 와 두 손가락을 이용하여 드래그하여야 expand 가 되어 이미지가 나오는데 처음 푸시 상태에서 이미지가 열림 상태로 나오게 하는 방법이 있나요?
    • 안녕하세요

      답변이 조금 늦었네요.

      expand 관련 메쏘드는 존재하지 않는 것 같아요.

      아무래도 여러개의 앱들의 푸시가 모두 펼쳐져 있으면 유저로서 불편함을 느낄 수 있기 때문이지 않을까 생각이 드네요.

[Android] drawable 리소스를 비트맵으로 변환. drawable resource to bitmap

Posted by Find my true self Fimtrus
2014.12.26 14:45 Programming/Android

바꿀때마다 소스를 찾아봐서


글남기네요..


정말 간단한건데 자바스크립트랑 안드로이드랑 왔다갔다하니....헷갈림..



//샘플 소스
Bitmap bigPictureBitmap  = BitmapFactory.decodeResource(context.getResources(), R.drawable.i_hero);


이 댓글을 비밀 댓글로

[Javascript] 커스텀 이벤트 만들기.

Posted by Find my true self Fimtrus
2014.10.31 15:22 Programming/Web

jQuery의 경우 trigger를 통해 간단하게  커스텀이벤트를 만들 수 있다.


하지만 실제로는 약간은...복잡한 형태로 되어 있다.


- 샘플코드

var customEvent;

if (document.createEvent) {
	
	customEvent = document.createEvent("HTMLEvents");
	customEvent.initEvent("fimtrus", true, true);
} else {
	customEvent = document.createEventObject();
	customEvent.eventType = "fimtrus";
}

if (document.createEvent) {
	mtk.now.inputObj.dispatchEvent(customEvent);
} else {
	mtk.now.inputObj.fireEvent("on" + event.eventType, event);
}


위의 코드를 보면 createEvent의 존재유무로 분기를 하고 있다.


createEvent가 존재하지 않을 경우 Internet Explorer 기반의 브라우저를 사용하고 있는 것이고,


createEvent가 존재할 경우 웹킷 기반(크롬, 사파리 등.. 오페라나 파폭은 확인못해봤음...)의 브라우저를 사용하고 있다는 것이다.


익스플로러와 다른 브라우저 간의 제공 메소드가 다르기 때문에 


모든(대부분) 브라우저를 지원하기 위해서는 위와 같이 만들어야 한다.



샘플 코드를 보면 fimtrus 라는 이벤트를 만들었고 


두번째 분기문에서 해당 dom 에 이벤트를 보내게 되면 dom에 지정되어 있는 이벤트 리스너가 동작하게 된다.



만약..jQuery를 사용한다면 그냥 간단하게 한줄로...


$(dom).trigger('fimtrus') 


결론은...jQuery를 사용하면 편리하다!ㅎ




이 댓글을 비밀 댓글로
    • ㅁㅎㅁ
    • 2015.10.07 02:00
    예제가 없어서 불편

[Javascript] get으로 넘어온 파라미터를 Object 형태로 변환

Posted by Find my true self Fimtrus
2014.10.21 13:38 Programming/Web

아래와 같이 데이터가 주소에 포함되어 있을 때,


하나하나 꺼내오려면 상당히 귀찮다(어렵진 않지만...)


http://fimtrus.tistory.com/1?data1=123&data2=1234


화면이 로딩되는 시점에서 아래 function을 넣어주면 


주소에 포함되어 있는 파라미터 값들을 편하게 들고 올 수 있다.



/**
 * @author jonghyun.jeong
 * @since 2014.04.01
 * URL과 함께 넘어온 데이터들을 리턴한다.
 */
function getUrlValue( key ) {
	var valueObject = {}, hash, value;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++) {
    	hash = hashes[i].split('=');
    	valueObject[hash[0]] = hash[1];
    }
    
    if ( key ) {
    	
    	if ( valueObject[key] ) {
			return valueObject[key];
		}
    	
    	return "";
    }
    
    return valueObject;
}



getUrlValue() 처럼 인자 값을 넘기지 않을 경우 주소에 포함되어 있는 모든 데이터를 Object 형태로 리턴하고


getUrlValue("data1") 처럼 인자 값을 넘길 경우, 해당하는 키의 value만 리턴한다. 없을 경우 "" 을 리턴.



이 댓글을 비밀 댓글로