8

Mam fragment okna dialogowego. Mam zamiar wykorzystać ten fragment w aktywności i dialogu. I przesłonię metodę onCreateDialog i onCreateView. tutaj jest kodowanie.Wyjątek AndroidRuntimeException: funkcja requestFeature() musi zostać wywołana przed dodaniem zawartości

@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(); 
    } 

Używam tego fragmentu w klasie aktywności w ten sposób.

  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(); 

Dzwonię z innej działalności podobnej do tej.

  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"); 
        } 

Mam dwa warunki. Gdy rozmiar ekranu jest normalny, wywołuje on aktywność, która zawiera dialog fragmentu. W przeciwnym razie wywoła okno dialogowe. Dostałem wyjątek, kiedy wywołuje okno podręczne. Powiedział requestFeature() must be called before adding content. Czy mogę używać w ten sposób? Chciałbym wiedzieć, jak sobie z tym poradzić.

Dzięki.

+0

powinieneś się nazywać first requestFeature przed setcontentView() –

+0

Czy twój problem rozwiązany? – Subburaj

+2

Prawdopodobnie 'setup()' wywołuje 'requestFeature()' - wywołujesz 'setup()' zarówno w 'onCreateView()' jak i 'onCreateDialog()'. (Wiem, stare pytanie, ale pojawiły się w kolejkach opinii.) – laalto

Odpowiedz

-3

Myślę, że używasz requestWindowFeature(); at na tworzenie

używać go przed setContentView (R.layout.activity);

+0

Mam wyjątek, gdy wywołuję wyskakujące okno dialogowe. – user1156041

15

Wygląda na to, że Twój problem jest dokładnie taki sam jak mój - podobny kod i ten sam wyjątek zgłoszony.

Rozwiązaniem jest zrobienie tego, co zasugerował @laalto: używaj albo onCreateView() lub onCreateDialog(), ale nie obydwu w tym samym czasie. Wiem, że wyjątek może być pozornie spowodowany przez wiele różnych rzeczy, ale to właśnie pomogło w moim przypadku; mam nadzieję, że to pomoże komuś innemu w przyszłości :)

+0

co, jeśli potrzebujesz obu metod? –

+0

Nie jestem pewien, czy jest to słuszne, zgodnie z tym: "Implementacje powinny zastąpić tę klasę i implementować naCreateView (LayoutInflater, ViewGroup, Bundle), aby dostarczyć treść okna dialogowego .Alternatywnie, mogą one zastąpić OnCreateDialog (Bundle) stworzyć całkowicie niestandardowe okno dialogowe, takie jak AlertDialog, z własną treścią. " (od: http://developer.android.com/reference/android/app/DialogFragment.html). – JakeP

+1

To samo łącze wspomina również: "Zamiast (lub oprócz) implementacji onCreateView (LayoutInflater, ViewGroup, Bundle), aby wygenerować hierarchię widoku w oknie dialogowym, możesz zaimplementować onCreateDialog (Bundle), aby utworzyć własny niestandardowy obiekt Dialog. " Ale powoduje to, że przerażający "AndroidRuntimeException: requestFeature() musi zostać wywołany przed dodaniem zawartości" Tak więc albo dokumenty, albo interfejs API jest wadliwy ... –