OnGlobalLayoutListener : 지원 중단 및 호환성
OnGlobalLayoutListener
개체 를 사용 하고 리스너를 제거하려면 다음 코드로 해결하는 사용되지 않는 메서드에 문제가있었습니다.
protected void onCreate(Bundle savedInstanceState) {
final LinearLayout llTotal = (LinearLayout) findViewById(R.id.mmc_ll);
ViewTreeObserver vto = llTotal.getViewTreeObserver();
if(vto.isAlive()){
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//
// mycode
//
if (Build.VERSION.SDK_INT<16) {
removeLayoutListenerPre16(llTotal.getViewTreeObserver(),this);
} else {
removeLayoutListenerPost16(llTotal.getViewTreeObserver(), this);
}
}
});
}
super.onCreate(savedInstanceState);
}
@SuppressWarnings("deprecation")
private void removeLayoutListenerPre16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
observer.removeGlobalOnLayoutListener(listener);
}
@TargetApi(16)
private void removeLayoutListenerPost16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
observer.removeOnGlobalLayoutListener(listener);
}
맞습니까? 호환성을 처리하는 더 좋은 방법이 있습니까?
API 10으로 에뮬레이터에서 코드를 실행하면 LogCat에 다음 경고가 표시됩니다.
04-24 09:30:12.565: I/dalvikvm(471): Could not find method android.view.ViewTreeObserver.removeOnGlobalLayoutListener, referenced from method com.my.project.ActivityHome.removeLayoutListenerPost16
04-24 09:30:12.565: W/dalvikvm(471): VFY: unable to resolve virtual method 2950: Landroid/view/ViewTreeObserver;.removeOnGlobalLayoutListener (Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V
내가 어떤 식 으로든 고쳐야하는 것을 무시할 수 있습니까?
내 프로젝트에서 이것을 사용하고 있습니다.
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if (Build.VERSION.SDK_INT < 16) {
v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
}
당신과 비슷해 보입니다. 다른 장치 (4.2.2 및 2.3.3)에서 테스트되었으며 완벽하게 실행됩니다. 그것이 유일한 방법 인 것 같습니다 .... 다른 것을 찾으면 나는 그것을 알고 싶습니다. 행운을 빕니다
나는 올바른 방법이 사용 Build.VERSION.SDK_INT
하고 있다고 생각합니다 Build.VERSION_CODES
.
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
}
mView.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
//noinspection deprecation
mView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
//
// mycode
//
}
});
Of course that check the Android version and call the correct method is much more prudent, but if you take a look on the Android source code you can see something interesting:
@Deprecated
public void removeGlobalOnLayoutListener(OnGlobalLayoutListener victim) {
removeOnGlobalLayoutListener(victim);
}
This code was snipped from API 18
According to the docs:
This method was deprecated in API level 16. Use #removeOnGlobalLayoutListener instead
Works like a charm.
참고URL : https://stackoverflow.com/questions/16189525/ongloballayoutlistener-deprecation-and-compatibility
'developer tip' 카테고리의 다른 글
SQL Azure 데이터베이스의 이름을 바꾸시겠습니까? (0) | 2020.10.28 |
---|---|
장고 파일 필드 삭제 (0) | 2020.10.28 |
테두리를 축소하는 방법 (div에서)? (0) | 2020.10.28 |
npm / yeoman 설치-sudo없이 각진 생성기 (0) | 2020.10.28 |
Python : 런타임에 메서드 및 속성 변경 (0) | 2020.10.28 |