我花了一整天时间试图解决这个问题,但我不能......
这是问题所在:我希望肯定/不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
使用不同的代码,但这没关系。答案 0 :(得分:1)
这完全归功于这条线:
ActAudiorecords.this.onCreate(null);
因此,在将onCreate()
作为savedInstance
调用后,它已删除了DialogFragment
的链接(据我所知),这是刷新活动的行,我通过将onCreate()中的代码拆分为仅应调用一次(在Activity的开头)和应在每个刷新点调用的部分(例如GUI设置等)来解决问题。
我相信我也可以保存当前的Bundle并将其传递给onCreate()而不是null,它会像现在一样好用,但我认为调用函数比调用onCreate()更好地进行数据更新这就是它,感谢所有想要帮助的人。