결론은 비동기냐 아니냐 차이


popBackStack


Added in API level 11

void popBackStack ()

Pop the top state off the back stack. This function is asynchronous -- it enqueues the request to pop, but the action will not be performed until the application returns to its event loop.



popBackStackImmediate


Added in API level 11

boolean popBackStackImmediate (int id, 

                int flags)

Like popBackStack(int, int), but performs the operation immediately inside of the call. This is like calling executePendingTransactions() afterwards.

Posted by 빈솔B
,

http://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/

Posted by 빈솔B
,

오랫만에 포스팅이다

최근에 앱 업데이트를 진행하다가

안하던 짓을 했다.

기존에 manifest 파일에 minSdkVersion="8" 만 세팅해서 쓰다가 아래의 이클립스 warning 경고가 눈에 거슬려 

<uses-sdk> tag should specify a target API level (the highest verified version; when running on later versions, compatibility behaviors may be enabled) with android:targetSdkVersion="?"

뭐 별일 있겠냐 싶어서 targetSdkVersion="14"로 설정했다. 단순히 나는 target을 "이 앱은 해당 버전에 최적화 되었습니다." 라고 이해하고서는 말이다.

배포를 하고나니 플레이어 재생시 가로세로 전환마다 동영상 재생이 재시작 되는 버그가 나타났다.


오. 마. 이. 갓.;


소스에 문제로 우선 판단하고 디버깅했으나 별다는 이상 여부 없었다. 혹시나 하는 맘에 해당 targetSdkVersion을 빼보니 정상 동작;;; 뭐지 이거 단순한 알림 개념이 아니었나;

레퍼런스를 찾아봤다.

http://developer.android.com/guide/topics/manifest/uses-sdk-element.html 


android:targetSdkVersion
An integer designating the API Level that the application targets. If not set, the default value equals that given to minSdkVersion.


앱이 타킷으로 하는 API 레벨을 지정된 상수코드란다. 지정하지 않으면 minSdkVersion과 동일시 한단다. 그렇구나. 기존에는 API레벨이 8로 지정되어 쓰이다가 14로 바뀌면서 MediaPlayer 작동방식이 바뀐게 있나보다;

여튼 다시 해당 속성은 빼고 정상화 시키도록 했고, 미디어 재생 프로세스는 바뀐게 뭐가 있는지 또 찾아봐야겠다.


결론은...  targetSdkVersion 제대로 알고 확인하고 쓰자!!!

Posted by 빈솔B
,
라이브러리에서 제공하는 기본 체크박스 이미지 대신 다른 이미지를 쓰고 싶다면
아래와 같이 setBackgroundResource 아닌 setButtonDrawable 값으로 사용하면 된다.

CheckBox deleteCheckBox = ((CheckBox)view.findViewById(android.R.id.checkbox));
deleteCheckBox.setButtonDrawable(R.drawable.btn_check_off); (o)
deleteCheckBox.setBackgroundResource(R.drawable.btn_check_off); (x)

XML로는
android:button="@drawable/button_img"

Posted by 빈솔B
,
안드로이드 폰.. 이젠 정말 종류가 너무나 많아졌다.. 우려했던 일 만큼 유지보수 비용이 늘어나고 있다..
아이폰에 비해 취약점 중에 하나이다. 기회가 많은 만큼 할 일은 많아진다;;;

tv팟도 늘어나는 단말기마다 대응하려니 이것저것 예외사항이 많아진다. 개발자 입장으로서 제일 싫은게;; 예외 처리이다.. 이럴때면 아이폰 개발자가 부럽다;;
여튼 이렇게 단말기 마다 대응하고자 할때 실행되는 단말의 모델네임을 가져올 필요가 생기게 된다.
아주 간단하다.

import android.os.Build;
System.out.println("modelName is :"+Build.MODEL);
System.out.println("device is :"+Build.DEVICE);
System.out.println("ProductName is :"+Build.PRODUCT);

예로들어 
삼성 갤럭시S는 SHW-M110S
삼성 갤럭시A는 SHW-M100S
넥서스원은 Nexus One
등등.. 으로 나온다.

이건 소스에서 확인방법이고 단말에서 설정>휴대전화정보>모델 번호로 바로 확인할 수도 있다.

Posted by 빈솔B
,
안드로이드 tv팟 개발하다가 안 사실인데 쿼티 자판 있는 모델은 슬라이드시에 Destory() 콜을 하더군요
그래서 페이지가 refresh가 자동으로 되는 현상이 나타납니다. 심지어는 동영상 재생시 슬라이스를 하면 동영상이 다시 처음부터 재생되는 현상이 나타나더군요.

그래서 처음엔 슬라이스시에 호출되는 메소드가 가로모드, 세로모드 전환시 호출되는 메소드가 같을 꺼라 생각하고 관련 자료를 찾아보니 아래와 같인 메소를 찾을 수 있었습니다. 

@Override
public void onConfigurationChanged(Configuration newConfig) {
System.out.print("test");
switch(newConfig.orientation){
case Configuration.ORIENTATION_LANDSCAPE:
System.out.print("가로");
return;
case Configuration.ORIENTATION_PORTRAIT:
System.out.print("세로");
return;
}
super.onConfigurationChanged(newConfig);
}

하지만 위의 메소드는 가로세로 모드 전환시에만 호출되지 슬라이스와는 상관이 없던 메소드더군요 그래서 구글링을 더 해본 결과 Manifest.xml 설정을 통해 슬라이드시 환경변화 작업을 무시하도록 아래와 같이 설정가능함을 발견했습니다.

<activity android:name=".ClipView" android:label="Media/MediaPlayer"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"      
android:configChanges="keyboardHidden|orientation" >
</activity>

자세한 사항은 아래주소를 참고하세요.
 
Posted by 빈솔B
,
출처: http://groups.google.com/group/android-developers/browse_thread/thread/0df67cbbf391acf0

ListView 사용시 스크롤링을 하게 되면 배경생이 변한다. 배경색이 변하는 것을 막고 싶으면 아래와 같이 처리한다.

onLayoutXml
<ListView android:id="@android:id/list"
...
    android:scrollingCache="false"
...
/>

onCode
ListView list = new ListView(this);
list.isScrollingCacheEnabled();

Go on next~
Posted by 빈솔B
,

리스트 뷰와 같은 형태에서 스크롤이 생길때 아래, 위로 그림자 형태가 생기는 현상을 없애는 방법


on Xml layout

<ListView android:id="@android:id/list"

...

android:fadingEdge = "none" 

...

/>


on Code

ListView clipsList;

list.setVerticalFadingEdgeEnabled(false);


이하 안드로이드 문서 내용 발췌 

Defines which edges should be fadeded on scrolling.

Must be one or more (separated by '|') of the following constant values.

ConstantValueDescription
none 0x00000000 No edge is faded.
horizontal 0x00001000 Fades horizontal edges only.
vertical 0x00002000 Fades vertical edges only.

This corresponds to the global attribute resource symbol fadingEdge.


참조문서:
http://www.androidpub.com/63175
Posted by 빈솔B
,
EditText 내에 쓰여지는 스트링 구문을 오른쪽, 중앙, 왼쪽 정렬을 하고 싶으시면 아래와 같이 하면됩니다.

On xml layout
android:gravity="right" 

On code
EditText content = new EditText(this);
...
content.setGravity(Gravity.RIGHT);
...

별탈없이 잘될겁니다.
Posted by 빈솔B
,
가상 키보드를 강제로 보이게 하고 또 안보이게 하는 방법입니다.

InputMethodManager imm;

@Override
public void onCreate(Bundle icicle) {
TimerTask myTask = new TimerTask(){
public void run(){
imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); imm.showSoftInput(getCurrentFocus(), InputMethodManager.SHOW_FORCED);
}
};
Timer timer = new Timer();
timer.schedule(myTask, 500);


@Override
protected void onPause() {
super.onPause(); imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}

위의 액티비티가 포어그라운드로 실행될 때 InputMethodService 의 참조를 얻어서 가상 키패드를 보여주는 메소드를 차례로 호출하고 있습니다. 그리고 위 액티비티가 백그라운드로 실행되면 onPouse를 내에 가상 키패드를 감추는 메소드를 호출하게 되어있습니다.

어려운 것은 없지만 왜 타이머 안에 구현되어 있느냐가 중요합니다.
 기본적으로 키보드는 OS 단에서 지원되는 것이기때문에 아무곳에나 붙이기는 어렵습니다. 그리고 액티비티 생성시 바로 호출하게되면 뜨지 않습니다.(제 생각엔, 아마 내부적으로 onCreate 작업의 막바지거나 끝나고 수행되는듯 합니다.) 그래서 타이머나 핸들러로 약간의 딜레이 주는 작업이 불가피합니다.


Posted by 빈솔B
,