2016-03-21 15 views
9

Ho letto alcuni articoli e risposte (incluso this one) riguardo al codice deprecato, ma sono un po 'confuso su come gestire (in particolare) il gestore di eventi Fragment obsoleto onInflate.Qual è il modo corretto di gestire gli eventi Fragment deprecati su Attacco e onInflate

ho sostituito il mio attuazione

public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) 

con

public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) 

Se eseguo la mia applicazione su una macchina < API23, il codice di sostituzione non viene chiamato.

Se ripristino il codice deprecato originale (in modo che ora entrambi i metodi siano implementati), viene chiamato il codice deprecato, restituisce funzionalità corrette, ma una chiamata viene ora eseguita su un metodo deprecato (?).

E quando eseguo l'app su una macchina API23, sembra che ENTRAMBI le versioni del gestore siano chiamate.

Quindi la domanda è, cosa sta succedendo qui? Se sto scrivendo un codice che dovrebbe essere eseguito su entrambe le versioni API23 e precedenti, devo implementare i metodi deprecati e quelli nuovi?

E se questo è il caso, ho bisogno di dare la caccia e implementare altri metodi deprecati "just in case"? (E, di conseguenza, v'è un elenco di questi metodi deprecati a "back-code" per?)


UPDATE:

Ora ho cambiato da utilizzare android.app.Fragment-android.support.v4.app.Fragment (cioè dal nativo frammenti per supportare i frammenti) e l'app si sta comportando come previsto, con il codice del gestore sostitutivo in esecuzione per tutte le versioni e sta passando attraverso la sorgente Android come previsto.

Ma la domanda rimane: PERCHÉ?

Perché è l'implementazione "nativa" android.app.Fragment **** ed è attiva? Ripercorrendo le domande precedenti, questo problema è stato discusso a settembre 2015. Quindi perché è ancora un problema? E perché dovrebbe esserci una differenza nell'implementazione del supporto e dei frammenti nativi dopo l'API 11?

+0

Grazie per la modifica del deprecato a deprecato. Non mi ero mai reso conto di essere così dislessico! :) – SimonH

risposta

2

No, non si dovrebbe implementare

public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) 

Quando un metodo è deprecato, è possibile (in genere) tranquillamente utilizzare la funzione di sostituzione, invece. Controllare le definizioni di Frammento di onInflate:

public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) { 
     mCalled = true; 
     final Activity hostActivity = mHost == null ? null : mHost.getActivity(); 
     if (hostActivity != null) { 
      mCalled = false; 
      onInflate(hostActivity, attrs, savedInstanceState); 
     } 
    } 

@Deprecated 
    public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { 
     mCalled = true; 
    } 

Come si può vedere, onInflate(Context context...) è un'estensione del onInflate(Activity activity...) ed è compatibile. Chiamando super.onInflate(context, attrs, savedInstanceState); all'interno del metodo sottoposto a override, è possibile presumere che funzionerà su entrambe le versioni API23 e precedenti.

Se non corro la mia applicazione su una macchina < API23, il codice di sostituzione è chiamato.

Questo sembra strano, non riesco a riprodurlo, il mio log viene eseguito con un codice come questo in una macchina non-V23:

@Override 
public void onInflate(Context context, AttributeSet attrs, 
            Bundle savedInstanceState) { 
     super.onInflate(context, attrs, savedInstanceState); 
     Log.w(TAG, "I'm being executed"); 
    } 

Assicurarsi che:

  1. Si sta importando la versione di supporto di Fragment, android.support.v4.app.Fragment anziché android.app.Fragment e che si utilizza getSupportFragmentManager() anziché getFragmentManager().
  2. di avere le ultime librerie di support-v4 e appcompat-v7 così come compileSdkVersion 23 nel vostro build.gradle

E quando faccio funzionare l'applicazione su una macchina API23, sembra che entrambi i versioni del gestore sono chiamati.

Questo può essere spiegato con il codice onInflate(Context context...), dove se si chiama da un'attività, chiamate onInflate(Activity activity...)

EDIT

Per quanto riguarda l'aggiornamento:

nativo attuazione android.app.Fragment isn' t dovrebbe essere compatibile all'indietro. Il codice di android.app.Fragment è in genere molto più semplice di quello di android.support.v4.app.Fragment a causa di ciò.

Inoltre, ci sono alcune funzionalità nell'implementazione nativa che non possono essere introdotte nella libreria di supporto o perché è difficile da progettare o perché non è una priorità per gli sviluppatori. Per esempio. Nell'implementazione nativa, nel codice sorgente onInflate() c'è qualche uso di Transition per animare l'entrata o l'uscita del nuovo frammento. Questo non si trova da nessuna parte nella libreria di supporto.

+0

Grazie per aver preso la briga di rispondere. Posso capire perché entrambe le versioni del gestore sono chiamate per v23. Tuttavia, non ricevo ancora alcuna chiamata al gestore sostitutivo per le versioni pre-v23. Stranamente ricevo un messaggio di registro "I/dalvikvm: Impossibile trovare il metodo android.app.Fragment.onInflate, riferito al metodo OdometerFragment.onInflate" che sembra strano. Questo e il fatto che passare attraverso il codice di Android Fragment mostra le linee di codice sbagliate mi fa pensare che non abbia l'ultima versione di qualcosa. – SimonH

+0

Assicurati che: 1) stai importando la versione di supporto di Fragment, android.support.v4.app.Fragment invece di android.app.Fragment e che fai uso di getSupportFragmentManager() invece di getFragmentManager(). 2) di avere le ultime librerie di support-v4 e appcompat-v7 e compileSdkVersion 23 nel build.gradle. – Sevle

+0

Grazie per l'ulteriore consiglio. Ho provato a cambiare i frammenti di "supporto" ieri sera e mi ha risolto il problema. Ho aggiornato la domanda di conseguenza. Sono ancora piuttosto perplesso sul motivo per cui l'implementazione nativa e di supporto sono differenti. Sembra un casino da qualche parte per me. Sì, il mio problema specifico è risolto ma 'app.android.Fragment' non è – SimonH

Problemi correlati