Movsar Bekaev
Movsar Bekaev

Reputation: 908

DialogFragment's weird behavior

I spent all day trying to make this up, but I can't..

This is the problem: I want an yes/no AlertDialog that doesn't disappear on orientation change, so I decided to use DialogFragment.

So I prepared the code and for the first use, everything with it is just perfect, but if I hit the button (that should show the dialog) once more (second, third and further times) the dialog doesn't show up! Though I can see from logs it actually makes instances and I have no errors, it's there, I just can't see it!

If I fold the app, or turn off / on the screen (I believe it's about calling onResume() method) the dialogs shows up, all of them (depending how much time I hit the button), it seems like a some displaying issue or refreshing problem maybe.. I don't know, so I came here hoping to get some help.

About my code:

I have a ListView with custom adapter, and in that adapter I have the code to show the an AlertDialog (DialogFragment) - as part of an ImageButton onClickListener.

The code for DialogFragment that I use:

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

The code for calling the dialog to show up (within the custom ListView adapter):

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

The additional functions:

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

Upvotes: 1

Views: 167

Answers (1)

Movsar Bekaev
Movsar Bekaev

Reputation: 908

It was all due to the line:

  ActAudiorecords.this.onCreate(null);

So after calling onCreate() with null as savedInstance it have been removing link to the DialogFragment (as I can understand), it was the line for refreshing the Activity, I solved the problem by splitting the code in onCreate() to which should be called only once (at a start of Activity) and the part that should be called in every refreshing point (such as GUI settings and etc).

I believe I could also save the current Bundle and pass it to onCreate() instead of null and it would work as good as now, but I thought that calling an function is much better for data updating than calling onCreate() over and over, so that's it, thank you all who wanted to help.

Upvotes: 1

Related Questions