在ICS中确定/取消按钮顺序

时间:2012-10-03 08:59:03

标签: android android-layout android-button

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

事情是,ADK鼓励您使用SDK> = 14的设备使用新订单,为您提供以下Lint

  

布局使用错误的按钮顺序API> = 14:创建一个   layout-v14 / layout.xml文件,顺序相反:取消   按钮应该在左边(是“@ string / send | Cancel”,应该是   “取消| @ string / send”)

好的,我会坚持这一点,这对我来说不是问题,我理解我应该遵循这些建议,以避免让用户烦恼。

但事情就是这样......在我的三星Galaxy S II上,在ICS上运行,系统界面本身似乎不遵循新订单。以下是一些屏幕截图示例:

enter image description here

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

enter image description here

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

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

enter image description here

无论如何,我将在我的应用程序中使用Holo主题设备,因此我会保留SDK> = 14的新订单。我只是想了解这个问题。

感谢。

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

三星有一个奇怪的想法,就是将Android 2的Touchwiz外观和感觉保持在Android 4.x设备上。对于我个人而言,这是三星4.x ROM最令人讨厌的事情,因为ICS / JB UI更好。它在对话框中最明显(使用你提到的2.x按钮排列)和标签(使用2.x标签而不是更好的4.x标签)。

即使是像SGS3这样的新的仅4.x设备(假设注释2也刚刚发布)仍然有Android 2 UI组件的这种荒谬的移植。

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

答案 2 :(得分:2)

是的,似乎按钮的顺序与主题相关,而不是版本相关。与布局“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”,它不包含布局,默认为代码的值

的themes.xml:

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

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

styles.xml:

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

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

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

themes_device_defaults.xml:

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

styles_device_defaults.xml:

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

我想三星只是在这里设置其他东西,以保持他们的外观和感觉,就像菲利奥所描述的那样。

答案 3 :(得分:0)

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