我目前正在使用AlertDialog
提示用户并要求评分。它完全适用于我在使用AS仿真器(Nexus 5 API 23)时的预期。
来自模拟器:
但是,我在朋友的设备上测试了对话框,LG Stylo(Android 5.1.1,Api 22)并且格式化完全错误。按钮顺序错误,根本没有正确格式化。
来自LG Stylo:
我不确定如何确保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();
答案 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'
}
结果如下:
然后,在具有此配置的其他项目中(所有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'
}
这是相同代码的结果:
因此,对此的一个解决方法是使用api-23支持库。