Урок 26. Intent Filter - практика

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 26. Intent Filter - практика

Сообщение damager82 » 20 окт 2011, 03:00

В этом уроке:

- вызываем Activity, используя неявный вызов и Intent Filter

Click here to read this article!
Последний раз редактировалось damager82 29 апр 2017, 18:51, всего редактировалось 6 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Xpert043
Сообщения: 34
Зарегистрирован: 12 июн 2012, 20:13

Re: Урок 26. Intent Filter - практика

Сообщение Xpert043 » 17 июн 2012, 17:04

А вот такая же штука только для списка.
Задача: вывести отдельный activity для каждого элемента (пункта) списка.
Вот код создания списка, но при нажатии на каждый элемент открывается один и тот же активити.

Код: Выделить всё

public class SpisokActivity extends ListActivity {
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                "Linux", "OS/2" };
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, values);
        setListAdapter(adapter);
    }

     @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        String item = (String) getListAdapter().getItem(position);
        Intent intent = new Intent(this, AndroidActivity.class);
        startActivity(intent);
};
}
Как исправить последние пару строчек, чтобы под каждый id listview был отдельный activity?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 26. Intent Filter - практика

Сообщение damager82 » 18 июн 2012, 09:24

Xpert043 писал(а):Как исправить последние пару строчек, чтобы под каждый id listview был отдельный activity?
А по какому принципу у вас определяется Activity, которое должно открываться?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Prospekt
Сообщения: 41
Зарегистрирован: 30 май 2012, 23:06

Re: Урок 26. Intent Filter - практика

Сообщение Prospekt » 18 июн 2012, 11:39

Как исправить последние пару строчек, чтобы под каждый id listview был отдельный activity?
Легко.
Нужно в предпоследней строчки заменить на ...

Код: Выделить всё

Intent intent = new Intent(this, classArray[position]);
А перед этим (в месте инициализации) объявить массив классов сооветствующих активити

Код: Выделить всё

Class[] classArray = new Class[]{ AndroidActivity.class , iPhoneActivity.class, WindowsMobileActivity.class
...
};
где например AndriodActivity - это название класса активити для первого пункта.

Для решения озвученной задачи нужно id (он же position) перевести в класс, который подставляется в Intent при его создании, и через который происходит вызов новой Активити. Можно конечно сделать и через switch(position).

Xpert043
Сообщения: 34
Зарегистрирован: 12 июн 2012, 20:13

Re: Урок 26. Intent Filter - практика

Сообщение Xpert043 » 18 июн 2012, 12:10

Prospekt,
Ну ты советуешь создать активити и каждый элемент списка будет его вызывать. А если я не знаю сколько элементов списка у меня будет (он формируется в результате парсинга)? Я не могу создать соответствующее кол-во активити, так как не знаю его.

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Урок 26. Intent Filter - практика

Сообщение andev » 19 июн 2012, 09:02

Xpert043 писал(а):Как исправить последние пару строчек, чтобы под каждый id listview был отдельный activity?
уверен на 99.9% что вам НЕ НУЖЕН отдельный активити для каждого элемента списка. Вместо этого вам нужен 1 активити, который будет открываться при нажатии на любом элементе списка, а вот уже в зависимости от того, какой элемент был нажат вы будете перед вызовом активити в интент помещать маркер выбранного элемента списка через putExtra, а в открывшемся активити в onCreate() извлекать этот маркер через getExtra() и в зависимости от этого кастомизировать UI этого открывшегося активити.
Все что я описал есть в уроках, если не найдете, напишу номера.

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Урок 26. Intent Filter - практика

Сообщение andev » 19 июн 2012, 09:06

вот этот топик почитайте, 1:1 ваша ситуация была у человека
viewtopic.php?t=827

Xpert043
Сообщения: 34
Зарегистрирован: 12 июн 2012, 20:13

Re: Урок 26. Intent Filter - практика

Сообщение Xpert043 » 19 июн 2012, 10:12

Спасибо. Там вроде все качественно разъяснено. Остается только прочитать все ссылки на уроках и попробовать. Если вдруг будут вопросы, то уже обращусь туда (чтобы было в одном месте). А это может стоит удалить, так как тему которую я тут затронул к уроку имеет не прямое отношение. Спасибо за помощь!!!

Prospekt
Сообщения: 41
Зарегистрирован: 30 май 2012, 23:06

Re: Урок 26. Intent Filter - практика

Сообщение Prospekt » 19 июн 2012, 17:54

Прошу прощения за нескорый ответ.

Если задача кординально не поменялась, тогда вот мои рекомендации.
В любом случае количество возможных активити у вас будет ограничено, т.е. у вас будут только те активити, для которых вы создали классы. Другое дело, что в зависимости от парсинга вы будете выбирать не все возможные активити, а какое-то их подмножество. Я имею ввиду, что если вы не предусмотрели отдельной активити скажем для платформы "UsyPusy" то внезависимости от парсинга её вы вызвать не сможете. Это очевидно, но я так на всякий случай.

Так вот у вас есть контейнер данных (например массив) в котором хранятся все классы активити (все возможные активити). Задача: по индентификатору, который в вашем случае является сторокой вернуть соотвествыющий класс.

Для этих вещей есть Хеш-таблицы. Это такой контейнер данных, который ассоциирует данный с неким ключом. Например сделать так:

Код: Выделить всё

HashMap<String,Class> activityClasses = new HashMap<String,Class>();
....
// инициализаровать значениями
activityClasses.put("Android", AndroidActivity.class);
activityClasses.put("MacOs", MacOsActivity.class);
activityClasses.put("Windows",WindowsMobileActivity.class);// и ьак далее
...
//А  другой активити делаить так
 protected void onListItemClick(ListView l, View v, int position, long id) {
 String item = (String) getListAdapter().getItem(position);
 Class itemclass =  activityClasses.get(item);
 if(itemclass!=null){
     Intent intent = new Intent(this, itemclass);
     startActivity(intent);
 }else{
   // в случае если при парсинге были ошибки и соотвествующиго значения среди активити нет, что-нибудь делаем, либо извиняемся перед пользователем, либо грузим активити по дефолту, либо даем "по шеи" парсеру
 }
 }
В хештаблице ключи сравниваются не по адресу, а по значению (метод equals) поэтому не имеет значение как вы создавали ключи. Как вы могли уже догадаться объект Bundle тоже является хештаблицей.

ПС: как-то муторно получилось, но сегодня из меня писатель никакой. Возможно, имеет смысл последовать советам и создать параметризуемое унивирсальное активити, которое само принимает нужный вид в зависимости от выбранного (и переданного через интент) пункта списка. Адекватность этого приема для вашей задачи оценивать вам.

baxxabit
Сообщения: 4
Зарегистрирован: 11 июл 2012, 16:52

Re: Урок 26. Intent Filter - практика

Сообщение baxxabit » 17 июл 2012, 17:40

Чтобы закрепить тему, проделаем еще кое-то. Если помните, в уроке, где я рассказывал про Intent Filter, я говорил, что

битая ссылка

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 26. Intent Filter - практика

Сообщение damager82 » 18 июл 2012, 11:52

baxxabit писал(а):Чтобы закрепить тему, проделаем еще кое-то. Если помните, в уроке, где я рассказывал про Intent Filter, я говорил, что
битая ссылка
Спасибо! Пофиксил
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

mmvds
Сообщения: 14
Зарегистрирован: 23 июл 2012, 18:31

Re: Урок 26. Intent Filter - практика

Сообщение mmvds » 08 авг 2012, 09:01

При редактировании Манифеста через вкладу Application и многократном открытии/закрытии получил все как по уроку, но стоило перейти на вкладку с XML кодом, как обнаружил дублирование одной и той же активити несколько раз, вот кусок с ActiveTime был аж четыре раза

Код: Выделить всё

<activity android:name="ActivityTime">
            <intent-filter>
                <action android:name="ru.startandroid.intent.action.showtime"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
<activity android:name="ActivityTime">
            <intent-filter>
                <action android:name="ru.startandroid.intent.action.showtime"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
<activity android:name="ActivityTime">
            <intent-filter>
                <action android:name="ru.startandroid.intent.action.showtime"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
<activity android:name="ActivityTime">
            <intent-filter>
                <action android:name="ru.startandroid.intent.action.showtime"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
<activity android:name="ActivityDate" android:label="Date Basic">
            <intent-filter>
                <action android:name="ru.startandroid.intent.action.showdate"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity android:name="ActivityDateEx" android:label="Date Extended">
            <intent-filter>
                <action android:name="ru.startandroid.intent.action.showdate"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
При запуске все работало. Собственно вопрос, почему так получилось и есть ли какая-нибудь горячая комбинация для удаления дублей в xml?
Удалил дубли вручную, все по-прежнему работает. Eclipse стоит на автообновлении, да и скачивал все с месяц назад.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 26. Intent Filter - практика

Сообщение damager82 » 10 авг 2012, 10:24

mmvds писал(а):При редактировании Манифеста через вкладу Application и многократном открытии/закрытии получил все как по уроку, но стоило перейти на вкладку с XML кодом, как обнаружил дублирование одной и той же активити несколько раз, вот кусок с ActiveTime был аж четыре раза

При запуске все работало. Собственно вопрос, почему так получилось и есть ли какая-нибудь горячая комбинация для удаления дублей в xml?
Удалил дубли вручную, все по-прежнему работает. Eclipse стоит на автообновлении, да и скачивал все с месяц назад.
У меня что-то похожее бывает иногда в редакторе экранов. Надеюсь, пофиксят.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 26. Intent Filter - практика

Сообщение math64 » 10 авг 2012, 14:28

да во всех xml такое бывает - нажимаешь DEL (работает только BackSpace) в редакторе стилей, вместо удаления символа в этом редакторе, удаляется текущий View в соседнем редакторе экрана. Так что лучше открывать по одному.

Roman
Сообщения: 22
Зарегистрирован: 23 авг 2012, 08:43

Re: Урок 26. Intent Filter - практика

Сообщение Roman » 08 сен 2012, 18:22

Хотел бы прояснить правильно ли я думаю, что если обращаться к Activity своего же приложения, то лучше прописывать напрямую без Intent Filter, а если обращаться к стороннему Activity то лучше через Intent Filter, т.к. например могут быть различные почтовые клиенты или разные браузеры?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 26. Intent Filter - практика

Сообщение damager82 » 11 сен 2012, 10:41

Roman писал(а):Хотел бы прояснить правильно ли я думаю, что если обращаться к Activity своего же приложения, то лучше прописывать напрямую без Intent Filter, а если обращаться к стороннему Activity то лучше через Intent Filter, т.к. например могут быть различные почтовые клиенты или разные браузеры?
Ну да, в этом и замысел. Мы обозначаем действие и предмет, а система предоставляет нам выбор инструмента.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

sulo
Сообщения: 3
Зарегистрирован: 17 сен 2012, 14:10

Re: Урок 26. Intent Filter - практика

Сообщение sulo » 17 сен 2012, 14:13

Добавляю в IntentFileter Action, указываю name, выдает ошибку:
"[2012-09-17 15:07:15 - com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper] Parser exception for E:\workspace\ucheb3\AndroidManifest.xml: Content is not allowed in prolog.
[2012-09-17 15:07:15 - ucheb3] Error in an XML file: aborting build.
"
подскажите в чем проблема.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 26. Intent Filter - практика

Сообщение rezak90 » 17 сен 2012, 22:45

XML Manifesta проверьте, если даже сами руками ничего не меняли то возможно Eclpipse накосячил.
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 26. Intent Filter - практика

Сообщение dil_android » 18 сен 2012, 14:54

Здравствуйте,

Мелочь, но, как говорится, из мелочей создается стиль.
Мне кажется в тексте урока можно указать, что
android:label="Date extended"
android:label="Date Basic"
лучше прописать в strings.xml

sulo
Сообщения: 3
Зарегистрирован: 17 сен 2012, 14:10

Re: Урок 26. Intent Filter - практика

Сообщение sulo » 18 сен 2012, 17:22

rezak90 писал(а):XML Manifesta проверьте, если даже сами руками ничего не меняли то возможно Eclpipse накосячил.
Спасибо, со 2ого раза нашел косяк..
Когда прописывал в IntentFilter>Action>name
то name писался где угодно в манифесте

Ответить