I just found that one of my old apps is having a problem with dialogs. It is using actionbarsherlock. In the app some dialogs are not displaying on android v4+. I want to update the app but I can't migrate the app to AppCompat because it would be so much work.
I am showing a dialog when a list item is clicked
@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();
}
}
Only encoder and format dialongs are not shown however others are working fine. This is how I am showing the dialogs
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");
}
These are my dialog fragment classes
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();
}
}
The audio bitrate dialog is shown but the encoder dialog is not shown both seems to have pretty much same code. How can i make all the dialogs show?
This is how I want it to display on every device:
This is how it is displaying on my nexus 5 and emulator with android 4.4 :
Within your
AudioEncoderDialog.onCreateDialog
you are very clearly not handling the case of KitKat, which is the device you are testing with.