DialogFragment的奇怪行为

时间:2015-08-05 12:56:03

标签: android android-dialogfragment

我花了一整天时间试图解决这个问题,但我不能......

这是问题所在:我希望肯定/不AlertDialog在方向更改时不会消失,所以我决定使用DialogFragment

所以我准备了代码,第一次使用 ,所有内容都很完美,但是如果我按下按钮(应该再显示对话框) (第二次,第三次和更多次)对话框不会出现!虽然我可以从日志中看到它实际上是实例并且我没有错误,它就在那里,我只是看不到它!

如果我折叠应用程序,或者关闭/在屏幕上显示(我相信它是关于调用onResume()方法),会显示对话框,所有这些对话框(取决于按下按钮的时间) ,这似乎是一些显示问题或令人耳目一新的问题。我不知道,所以我来到这里希望得到一些帮助。

关于我的代码:

我有 ListView 自定义适配器,在该适配器中,我有代码显示AlertDialog DialogFragment ) - 作为ImageButton onClickListener的一部分。

我使用的DialogFragment代码:

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

调用对话框以显示的代码(在自定义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;
    }

附加功能:

  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!");
}
  • 我的代码中没有onResume()
  • 我尝试为DialogFragment使用不同的代码,但这没关系。

1 个答案:

答案 0 :(得分:1)

这完全归功于这条线:

  ActAudiorecords.this.onCreate(null);

因此,在将onCreate()作为savedInstance调用后,它已删除了DialogFragment的链接(据我所知),这是刷新活动的行,我通过将onCreate()中的代码拆分为仅应调用一次(在Activity的开头)和应在每个刷新点调用的部分(例如GUI设置等)来解决问题。

我相信我也可以保存当前的Bundle并将其传递给onCreate()而不是null,它会像现在一样好用,但我认为调用函数比调用onCreate()更好地进行数据更新这就是它,感谢所有想要帮助的人。