Sherlock dialog fragment not displaying on devices with android v4+

282 views Asked by At

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:

enter image description here

This is how it is displaying on my nexus 5 and emulator with android 4.4 :

enter image description here

1

There are 1 answers

0
HandlerExploit On BEST ANSWER

Within your AudioEncoderDialog.onCreateDialog you are very clearly not handling the case of KitKat, which is the device you are testing with.