최신 지원 라이브러리 (버전 23.0.0)를 사용하도록 앱을 업데이트했는데 Fragment 클래스의 onAttach () 함수가 더 이상 사용되지 않는다는 것을 알았습니다.
대신에:
onAttach (Activity activity)
지금은 :
onAttach (Context context)
앱에서 지원 중단 이전에 전달 된 활동을 사용함에 따라 가능한 해결책은 다음과 같습니다.
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = getActivity();
}
그것이 올바른 방법일까요?
최신 정보:
API가 23보다 낮은 장치를 실행하면 새로운 onAttach ()가 호출되지 않습니다. 이것이 그들이 의도 한 바가 아니길 바랍니다!
업데이트 2 :
SDK의 최신 업데이트로 문제가 해결되었습니다.
API 22 장치에서 테스트했으며 onAttach (Context)가 호출됩니다.
답변
활동은 컨텍스트이므로 컨텍스트가 활동인지 간단히 확인하고 필요한 경우 캐스트하십시오.
@Override
public void onAttach(Context context) {
super.onAttach(context);
Activity a;
if (context instanceof Activity){
a=(Activity) context;
}
}
업데이트 : 일부는 새로운 Context
재정의가 호출되지 않았다고 주장합니다 . 나는 몇 가지 테스트를했는데 이것이 사실 인 시나리오를 찾을 수 없으며 소스 코드에 따르면 결코 진실해서는 안됩니다. SDK23 이전과 이후에 테스트 한 모든 경우에 Activity
의 Context
버전 과 버전이 onAttach
모두 호출되었습니다. 그렇지 않은 시나리오를 발견하면 문제를 설명하는 샘플 프로젝트를 작성 하여 Android 팀에보고 하는 것이 좋습니다 .
업데이트 2 : 버그가 더 빨리 수정되므로 Android 지원 라이브러리 조각 만 사용합니다. 프레임 워크 조각을 사용하는 경우 재정의가 올바르게 호출되지 않는 위의 문제 만 나타납니다.
답변
이것은 Google의 또 다른 큰 변화입니다 … 제안 된 수정 : 기본 조각에서 호출되지 않으므로 이전 API에서 내 앱 onAttach(Activity activity)
이 onAttach(Context context)
충돌로 바뀝니다 onAttach(Context context)
.
네이티브 조각 (android.app.Fragment)을 사용하고 있으므로 이전 API (<23)에서 다시 작동하게하려면 다음을 수행해야했습니다.
여기 내가 한 일이 있습니다.
@Override
public void onAttach(Context context) {
super.onAttach(context);
// Code here
}
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
// Code here
}
}
답변
프레임 워크 조각을 사용하고 장치의 SDK 버전이 23보다 낮 으면 OnAttach(Context context)
호출되지 않습니다.
대신 지원 조각을 사용하므로 사용 중단이 수정되어 onAttach(Context context)
항상 호출됩니다.
답변
현재 onAttach
조각 코드 Context
에서 현재 활동 인지는 확실하지 않습니다 . 소스 코드
public void onAttach(Context context) {
mCalled = true;
final Activity hostActivity = mHost == null ? null : mHost.getActivity();
if (hostActivity != null) {
mCalled = false;
onAttach(hostActivity);
}
}
당신이 보면 getActivity
당신은 같은 전화를 볼 수 있습니다
/**
* Return the Activity this fragment is currently associated with.
*/
final public Activity getActivity() {
return mHost == null ? null : mHost.getActivity();
}
그래서 당신은 당신이 활동 후 사용 받고 있는지 싶은 경우 getActivity()
(에 onAttach
에 Fragment
)하지만, 확인하는 것을 잊지 마세요 null
경우 때문 mHost
입니다 null
활동이 될 것입니다null
답변
@Override
public void onAttach(Context context) {
super.onAttach(context);
Activity activity = context instanceof Activity ? (Activity) context : null;
}
답변
대부분의 경우 충분할 것 같지만 onAttach(Context)
호출되지 않는 전화 (예 : Xiaomi Redme Note 2)가 있으므로 NullPointerExceptions이 발생합니다. 따라서 안전한면을 유지하기 위해 더 이상 사용되지 않는 방법을 남겨 두는 것이 좋습니다.
// onAttach(Activity) is necessary in some Xiaomi phones
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
_onAttach(activity);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
_onAttach(context);
}
private void _onAttach(Context context) {
// do your real stuff here
}
답변
SDK 관리자와 함께 최신 지원 라이브러리를 다운로드하고 포함
compile 'com.android.support:appcompat-v7:23.1.1'
gradle.app에서 컴파일 버전을 API 23으로 설정