1

J'essaie d'utiliser un sélecteur de temps personnalisé, puis d'exécuter le sélecteur à partir d'un fragment. Voici le code pour la boîte de dialogue de sélection de l'heure (TimePickerFragment.java):Chargement de timePickerDialog à partir d'un fragment

package com.ravit.android.aroundtheclock; 

import android.app.Dialog; 
import android.app.DialogFragment; 
import android.app.Fragment; 
import android.app.TimePickerDialog; 
import android.os.Bundle; 
import android.text.format.DateFormat; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TimePicker; 

import java.util.Calendar; 

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { 


    public TimePickerFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Use the current time as the default values for the picker 

     final Calendar calendar = Calendar.getInstance(); 
     int hour = calendar.get(Calendar.HOUR_OF_DAY); 
     int minute = calendar.get(Calendar.MINUTE); 

     // Create a new instance of TimePickerDialog and return it 
     return new TimePickerDialog(getActivity(), this, hour, minute, 
       DateFormat.is24HourFormat(getActivity())); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_time_picker, container, false); 
    } 

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
     // Do something with the time chosen by the user 
    } 
} 

ce qui est le code du fragment onCreateView qui montre le sélecteur de temps (WorkdayFragment.java):

mButtonEnd = (Button)v.findViewById(R.id.end_workday); 
mButtonEnd.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     TimePickerFragment dialog = new TimePickerFragment(); 
     dialog.show(getActivity().getFragmentManager(), DIALOG_TIME); 
    } 
}); 

Cette est l'erreur que je reçois en appuyant sur le bouton. Il semble que il y a un problème de chargement de la vue:

10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime: FATAL EXCEPTION: main 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime: Process: com.ravit.android.aroundtheclock, PID: 20325 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime: android.util.AndroidRuntimeException: requestFeature() must be called before adding content 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at com.android.internal.policy.PhoneWindow.requestFeature(PhoneWindow.java:317) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at com.android.internal.app.AlertController.installContent(AlertController.java:231) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.AlertDialog.onCreate(AlertDialog.java:423) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.Dialog.dispatchOnCreate(Dialog.java:394) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.Dialog.show(Dialog.java:295) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.DialogFragment.onStart(DialogFragment.java:499) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.Fragment.performStart(Fragment.java:2244) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1002) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.BackStackRecord.run(BackStackRecord.java:793) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:482) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:739) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:148) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5417) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
10-25 16:24:46.696 20325-20325/com.ravit.android.aroundtheclock E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Je pense qu'il ya un problème avec la façon dont le code de sélecteur de temps est écrit parce que quand je remplacerai avec sélecteur de date alors tout fonctionne sans erreurs.

J'ai essayé de résoudre l'erreur requestFeature() en fonction d'autres réponses à ce sujet sans progression.

Tout conseil sur la façon de continuer à partir d'ici serait très utile. Merci!

+0

Je vois pourquoi vous devez remplacer la méthode onCreateView de DialogFragment. Vous avez déjà renvoyé la boîte de dialogue du sélecteur de minuterie. –

+0

Vous avez raison, problème résolu :) – Ravit

Répondre

2

Hey tout d'abord, vous devez supprimer l'onCreateView de votre fragment de timepicker. Je pourrais aussi trouver dans l'exemple partager avec moi.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) {...} 

Ainsi, votre TimerPickerFragment devrait ressembler à ceci

package com.ravit.android.aroundtheclock; 

import android.app.Dialog; 
import android.app.DialogFragment; 
import android.app.Fragment; 
import android.app.TimePickerDialog; 
import android.os.Bundle; 
import android.text.format.DateFormat; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TimePicker; 

import java.util.Calendar; 

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { 


    public TimePickerFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Use the current time as the default values for the picker 

     final Calendar calendar = Calendar.getInstance(); 
     int hour = calendar.get(Calendar.HOUR_OF_DAY); 
     int minute = calendar.get(Calendar.MINUTE); 

     // Create a new instance of TimePickerDialog and return it 
     return new TimePickerDialog(getActivity(), this, hour, minute, 
       DateFormat.is24HourFormat(getActivity())); 
    } 

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
     // Do something with the time chosen by the user 
    } 
} 

Attention: Si votre application prend en charge les versions d'Android inférieures à 3,0, être -vous que vous appelez getSupportFragmentManager() pour acquérir une instance de FragmentManager. Assurez-vous également que votre activité qui affiche le sélecteur de temps étend FragmentActivity au lieu de la classe d'activité standard .

mButtonEnd = (Button)v.findViewById(R.id.end_workday); 
mButtonEnd.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     DialogFragment newFragment = new TimePickerFragment(); 
     //newFragment.show(getActivity().getFragmentManager(), DIALOG_TIME); 
     newFragment.show(getSupportFragmentManager(), DIALOG_TIME); 
     // if you are using the nested fragment then user the 
     //newFragment.show(getChildFragmentManager(), DIALOG_TIME); 
    } 
}); 

Laissez-moi savoir si vous avez des questions. merci

+0

J'ai une question, pourquoi avez-vous utilisé le getSupportFragmentManager au lieu de getActivity(). GetFragmentManager()? – Ravit

+0

Si votre application prend en charge des versions d'Android inférieures à 3.0, veillez à appeler getSupportFragmentManager() pour acquérir une instance de FragmentManager. d'autre part, il est de trouver si vous utilisez par défaut Fragment Manager, –

+0

Merci beaucoup pour votre aide :) – Ravit