2015-08-05 2 views
1

J'ai passé toute la journée à essayer de faire ça, mais je ne peux pas ..comportement bizarre de DialogFragment

C'est le problème: Je veux un oui/non AlertDialog qui ne disparaît pas sur le changement d'orientation, donc j'ai décidé d'utiliser DialogFragment.

Je prépare le code et pour la première utilisation, tout avec il est tout simplement parfait, mais si je frappe le bouton (qui devrait afficher la boîte de dialogue) une fois de plus (deuxième, troisième et d'autres fois) le dialogue ne s'affiche pas! Bien que je puisse voir à partir de journaux, il fait effectivement des instances et je n'ai pas d'erreurs, c'est là, je ne peux pas le voir!

Si je plie l'application ou activer/désactiver l'écran (je crois qu'il est à appeler la méthode onResume()) les boîtes de dialogue apparaît, tous (selon combien de temps je frappe le bouton), il semble comme un problème d'affichage ou un problème rafraîchissant peut-être .. Je ne sais pas, alors je suis venu ici en espérant obtenir de l'aide.

A propos de mon code:

J'ai un ListView avec adaptateur sur mesure, et dans cet adaptateur je le code pour montrer un AlertDialog (DialogFragment) - dans le cadre d'un ImageButtononClickListener.

Le code pour DialogFragment que j'utilise:

public static class cMyDialogFragment extends DialogFragment { 

    public static cMyDialogFragment newInstance(int title) { 
     cMyDialogFragment frag = new cMyDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putInt("title", title); 
     frag.setArguments(args); 
     return frag; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     int title = getArguments().getInt("title"); 
     this.setCancelable(true); 
     setRetainInstance(true); 

     return new AlertDialog.Builder(getActivity()) 
       // .setIcon(R.drawable.alert_dialog_icon) 
       .setTitle(title) 
       .setPositiveButton(R.string.yes, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           ((ActAudiorecords) getActivity()).doPositiveClick(); 
          } 
         } 
       ) 
       .setNegativeButton(R.string.no, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           ((ActAudiorecords) getActivity()).doNegativeClick(); 
          } 
         } 
       ) 
       .create(); 
    } 
} 

Le code pour appeler la boîte de dialogue de se présenter (dans l'adaptateur sur mesure ListView):

public View getView(final int position, View convertView, ViewGroup parent) { 

     View vi = convertView; 
     if (vi == null) 
      vi = inflater.inflate(R.layout.recordings_row, null); 

     TextView tvDate = (TextView) vi.findViewById(R.id.tv_Recordings_r_date); 
     tvDate.setText(ainfo.get(position).getDate()); 

     ImageButton ibtn_play = (ImageButton) vi.findViewById(R.id.ibtnPlay); 
     final String localPath = dPath + File.separator + ainfo.get(position).getFName(); 

     ImageButton ibtn_remove = (ImageButton) vi.findViewById(R.id.ibtnRecordings_r_remove); 
     ibtn_remove.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       curFName = ainfo.get(position).getFName(); 
       curID = ainfo.get(position).getID(); 

       showDialog(); 
      } 
     }); 


     ibtn_play.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       play(localPath); 
      } 
     }); 

     return vi; 
    } 

Les fonctions supplémentaires:

void showDialog() { 
    DialogFragment newFragment = cMyDialogFragment.newInstance(
      R.string.do_you_want_to_remove_the_file); 
    newFragment.show(getFragmentManager(), "dialog"); 
} 

public void doPositiveClick() { 
    // Do stuff here. 
    ps_db.delete(const_audiorecords_tname, "id = " + curID, null); 
    new File(dPath + File.separator + curFName).delete(); 
    Toast.makeText(ActAudiorecords.this, getString(R.string.audiorecord_has_been_removed), Toast.LENGTH_LONG).show(); 
    ActAudiorecords.this.onCreate(null); //Restarting the Activity to refresh the LV 

    Log.i("FragmentAlertDialog", "Positive click!"); 
} 

public void doNegativeClick() { 
    // Do stuff here. 
    Toast.makeText(ActAudiorecords.this, getString(R.string.the_operation_has_been_cancelled), Toast.LENGTH_LONG).show(); 

    Log.i("FragmentAlertDialog", "Negative click!"); 
} 
  • Je n'ai pas onResume() dans mon code.
  • J'ai essayé d'utiliser des codes différents pour DialogFragment mais cela n'a pas d'importance.
+0

C'est un problème lié à la mise en page. vérifiez votre 'recordings_row' –

+0

Je vois, mais pour quel problème je devrais le vérifier? –

+0

vérifier votre principal 'Root Layout' également vérifier la hauteur et la largeur de l'attribut –

Répondre

1

Il était dû à la ligne:

ActAudiorecords.this.onCreate(null); 

Alors après avoir appelé onCreate() avec null comme savedInstance il a été enlève lien vers le DialogFragment (comme je peux comprendre), ce fut la ligne rafraîchissante l'activité, J'ai résolu le problème en divisant le code dans onCreate() à appeler une seule fois (au début de l'activité) et la partie qui devrait être appelée dans chaque point de rafraîchissement (comme les paramètres de l'interface graphique, etc.) . Je crois que je pourrais aussi enregistrer l'ensemble actuel et le passer à onCreate() au lieu de null et cela fonctionnerait comme maintenant, mais je pensais qu'appeler une fonction est beaucoup mieux pour la mise à jour des données que l'appel onCreate() encore et encore, c'est tout, merci à tous ceux qui voulaient aider.