Вызов Intent в Android, который является переменной - PullRequest
0 голосов
/ 19 декабря 2011

В настоящее время у меня есть представление списка, и я пытаюсь направить представление списка к различным действиям. Так что, если вы щелкнете по элементу, скажем, 1-4, вы получите класс, который соответствует этому. Единственный способ, которым я могу придумать, - это захватить текст элемента в представлении списка и запустить действие с этим именем. Код для него будет выглядеть примерно так:

final String chosen = "";
chosen = (String) ((TextView) view).getText();
Intent nextScreen = new Intent(getApplicationContext(), chosen.class);

Это не работает. В последней строке я получаю сообщение о том, что выбранное не может быть преобразовано в тип.

Я знаю, что ((TextView) view).getText() работает, потому что

Log.d("Debug", "Test"+((TextView) view).getText());

дает мне правильно выбранный предмет в logcat.

Есть идеи / предложения? Заранее спасибо

EDIT:

Я попытался изменить свой код на это:

String chosen = (String) ((TextView) view).getText();
try {
    Intent nextScreen = new Intent(getApplicationContext(), Class.forName(chosen));
    startActivity(nextScreen);
    Log.d("Debug", "Good"+((TextView) view).getText());
    } 
catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    Log.d("Debug", "Bad"+((TextView) view).getText());
    }
    Log.d("Debug", "Final"+((TextView) view).getText());

Журнал cat дал мне вывод

BadItem1
FinalItem1

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

Ответы [ 5 ]

1 голос
/ 19 декабря 2011

Ошибка здесь:

final String chosen = "";
chosen = (String) ((TextView) view).getText();

Поскольку вы объявляете выбранное как окончательное, вы можете присвоить ему значение только один раз:

final String chosen = (String) ((TextView) view).getText();

Более того, я полагаю, вы хотите запуститьДеятельность, имя которой хранится в выбранной переменной.Вы не можете написать selected.class для этого.Правильный способ сделать это:

Class.forName(chosen);

Надеюсь, это поможет!

0 голосов
/ 19 декабря 2011

Вы отправляете String как class предполагаемого Activity. Это то, что вам нужно:

final String chosen = "";
chosen = ((TextView) view).getText();
Class<?> chosenActivity = Class.forName(chosen);
Intent nextScreen = new Intent(this, chosenActivity);
0 голосов
/ 19 декабря 2011

Создайте Factory .

Таким образом, вам не нужно привязывать имена ваших классов к тексту, который читает пользователь.предоставляя вам большую гибкость / лучший пользовательский интерфейс / более простой в обслуживании код.Помощь в разделении интересов .

class NavFactory {
    private static final int CLASS_FIRST = 1;     

    public static Intent getNavIntent(Context context, String name){
         switch(getId(name)){
              case CLASS_FIRST:
                  return new Intent(context, FirstClass.class);
               default:
                  return null;
         }
    }

    private static int getId(String name){
       if("listItemOneText".equals(name)
            return CLASS_FIRST;

       return -1;
    }


}

Ref: Шаблон фабрики Java

В вашем случае:

String chosen = (String) ((TextView) view).getText();
Intent nextScreen = NavFactory.getNavIntent(this, chosen);
0 голосов
/ 19 декабря 2011

Вызов .class для переменной получает класс для этой переменной, а не класс для содержимого переменной.

Я думаю, что вы должны использовать OnItemClickListener на ListView для идентификациипункт нажал.Параметр position или вызов getItemAtPosition(position) должен быть достаточным для уникальной идентификации элемента в списке и вызова соответствующего действия.

См. Документацию здесь: http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html

0 голосов
/ 19 декабря 2011

Нет конструктора Intent, который принимает Context и String.Вероятно, вы можете сделать что-то вроде Class.forName(chosen) в вызове конструктора Intent.

...