0

我了解如何从资源文件 String.xml 中的字符串数组初始化微调器。但是,我的问题始终是当您从下拉菜单中选择某些内容时如何正确链接事物。例如,假设您的字符串数组看起来像这样

电 气 其他

所以在 onItemSelected 监听器中,如果我想知道点击了什么来执行某个操作,那么我应该检查 pos 并对其采取行动(假设我知道我的字符串数组中的位置,如下所示

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
        switch(pos){
            case 1: // Electricity

            break;
            case 2: //Gas

            break;
                    .
                    .
                    .
        }       
    }

或者我应该像这样进行 Sting 比较:

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
        if(parent.getSelectedItemAtPos(pos).toString().equal("Electricity"){

            } else if (......){
            }
            .
        .
    }

first 的优点是它更干净,但问题是我必须确保当我更改资源文件时,我会始终跟踪更新索引。第二个更安全,但进行字符串比较似乎“罗嗦”。

我不是,也许我错过了一个最佳解决方案,或者我上面的建议就可以了?

请帮助专家,我宁愿第一次做正确的事情,因为我的应用程序中有很多微调器:(

谢谢

4

4 回答 4

1

我认为这两种方法都很好。这取决于您应该选择哪一种

正如你所说,第一个提供了更多的可读性,即使数量增加了cases

但是在第二种方法中,如果只有 1-2 个条件来检查它看起来很好,因为条件增加它们的代码可能看起来很乱

如果您关心可读性,请使用第一种方法,否则您可以根据需要进行选择

注意:如果我们比较两种方法的性能,我认为它们之间没有太大区别(参考以下链接 { link1link2 })

于 2013-01-29T05:50:28.570 回答
1

第二个很好,但有点增强。声明一个本地字符串变量并存储Spinner.

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

        String selectedItem = parent.getSelectedItemAtPos(pos).toString();

        if(selectedItem.equals("Electricity")) {

        } else if (selectedItem.equals("Dummy")){
            // ....    
        }

}
于 2013-01-29T05:55:56.520 回答
1

在这两者之间,毫无疑问是第一种选择。一方面,它是一个 switch 语句,因此它可以立即跳转到正确的句柄,而对于第二个,你有一个线性的比较线,直到你到达你想要的那个。其次,您在第二个中使用字符串比较,这比仅进行整数比较更慢且更不安全。如果您计划对其进行大量更改,则需要做更多的工作,但我认为这是两者中更好的方法,就个人而言。

于 2013-01-29T06:00:04.917 回答
1

如果您通过资源文件第一种方法在微调器中设置条目会更好,因为在资源文件中声明字符串时,您将知道哪个字符串在哪个索引中。

android:entries="@array/..."

但是如果您使用适配器来设置条目(您从服务器或其他任何地方接收),那么最好采用第二种方法。因为在这种情况下,字符串的索引将是不确定的。

mSpinner.setAdapter(...)

于 2013-01-29T06:03:09.967 回答