我刚发现我的一个旧应用程序出现了对话框问题。它正在使用actionbarsherlock。在应用程序中,一些对话框没有在android v4 +上显示。我想更新应用程序,但我无法将应用程序迁移到AppCompat,因为它会有很多工作。
单击列表项时显示对话框
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String selected = titles[position];
if (selected.equals(first)) {
showAudioSourceDialog();
} else if (selected.equals(second)) {
showAudioEncoderDialog();
} else if (selected.equals(third)) {
showSamplingRateDialog();
} else if (selected.equals(fourth)) {
showAudioBitrateDialog();
} else if (selected.equals(fifth)) {
showAudioFormatDialog();
} else if (selected.equals(sixth)) {
showAudioChannelDialog();
} else if (selected.equals(seventh)) {
showAudioBackgroundRecordingDialog();
}
}
仅显示编码器和格式拨号,但其他人工作正常。 这就是我展示对话框的方式
private void showAudioFormatDialog() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = AudioFormatDialog.newInstance();
newFragment.show(ft, "dialog");
}
private void showAudioBitrateDialog() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = AudioBitrateDialog.newInstance();
newFragment.show(ft, "dialog");
}
private void showAudioEncoderDialog() {
// DialogFragment.show() will take care of adding the fragment
// in a transaction. We also want to remove any currently showing
// dialog, so make our own transaction and take care of that here.
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = AudioEncoderDialog.newInstance();
newFragment.show(ft, "dialog");
}
这些是我的对话框片段类
public static class AudioEncoderDialog extends SherlockDialogFragment {
public static AudioEncoderDialog newInstance() {
AudioEncoderDialog frag = new AudioEncoderDialog();
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final AlertDialog levelDialog;
CharSequence[] items = null;
int option = getAudioEncoderOption();
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.FROYO) {
items = new CharSequence[] { "AMR_NB(Narrowband)" };
} else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD_MR1) {
items = new CharSequence[] { " AMR (Narrowband)",
" AMR (Wideband)", "AAC Low Complexity (AAC-LC)" };
} else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN) {
items = new CharSequence[] { " AMR_NB(Narrowband)",
" AMR (Wideband)", "AAC Low Complexity (AAC-LC)",
"Enhanced Low Delay AAC (AAC-ELD)",
"High Efficiency AAC (HE-AAC)" };
}
// Creating and Building the Dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Choose your Audio Encoder");
levelDialog = builder.create();
builder.setSingleChoiceItems(items, option,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
switch (item) {
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
}
levelDialog.dismiss();
}
});
return builder.create();
}
}
public static class AudioBitrateDialog extends SherlockDialogFragment {
public static AudioBitrateDialog newInstance() {
AudioBitrateDialog frag = new AudioBitrateDialog();
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final AlertDialog levelDialog;
int option = getAudioBitrateOption();
// Strings to Show In Dialog with Radio Buttons
final CharSequence[] items = { " 8Bit ", " 16Bit" };
// Creating and Building the Dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Choose your Audio Bitrate");
levelDialog = builder.create();
builder.setSingleChoiceItems(items, option,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
switch (item) {
case 0:
dismiss();
break;
case 1:
break;
}
levelDialog.dismiss();
}
});
return builder.create();
}
}
显示音频比特率对话框,但未显示编码器对话框,似乎两者的代码几乎完全相同。如何显示所有对话框?
这就是我希望它在每台设备上显示的方式:
这是它在我的nexus 5和Android 4.4模拟器上的显示方式:
答案 0 :(得分:0)
在AudioEncoderDialog.onCreateDialog
范围内,您显然没有处理KitKat的情况,这是您正在测试的设备。