Sherlock对话框片段不显示在带有android v4 +的设备上

时间:2014-11-16 18:54:17

标签: android android-fragments dialog actionbarsherlock

我刚发现我的一个旧应用程序出现了对话框问题。它正在使用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();

    }
}

显示音频比特率对话框,但未显示编码器对话框,似乎两者的代码几乎完全相同。如何显示所有对话框?

这就是我希望它在每台设备上显示的方式:

enter image description here

这是它在我的nexus 5和Android 4.4模拟器上的显示方式:

enter image description here

1 个答案:

答案 0 :(得分:0)

AudioEncoderDialog.onCreateDialog范围内,您显然没有处理KitKat的情况,这是您正在测试的设备。