8

Ho frammento di finestra di dialogo. Ho intenzione di usare questo frammento nell'attività e nel dialogo. E sovrascrivo il metodo onCreateDialog e onCreateView. qui è la codifica.AndroidRuntimeException: requestFeature() deve essere chiamato prima di aggiungere contenuto

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.interval_time_popup, null); 
     setup(view, false); 
     return view; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     View view = getActivity().getLayoutInflater().inflate(R.layout.interval_time_popup, null); 

     builder.setTitle("Interval Time"); 
     builder.setView(view); 
     setup(view, true); 
     builder.setPositiveButton("Set", new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface dialog, int which) { 
       listener.setOnIntervalTime(hourNp.getValue(), minNp.getValue()); 
       dismiss(); 
      } 
     }); 
     builder.setNegativeButton("Cancel", new OnClickListener() { 

      public void onClick(DialogInterface dialog, int which) { 
       dismiss(); 
      } 
     }); 
     return builder.create(); 
    } 

Io uso questo frammento nella classe di attività come quella.

  SelectTimeIntervalDialogFragment fragment = new SelectTimeIntervalDialogFragment(); 
      fragment.setHrMin(hr, min); 
      Bundle args = new Bundle(); 

      FragmentTransaction t = getSupportFragmentManager().beginTransaction(); 
      t.replace(R.id.shift_period_interval_layout, fragment); 
      t.commit(); 

Lo chiamo da un'altra attività del genere.

  if((getResources().getConfiguration().screenLayout & 
          Configuration.SCREENLAYOUT_SIZE_NORMAL) == 
          Configuration.SCREENLAYOUT_SIZE_NORMAL){ 
         Intent intent = new Intent(ShiftPeriodActivity.this, SelectIntervalActivity.class); 
         intent.putExtra("intervalHr", speriod.intervalHr); 
         intent.putExtra("intervalMin", speriod.intervalMin); 
         startActivityForResult(intent, 1); 
        } else { 
         FragmentManager fm = getSupportFragmentManager(); 
         intervalDialog = new SelectTimeIntervalDialogFragment(); 
         intervalDialog.setHrMin(speriod.intervalHr, speriod.intervalMin); 
         intervalDialog.show(fm, "interval_fragment"); 
        } 

Ho due condizioni. Quando la dimensione dello schermo è normale, chiama l'attività che include la finestra di dialogo dei frammenti. Altrimenti chiama la finestra di dialogo popup. Ho ottenuto l'eccezione quando chiama la finestra di dialogo popup. Diceva requestFeature() must be called before adding content. Posso usare così? Mi piacerebbe sapere come superare questo.

Grazie.

+0

dovresti chiamarlo prima richiestaFunzione prima di setcontentView() –

+0

Se il problema è risolto ?? – Subburaj

+2

Probabilmente 'setup()' chiama 'requestFeature()' - si chiama 'setup()' in entrambi in 'onCreateView()' e 'onCreateDialog()'. (Lo so, vecchia domanda, ma è arrivato nelle code di revisione.) – laalto

risposta

-3

penso che si stia utilizzando requestWindowFeature(); at on create

usarlo prima di setContentView (R.layout.activity);

+0

Ho ottenuto l'eccezione quando chiamo la finestra di dialogo popup. – user1156041

15

Sembra che il tuo problema sia esattamente lo stesso del mio - codice ish simile e la stessa eccezione generata.

La soluzione è fare ciò che @laalto ha suggerito: utilizzare onCreateView() o onCreateDialog() ma non entrambi allo stesso tempo. So che l'eccezione può essere apparentemente causata da molte cose diverse, ma questo è ciò che ha aiutato nel mio caso; speriamo che possa aiutare qualcun altro in futuro :)

+0

e se avessi bisogno di entrambi i metodi? –

+0

Non sono sicuro che sia la cosa giusta da fare, secondo questo: "Le implementazioni dovrebbero sostituire questa classe e implementare onCreateView (LayoutInflater, ViewGroup, Bundle) per fornire il contenuto della finestra di dialogo. In alternativa, possono sovrascrivere onCreateDialog (Bundle) per creare una finestra di dialogo interamente personalizzata, ad esempio un AlertDialog, con il proprio contenuto. " (da: http://developer.android.com/reference/android/app/DialogFragment.html). – JakeP

+1

Lo stesso link menziona inoltre: "Invece di (o in aggiunta a) l'implementazione di onCreateView (LayoutInflater, ViewGroup, Bundle) per generare la gerarchia delle viste all'interno di una finestra di dialogo, è possibile implementare onCreateDialog (Bundle) per creare il proprio oggetto di dialogo personalizzato. " Tuttavia, facendo ciò, il cosiddetto "AndroidRuntimeException: requestFeature() deve essere chiamato prima di aggiungere il contenuto" Quindi i documenti o l'API sono difettosi ... –

Problemi correlati