Использование строк в переключателе для меню? - PullRequest
3 голосов
/ 01 октября 2011

В настоящее время я создаю приложение для форума и добавляю раздел избранного, где вы можете добавить свои любимые разделы для быстрого доступа.У меня есть настроенное меню, в котором есть список различных разделов, поэтому я создал переключатель, чтобы решить, что делать при нажатии определенного элемента меню, в данном случае это раздел.Сделав это, я узнал, что вы не можете использовать строки с регистром переключателя, поэтому мой вопрос заключается в том, как определить, какая кнопка была нажата, и выполнить действие, в соответствии с которым была нажата кнопка?для меню:

public class Menu extends ListActivity{

String[] classes = {"Home", "Gaming", "Microsoft Consoles", 
        "Sony Consoles", "Other Platforms", "Tech Center", "General"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setListAdapter(new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, classes));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    switch (classes) {
    case "Home":

    break; 
    case "Gaming".hashCode(): 

    break; 
    }   
}
}

Я получаю сообщение об ошибке, потому что классы - это строка [], и я не могу использовать это со случаем переключения, так есть ли способ сделать это или альтернатива?

Ответы [ 3 ]

8 голосов
/ 01 октября 2011

Строки в выражениях switch были добавлены в Java 7. Для примера рассмотрим здесь .Поскольку разработка Android в настоящее время не основана на синтаксисе Java 7, вам придется пойти по другому пути.А это значит: заявления if-else.Они не самые красивые, но они выполнят свою работу.

6 голосов
/ 01 октября 2011

Вот хороший и чистый обходной путь:

public enum Classes {
    HOME("Home"),
    GAMING("Gaming"),
    ...
    MICROSOFT_CONSOLES("Microsoft Consoles");

    private final String name;

    Classes(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}

Вы можете переключить enum и использовать его таким образом в своем адаптере:

new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, Classes.values())

Обновление

Единственная проблема заключается в том, что эти строки жестко запрограммированы. Чтобы обойти этот факт, я бы порекомендовал реализовать статический помощник по контексту приложения и реализовать enum следующим образом (это идея, я не пробовал, но она должна работать):

public enum Classes {
    HOME(R.string.home),
    GAMING(R.string.gaming),
    ...
    MICROSOFT_CONSOLES(R.string.microsoft_consoles);

    private final int name;

    Classes(int name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return App.getContext().getString(name);
    }
}
1 голос
/ 01 октября 2011

Лучшее решение:

Один класс enum:

public enum Tabs 
{
 Home, 
 Gaming, 
 Microsoft_Consoles, 
 Sony_Consoles, 
 Other_Platforms, 
 Tech_Center, 
 General
}

В другом классе:

 switch (classes)
 {
   case Home:

   break;
 ...
 }

@ переопределить класс toString () для вкладок enum, чтобы сделать это красиво.

...