programing

Android Fragment on Attach()는 더 이상 사용되지 않습니다.

powerit 2023. 8. 11. 22:41
반응형

Android Fragment on Attach()는 더 이상 사용되지 않습니다.

최신 지원 라이브러리(버전 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 기기에서 테스트를 해보니 Attach(Context)가 호출되고 있습니다.

몇 주 전에 열어본 버그 보고서와 구글 직원들의 답변을 보려면 여기를 클릭하십시오.

활동은 컨텍스트이므로, 단순히 컨텍스트가 활동인지 확인하고 필요한 경우 캐스트할 수 있습니다.

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

    Activity a;

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

}

업데이트: 일부에서는 새 제품이Context재정의가 호출되지 않습니다.저는 몇 가지 테스트를 해봤지만 이것이 사실인 시나리오를 찾을 수 없으며 소스 코드에 따르면 절대 사실이 되어서는 안 됩니다.모든 SDK23 이후, 이후,Activity 리고그고.Context의버전의 onAttach호출되었습니다.그렇지 않은 시나리오를 찾을 수 있다면 문제를 설명하는 샘플 프로젝트를 만들어 안드로이드 팀에 보고하는 것이 좋습니다.

업데이트 2: Android 지원 라이브러리 조각은 버그가 더 빨리 수정될 때만 사용합니다.재정의가 올바르게 호출되지 않는 위의 문제는 프레임워크 조각을 사용하는 경우에만 밝혀지는 것 같습니다.

이것은 구글의 또 다른 큰 변화입니다...수정 : replace 제수사: 교체onAttach(Activity activity)와 함께onAttach(Context context)그 이후로 이전 API에서 내 앱을 크래시했습니다.onAttach(Context context)네이티브 fragment에서는 호출되지 않습니다.

네이티브 fragment(안드로이드.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
    }
}

fragment를 , "fragment"라는 SDK를 합니다.OnAttach(Context context)불리지 않을 것입니다.

대신 되어 있고, 지조사때기문사대용않수고것정되이는신지하에원각을하용▁i,.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)호출되지 않는 일부 전화기(예: 샤오미 레드미 노트 2)가 있으므로 NullPointer가 발생합니다.예외.따라서 안전한 쪽으로 가기 위해 사용되지 않는 방법도 사용할 것을 제안합니다.

// 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으로 설정합니다.

아래 답변은 Android 개발자 웹 사이트의 Fragments 튜토리얼에서 발생하는 이 사용 중지 경고와 관련이 있으며 위의 게시물과 관련이 없을 수 있습니다.

튜토리얼 수업에서 이 코드를 사용했는데 작동했습니다.

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

    Activity activity = getActivity();

저는 문서에 명시된 대로 활동이 무효가 될 수도 있다고 걱정했습니다.

작업 가져오기

FragmentActivity getActivity () 이 조각이 현재 연결되어 있는 FragmentActivity를 반환합니다.조각이 대신 컨텍스트와 연결된 경우 null을 반환할 수 있습니다.

그러나 main_activity의 onCreate는 fragment가 로드되었음을 분명히 보여주기 때문에 이 메서드 이후에 fragment에서 get activity를 호출하면 main_activity 클래스가 반환됩니다.

getSupportFragmentManager().beginTransaction().add(R.id .firstFragment).커밋(commit) »;

내가 이것에 대해 옳기를 바랍니다.저는 완전 초보자입니다.

사용 중일 것입니다.android.support.v4.app.Fragment대신 이를 위해onAttach메소드, 그냥 사용getActivity()을 얻기 위해FragmentActivity조각이 연관된 것입니다.그렇지 않으면 당신은onAttach(Context context)방법.

이것은 사용자가 인터페이스 'TopSectionListener'를 정의했을 때 도움이 되었습니다. 이 인터페이스의 개체 활동 명령어는 다음과 같습니다.

  //This method gets called whenever we attach fragment to the activity
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    Activity a=getActivity();
    try {
        if(context instanceof Activity)
           this.activitycommander=(TopSectionListener)a;
    }catch (ClassCastException e){
        throw new ClassCastException(a.toString());}

}

언급URL : https://stackoverflow.com/questions/32083053/android-fragment-onattach-deprecated

반응형