9

从 SDK 14 开始,首选顺序是取消/确定,而不是之前的确定/取消。我不打算讨论这是一个好主意还是坏主意,这不是我的问题的主题。

问题是 ADK 通过为您提供以下 Lint 鼓励您对 SDK >= 14 的设备使用新订单

布局对 API >= 14 使用错误的按钮顺序:创建具有相反顺序的 layout-v14/layout.xml 文件:取消按钮应位于左侧(为“@string/send | Cancel”,应为“Cancel | @字符串/发送“)

好的,我会坚持下去,这对我来说不是问题,我知道我应该遵循建议以避免惹恼用户。

但事情是这样的……在我的三星 Galaxy S II 上,在 ICS 上运行,系统界面本身似乎没有遵循新的顺序。以下是一些截图示例:

在此处输入图像描述

订单是旧的。请注意,我使用手机的官方 ICS 版本(不是自定义 ROM)。我的 Galaxy Tab 2(也运行官方 ICS)上的顺序相同。在某些对话框中,顺序是正确的(取消/确定)我看到的唯一区别是主题(使用 Holo 主题的对话框具有新顺序;其他的,旧顺序)。这是来自设置(用于设置系统日期)和使用 Holo 的应用程序中的 DatePickerDialog 的屏幕截图:

在此处输入图像描述

这很令人不安。看起来按钮的顺序与主题相关而不与版本相关。还是只是三星没有遵循 Android 的设计模式?

我认为活动(当他们有确定/取消按钮时)也应该遵循相同的顺序。在这里,再次,在我的手机上,日历的 Create Event 活动的顺序错误(并且该活动不使用 Hole 主题):

在此处输入图像描述

无论如何,我将在我的应用程序中将 Holo 主题用于来自 Honeycomb 的设备,因此我将保持 SDK>=14 的新顺序。我只是想了解这个问题。

谢谢。

4

4 回答 4

5

是的,按钮交换非常烦人,我最终点击取消按钮比确定按钮更多。但这是你能做的。要么创建你自己的自定义对话框,以便你控制哪个按钮出现在哪里,要么让用户通过阅读来弄清楚。作为程序员,我们唯一需要做的是,当按下取消时,它实际上取消了,而不是 OKays!为了更清楚地说明为什么要交换 Ok-Cancel,这是为了避免与 Apple 的专利侵权,因为他们也遵循 Ok-Cancel。因此,交换 Cancel-Ok 将意味着没有侵权(愚蠢,但可以节省 Google 百万!)

于 2012-10-03T09:04:15.060 回答
3

三星有一个奇怪的想法,即从 Android 2 到 Android 4.x 设备保持 Touchwiz 的外观和感觉。对我个人而言,这是关于三星 4.x ROM 的最烦人的事情,因为 ICS/JB UI 更好。它在对话框(使用您提到的 2.x 按钮排列)和选项卡(使用 2.x 选项卡而不是更好的 4.x 选项卡)中最为明显。

即使是较新的仅 4.x 设备,如 SGS3(假设也是刚刚发布的 Note 2)仍然具有这种荒谬的 Android 2 UI 组件移植。

我怀疑这对最终用户来说不是问题,但对于拥有许多设备并注意到差异的开发人员来说,这很烦人。

于 2012-10-03T09:29:47.013 回答
3

是的,按钮的顺序似乎与主题相关,而不是与版本相关。与布局“alert_dialog.xml”不同,“alert_dialog_holo.xml”将“button1”(正)放在右边,“button2”(负)放在左边。

布局由 com.android.internal.app.AlertController 确定:

public AlertController(Context context, DialogInterface di, Window window) {

    TypedArray a = context.obtainStyledAttributes(null,
            com.android.internal.R.styleable.AlertDialog,
            com.android.internal.R.attr.alertDialogStyle, 0);

    mAlertDialogLayout = a.getResourceId(com.android.internal.R.styleable.AlertDialog_layout,
            com.android.internal.R.layout.alert_dialog);

Theme的属性“alertDialogStyle”指的是一个“AlertDialog”样式,它是一组描述AlertDialog主题的属性,属性“layout”可以指向一个布局资源,否则使用layout/alert_dialog。

在 android 源代码中,您可以看到“Theme.Holo”使用“AlertDialog.Holo”,后者又引用“layout/alert_dialog_holo”,而“Theme”使用不包含布局并默认为代码值的“AlertDialog”。

主题.xml:

<style name="Theme">
    <item name="alertDialogStyle">@android:style/AlertDialog</item>

<style name="Theme.Holo">
    <item name="alertDialogStyle">@android:style/AlertDialog.Holo</item>

样式.xml:

<style name="AlertDialog">
    …
</style>

<style name="AlertDialog.Holo" parent="AlertDialog">
    …
    <item name="layout">@android:layout/alert_dialog_holo</item>
    …
</style>

实际使用的主题似乎是由设备默认值定义的。

主题设备默认值.xml:

<style name="Theme.DeviceDefault" parent="Theme.Holo" >
    <item name="alertDialogStyle">@android:style/AlertDialog.DeviceDefault</item>

样式_device_defaults.xml:

<style name="AlertDialog.DeviceDefault" parent="AlertDialog.Holo">
</style>

我猜三星只是在这里设置了其他东西,以保持 Philio 所描述的外观和感觉。

于 2013-02-05T11:27:23.113 回答
0

也许是三星更改了 Galaxy S2 的 ROM。我觉得他们在定制方面有点臭名昭著。过去,我在 SGS2、xCover 等的 ROM 中也遇到过一些核心蓝牙操作的问题。所以如果它只发生在三星设备上,我不会感到惊讶 :)

于 2012-10-03T09:20:59.940 回答