더 이상 사용되지 않는 Android Fragment onAttach () activity) 지금은 : onAttach (Context context) 앱에서 지원 중단

최신 지원 라이브러리 (버전 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)가 호출됩니다.

몇 주 전에 개설 한 버그 보고서와 Google 직원의 답변을 보려면 여기 를 클릭 하십시오 .



답변

활동은 컨텍스트이므로 컨텍스트가 활동인지 간단히 확인하고 필요한 경우 캐스트하십시오.

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    Activity a;

    if (context instanceof Activity){
        a=(Activity) context;
    }

}

업데이트 : 일부는 새로운 Context재정의가 호출되지 않았다고 주장합니다 . 나는 몇 가지 테스트를했는데 이것이 사실 인 시나리오를 찾을 수 없으며 소스 코드에 따르면 결코 진실해서는 안됩니다. SDK23 이전과 이후에 테스트 한 모든 경우에 ActivityContext버전 과 버전이 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()(에 onAttachFragment)하지만, 확인하는 것을 잊지 마세요 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으로 설정