Domanda Android Fragment onAttach () deprecato


Ho aggiornato la mia app per utilizzare l'ultima libreria di supporto (versione 23.0.0), ho scoperto che hanno deprecato la funzione onAttach () della classe Fragment.

Invece di:

onAttach (Activity activity)

Nevica:

onAttach (Context context)

Poiché la mia app utilizza l'attività passata prima della deprecazione, una possibile soluzione è:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    activity = getActivity();
}

Sarebbe il modo corretto di farlo?

AGGIORNARE:

Se eseguo un dispositivo con API inferiore a 23, il nuovo onAttach () non viene nemmeno chiamato. Spero che questo non sia quello che intendevano fare!

AGGIORNAMENTO 2:

Il problema è stato risolto con gli ultimi aggiornamenti dell'SDK.

Ho provato il mio dispositivo API 22 e onAttach (Context) viene chiamato.

Clic Qui seguire il bug report che ho aperto un paio di settimane fa e le risposte dei ragazzi di Google.


272
2017-08-18 21:40


origine


risposte:


L'attività è un contesto, quindi se puoi semplicemente controllare il contesto è un'attività e lanciarla se necessario.

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

    Activity a;

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

}

Aggiornare: Alcuni stanno sostenendo che il nuovo Context l'override non viene mai chiamato. Ho fatto alcuni test e non riesco a trovare uno scenario in cui questo è vero e secondo il codice sorgente, non dovrebbe mai essere vero. In tutti i casi ho provato, sia pre che post SDK23, entrambi i Activity e il Context versioni di onAttach erano chiamati. Se riesci a trovare uno scenario in cui questo non è il caso, ti suggerisco di creare un progetto di esempio che illustri il problema e segnalalo al team di Android.

Aggiornamento 2: Uso sempre solo i frammenti della libreria di supporto Android poiché gli errori vengono risolti più velocemente lì. Sembra che il problema precedente, in cui le sostituzioni non vengano chiamate correttamente, venga alla luce solo se si utilizzano i frammenti del framework.


291
2017-08-19 06:55



Questo è un altro grande cambiamento da parte di Google ... La modifica suggerita: sostituire onAttach(Activity activity) con onAttach(Context context) da quando ho interrotto le mie app su API precedenti onAttach(Context context) non sarà chiamato su frammenti nativi.

Sto usando i frammenti nativi (android.app.Fragment) quindi ho dovuto fare quanto segue per farlo funzionare di nuovo su API meno recenti (<23).

Ecco cosa ho fatto:

@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
    }
}

39
2018-01-12 15:03



Se si utilizzano i frammenti del framework e la versione dell'SDK del dispositivo è inferiore a 23, OnAttach(Context context) non sarebbe stato chiamato

Io uso invece i frammenti di supporto, quindi la deprecazione è fissa e onAttach(Context context) viene sempre chiamato.


37
2017-09-17 12:00



Attualmente dal onAttach Frammento di codice, non è chiaro se il Context è l'attività corrente: Codice sorgente

public void onAttach(Context context) {
    mCalled = true;
    final Activity hostActivity = mHost == null ? null : mHost.getActivity();
    if (hostActivity != null) {
        mCalled = false;
        onAttach(hostActivity);
    }
}

Se darai un'occhiata a getActivity vedrai la stessa chiamata

/**
 * Return the Activity this fragment is currently associated with.
 */
final public Activity getActivity() {
    return mHost == null ? null : mHost.getActivity();
}

Quindi, se vuoi essere sicuro di ottenere l'attività, allora usa getActivity() (in onAttach nel tuo Fragment) ma non dimenticare di controllare null perchè se mHost è null la tua attività sarà null


9
2017-08-23 10:49



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

    Activity activity = context instanceof Activity ? (Activity) context : null;
}

5
2017-10-02 23:04



Scarica la più recente libreria di supporto con il gestore sdk e includi

compile 'com.android.support:appcompat-v7:23.1.1'

in gradle.app e imposta la versione compilata su api 23


3
2017-11-25 19:05



La risposta di seguito è correlata a questo avviso di deprecazione che si verifica nell'esercitazione Fragments sul sito Web degli sviluppatori Android e potrebbe non essere correlato ai post precedenti.

Ho usato questo codice nella lezione del tutorial e ha funzionato.

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

    Activity activity = getActivity();

Ero preoccupato che l'attività fosse nullo come afferma la documentazione.

getActivity

FragmentActivity getActivity () Restituisce FragmentActivity a cui questo frammento è attualmente associato. Può restituire null se il frammento è associato a un Contesto.

Ma onCreate su main_activity mostra chiaramente che il frammento è stato caricato e quindi, dopo questo metodo, richiamare l'attività get dal frammento restituirà la classe main_activity.

getSupportFragmentManager (). beginTransaction ()                     .add (R.id.fragment_container, firstFragment) .commit ();

Spero di essere corretto con questo. Sono un novizio assoluto.


1
2017-10-24 08:02



probabilmente stai usando android.support.v4.app.Fragment. Per questo invece di onAttach metodo, basta usare getActivity() prendere il FragmentActivity con cui il frammento è associato. Altro che potresti usare onAttach(Context context) metodo.


1
2017-11-10 07:57