AlertDialog按钮文本格式在某些设备上完全错误

时间:2016-04-01 03:49:08

标签: java android alertdialog

我目前正在使用AlertDialog提示用户并要求评分。它完全适用于我在使用AS仿真器(Nexus 5 API 23)时的预期。

来自模拟器:

enter image description here

但是,我在朋友的设备上测试了对话框,LG Stylo(Android 5.1.1,Api 22)并且格式化完全错误。按钮顺序错误,根本没有正确格式化。

来自LG Stylo:

enter image description here

我不确定如何确保AlertDialog的格式正确无误,老实说我不知道​​为什么LG Stylo上的格式不正确,不幸的是我没有目前正在测试它的另一台设备。

提前致谢!

AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setMessage(R.string.rateMeText)
                .setPositiveButton(R.string.rateMe, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        editor.putBoolean(KEY_REMIND_ME_LATER, false);
                        editor.commit();
                        try {
                            intent.setData(Uri.parse(myContext.getString(R.string.playStoreMarketLink) + APP_PNAME));
                            myContext.startActivity(intent);
                        }catch (Exception e){
                            intent.setData(Uri.parse(myContext.getString(R.string.playStoreHttpLink) + APP_PNAME));
                            myContext.startActivity(intent);

                        }
                        dialog.dismiss();
                    }
                })
                .setNegativeButton(R.string.noThanksAndDoNotAskAgain, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (editor != null) {
                            editor.putBoolean(KEY_REMIND_ME_LATER, false);
                            editor.commit();
                            /*editor.putBoolean(KEY_DONT_SHOW_AGAIN, true);*/
                            editor.commit();
                        }
                        dialog.dismiss();
                    }
                })
                .setNeutralButton(R.string.remindMeLater, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        editor.putLong(KEY_LAUNCH_COUNT_PRESSED_REMIND, launches);
                        editor.putBoolean(KEY_REMIND_ME_LATER, true);
                        editor.commit();
                        System.out.print(sharedPrefs.getLong(KEY_LAUNCH_COUNT_PRESSED_REMIND, 27727));
                        dialog.dismiss();
                    }
                });
        builder.create().show();

2 个答案:

答案 0 :(得分:4)

您必须使用现有样式作为父样式创建样式,然后在AlertDialog.Builder()方法中使用它。

看起来像这样:

<style name="myAlertStyle" parent="AlertDialog.Material">
    <item name="fullDark">@empty</item>
    <item name="topDark">@empty</item>
    <item name="centerDark">@empty</item>
    <item name="bottomDark">@empty</item>
    <item name="fullBright">@empty</item>
    <item name="topBright">@empty</item>
    <item name="centerBright">@empty</item>
    <item name="bottomBright">@empty</item>
    <item name="bottomMedium">@empty</item>
    <item name="centerMedium">@empty</item>
    <item name="layout">@layout/alert_dialog_material</item>
    <item name="listLayout">@layout/select_dialog_material</item>
    <item name="progressLayout">@layout/progress_dialog_material</item>
    <item name="horizontalProgressLayout">@layout/alert_dialog_progress_material</item>
    <item name="listItemLayout">@layout/select_dialog_item_material</item>
    <item name="multiChoiceItemLayout">@layout/select_dialog_multichoice_material</item>
    <item name="singleChoiceItemLayout">@layout/select_dialog_singlechoice_material</item>
</style>

然后你会像这样使用AlertDialog.Builder():

AlertDialog.Builder(mContext, R.style.myAlertStyle);

答案 1 :(得分:2)

值得注意的是,这几乎是api-22支持库中的一个错误,因为它试图将所有按钮放在一行上。它已在api-23支持库中修复,通过切换到新布局,每个按钮都在它自己的行上。

我使用支持库AlertDialog测试了您的代码,并在具有KitKat 4.4.4的设备上测试了两个不同的项目。

两个测试的代码相同:

import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("If you like this app, please rate it on the Google Play Store!")
                .setPositiveButton("Rate me!", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .setNegativeButton("No thanks and do not ask me again", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .setNeutralButton("Remind me later", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
        builder.create().show();
    }
}

首先,在具有此gradle配置的项目中(所有api-22设置):

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.1'
}

结果如下:

enter image description here

然后,在具有此配置的其他项目中(所有api-23设置):

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.testprojecttwo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}

这是相同代码的结果:

enter image description here

因此,对此的一个解决方法是使用api-23支持库。