2014-09-26 15 views
11
android.util.AndroidRuntimeException: requestFeature() must be called before adding content 

ottengo questo errore quando usorequestFeature() deve essere chiamato prima di aggiungere contenuti in Frammento

getActivity().getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); 

dal frammento. Voglio cambiare lo stile della barra delle azioni solo in questo frammento. Quindi non posso impostare questo in MainActivity. Come risolvere questo?

Ho visto questa domanda requestFeature() must be called before adding content non dice come risolvere questo problema da un frammento

+1

prima di chiamare setContentView() si dovrebbe mettere 'getActivity() getWindow() requestFeature (Window.FEATURE_ACTION_BAR_OVERLAY);..' –

+0

http://stackoverflow.com/questions/4250149/requestfeature-must-be-called- prima-aggiunta-contenuto – raja

+0

È in un frammento. – Sunny

risposta

1

Dovete chiamare getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); prima della setContentView() nel metodo di attività onCreate(). Devi aggiungere questa linea nel tuo FragmentActivity da dove viene chiamato il tuo Fragment.

+0

C'è più di un frammento.Voglio questa funzionalità solo in un particolare frammento.Quindi, se questa funzione è impostata nell'attività padre, tutti gli altri frammenti hanno questa funzione – Sunny

+0

@Sunny per cui devi creare un tema personalizzato e applicarlo al tuo frammento classe – Piyush

1

requestFeature() deve essere chiamato prima dello setContentView() nella propria attività. Chiamare getActivity().getWindow().requestFeature() da Frammento è una cattiva pratica. Se si desidera ritardare la visibilità della barra delle azioni, si consiglia di nascondere la barra di azione in & nella barra delle azioni & e visualizzarla nel frammento nel numero .

+1

Voglio rendere una barra di azione trasparente solo in questo frammento – Sunny

+0

devi ricreare la tua attività in quel caso, o usare qualche customview invece della barra di azione nativa – Akhil

+0

C'è un cassetto di navigazione.Questa visualizzazione personalizzata non è possibile – Sunny

1

È necessario creare un'attività separata per questo frammento e quindi requestFeature() su tale attività prima di setContentView() poiché requestFeature() è il metodo di android.view.Window. Le funzionalità della finestra sono per l'attività specifica. È possibile manipolare i comportamenti della finestra per un frammento specifico dell'attività non specifico.

4

Indipendentemente dalle persone che rispondono, questi problemi vengono ancora visualizzati se si utilizza AppCompatActivity come genitore dell'attività.

Per me questo codice genera errore: ​

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_PROGRESS); 
    setContentView(R.layout.activity_browser); 
} 
  • Test 1: MyActivity extends Activity ==> Lavorato
  • Test 2: MyActivity extends AppCompatActivity ==> Error requestFeature"() deve essere chiamato prima di aggiungere contenuti nell'attività "

La soluzione per Test 2 (se si utilizza Appcompat) è chiamare requestFeatureprima dellosuper.onCreate. Risolverà il tuo problema.

+0

Questo risolve il problema. – dpaksoni

1

Ho anche ricevuto questo errore, lavorando con un DialogFragment, anche se non stavo chiamando requestFeature().

Stavo chiamando getDecorView() da onActivitiyCreate() di DialogFragment come parte di un codice di tracciamento che avevo scritto per aiutarmi a capire come e quando Windows è stato creato. Ha funzionato bene, ma un po 'più tardi nel ciclo di vita del frammento è stato chiamato il metodo onStart(). Quello chiamato Dialog's show() che alla fine ha chiamato AlertDialog's onCreate() che alla fine ha chiamato il metodo requestFeature() di PhoneWindow per richiedere Window.FEATURE_NO_TITLE.

Poiché chiamare getDecorView() "per la prima volta" blocca "le varie caratteristiche della finestra come descritto in setContentView (View, android.view.ViewGroup.LayoutParams).", Questo violava il requisito che "requestFeature() viene chiamata prima di aggiungere contenuto in Fragment "- la sottigliezza è che il contenuto veniva aggiunto indirettamente dalla mia chiamata a getDecorView().

La soluzione era chiamare peekDecorView() anziché getDecorView().

+1

Solo wow. In pratica, hai salvato la mia vita come sembra. Abbiamo riscontrato un bug nella produzione che ha bloccato l'app con "requestFeature()" stracktrace. Non siamo stati in grado di rintracciarlo negli ultimi due giorni, finché non sono incappato nel tuo post. Chiamavamo anche getDecorView sul DialogFragment. L'ho cambiato e credo che funzioni! Non sono ancora sicuro al 100% se questo risolva davvero l'intero problema in ogni modo possibile nel nostro caso, ma sembra che siamo sulla buona strada! Grazie. – battlepope

+0

Cool ... Spero tu sia riuscito a risolvere tutto :-). –

Problemi correlati