Урок 26. Intent Filter - практика
Урок 26. Intent Filter - практика
В этом уроке:
- вызываем Activity, используя неявный вызов и Intent Filter
Click here to read this article!
- вызываем Activity, используя неявный вызов и Intent Filter
Click here to read this article!
Последний раз редактировалось damager82 29 апр 2017, 18:51, всего редактировалось 6 раз.
Re: Урок 26. Intent Filter - практика
А вот такая же штука только для списка.
Задача: вывести отдельный activity для каждого элемента (пункта) списка.
Вот код создания списка, но при нажатии на каждый элемент открывается один и тот же активити.
Как исправить последние пару строчек, чтобы под каждый id listview был отдельный activity?
Задача: вывести отдельный 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);
};
}
Re: Урок 26. Intent Filter - практика
А по какому принципу у вас определяется Activity, которое должно открываться?Xpert043 писал(а):Как исправить последние пару строчек, чтобы под каждый id listview был отдельный activity?
Re: Урок 26. Intent Filter - практика
Легко.Как исправить последние пару строчек, чтобы под каждый id listview был отдельный activity?
Нужно в предпоследней строчки заменить на ...
Код: Выделить всё
Intent intent = new Intent(this, classArray[position]);
Код: Выделить всё
Class[] classArray = new Class[]{ AndroidActivity.class , iPhoneActivity.class, WindowsMobileActivity.class
...
};
Для решения озвученной задачи нужно id (он же position) перевести в класс, который подставляется в Intent при его создании, и через который происходит вызов новой Активити. Можно конечно сделать и через switch(position).
Re: Урок 26. Intent Filter - практика
Prospekt,
Ну ты советуешь создать активити и каждый элемент списка будет его вызывать. А если я не знаю сколько элементов списка у меня будет (он формируется в результате парсинга)? Я не могу создать соответствующее кол-во активити, так как не знаю его.
Ну ты советуешь создать активити и каждый элемент списка будет его вызывать. А если я не знаю сколько элементов списка у меня будет (он формируется в результате парсинга)? Я не могу создать соответствующее кол-во активити, так как не знаю его.
Re: Урок 26. Intent Filter - практика
уверен на 99.9% что вам НЕ НУЖЕН отдельный активити для каждого элемента списка. Вместо этого вам нужен 1 активити, который будет открываться при нажатии на любом элементе списка, а вот уже в зависимости от того, какой элемент был нажат вы будете перед вызовом активити в интент помещать маркер выбранного элемента списка через putExtra, а в открывшемся активити в onCreate() извлекать этот маркер через getExtra() и в зависимости от этого кастомизировать UI этого открывшегося активити.Xpert043 писал(а):Как исправить последние пару строчек, чтобы под каждый id listview был отдельный activity?
Все что я описал есть в уроках, если не найдете, напишу номера.
Re: Урок 26. Intent Filter - практика
вот этот топик почитайте, 1:1 ваша ситуация была у человека
viewtopic.php?t=827
viewtopic.php?t=827
Re: Урок 26. Intent Filter - практика
Спасибо. Там вроде все качественно разъяснено. Остается только прочитать все ссылки на уроках и попробовать. Если вдруг будут вопросы, то уже обращусь туда (чтобы было в одном месте). А это может стоит удалить, так как тему которую я тут затронул к уроку имеет не прямое отношение. Спасибо за помощь!!!
Re: Урок 26. Intent Filter - практика
Прошу прощения за нескорый ответ.
Если задача кординально не поменялась, тогда вот мои рекомендации.
В любом случае количество возможных активити у вас будет ограничено, т.е. у вас будут только те активити, для которых вы создали классы. Другое дело, что в зависимости от парсинга вы будете выбирать не все возможные активити, а какое-то их подмножество. Я имею ввиду, что если вы не предусмотрели отдельной активити скажем для платформы "UsyPusy" то внезависимости от парсинга её вы вызвать не сможете. Это очевидно, но я так на всякий случай.
Так вот у вас есть контейнер данных (например массив) в котором хранятся все классы активити (все возможные активити). Задача: по индентификатору, который в вашем случае является сторокой вернуть соотвествыющий класс.
Для этих вещей есть Хеш-таблицы. Это такой контейнер данных, который ассоциирует данный с неким ключом. Например сделать так:
В хештаблице ключи сравниваются не по адресу, а по значению (метод equals) поэтому не имеет значение как вы создавали ключи. Как вы могли уже догадаться объект Bundle тоже является хештаблицей.
ПС: как-то муторно получилось, но сегодня из меня писатель никакой. Возможно, имеет смысл последовать советам и создать параметризуемое унивирсальное активити, которое само принимает нужный вид в зависимости от выбранного (и переданного через интент) пункта списка. Адекватность этого приема для вашей задачи оценивать вам.
Если задача кординально не поменялась, тогда вот мои рекомендации.
В любом случае количество возможных активити у вас будет ограничено, т.е. у вас будут только те активити, для которых вы создали классы. Другое дело, что в зависимости от парсинга вы будете выбирать не все возможные активити, а какое-то их подмножество. Я имею ввиду, что если вы не предусмотрели отдельной активити скажем для платформы "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{
// в случае если при парсинге были ошибки и соотвествующиго значения среди активити нет, что-нибудь делаем, либо извиняемся перед пользователем, либо грузим активити по дефолту, либо даем "по шеи" парсеру
}
}
ПС: как-то муторно получилось, но сегодня из меня писатель никакой. Возможно, имеет смысл последовать советам и создать параметризуемое унивирсальное активити, которое само принимает нужный вид в зависимости от выбранного (и переданного через интент) пункта списка. Адекватность этого приема для вашей задачи оценивать вам.
Re: Урок 26. Intent Filter - практика
Чтобы закрепить тему, проделаем еще кое-то. Если помните, в уроке, где я рассказывал про Intent Filter, я говорил, что
битая ссылка
битая ссылка
Re: Урок 26. Intent Filter - практика
Спасибо! Пофиксилbaxxabit писал(а):Чтобы закрепить тему, проделаем еще кое-то. Если помните, в уроке, где я рассказывал про Intent Filter, я говорил, что
битая ссылка
Re: Урок 26. Intent Filter - практика
При редактировании Манифеста через вкладу Application и многократном открытии/закрытии получил все как по уроку, но стоило перейти на вкладку с XML кодом, как обнаружил дублирование одной и той же активити несколько раз, вот кусок с ActiveTime был аж четыре раза
При запуске все работало. Собственно вопрос, почему так получилось и есть ли какая-нибудь горячая комбинация для удаления дублей в xml?
Удалил дубли вручную, все по-прежнему работает. Eclipse стоит на автообновлении, да и скачивал все с месяц назад.
Код: Выделить всё
<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>
Удалил дубли вручную, все по-прежнему работает. Eclipse стоит на автообновлении, да и скачивал все с месяц назад.
Re: Урок 26. Intent Filter - практика
У меня что-то похожее бывает иногда в редакторе экранов. Надеюсь, пофиксят.mmvds писал(а):При редактировании Манифеста через вкладу Application и многократном открытии/закрытии получил все как по уроку, но стоило перейти на вкладку с XML кодом, как обнаружил дублирование одной и той же активити несколько раз, вот кусок с ActiveTime был аж четыре раза
При запуске все работало. Собственно вопрос, почему так получилось и есть ли какая-нибудь горячая комбинация для удаления дублей в xml?
Удалил дубли вручную, все по-прежнему работает. Eclipse стоит на автообновлении, да и скачивал все с месяц назад.
Re: Урок 26. Intent Filter - практика
да во всех xml такое бывает - нажимаешь DEL (работает только BackSpace) в редакторе стилей, вместо удаления символа в этом редакторе, удаляется текущий View в соседнем редакторе экрана. Так что лучше открывать по одному.
Re: Урок 26. Intent Filter - практика
Хотел бы прояснить правильно ли я думаю, что если обращаться к Activity своего же приложения, то лучше прописывать напрямую без Intent Filter, а если обращаться к стороннему Activity то лучше через Intent Filter, т.к. например могут быть различные почтовые клиенты или разные браузеры?
Re: Урок 26. Intent Filter - практика
Ну да, в этом и замысел. Мы обозначаем действие и предмет, а система предоставляет нам выбор инструмента.Roman писал(а):Хотел бы прояснить правильно ли я думаю, что если обращаться к Activity своего же приложения, то лучше прописывать напрямую без Intent Filter, а если обращаться к стороннему Activity то лучше через Intent Filter, т.к. например могут быть различные почтовые клиенты или разные браузеры?
Re: Урок 26. Intent Filter - практика
Добавляю в 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.
"
подскажите в чем проблема.
"[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.
"
подскажите в чем проблема.
Re: Урок 26. Intent Filter - практика
XML Manifesta проверьте, если даже сами руками ничего не меняли то возможно Eclpipse накосячил.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
-
- Сообщения: 103
- Зарегистрирован: 10 сен 2012, 11:58
Re: Урок 26. Intent Filter - практика
Здравствуйте,
Мелочь, но, как говорится, из мелочей создается стиль.
Мне кажется в тексте урока можно указать, что
android:label="Date extended"
android:label="Date Basic"
лучше прописать в strings.xml
Мелочь, но, как говорится, из мелочей создается стиль.
Мне кажется в тексте урока можно указать, что
android:label="Date extended"
android:label="Date Basic"
лучше прописать в strings.xml
Re: Урок 26. Intent Filter - практика
Спасибо, со 2ого раза нашел косяк..rezak90 писал(а):XML Manifesta проверьте, если даже сами руками ничего не меняли то возможно Eclpipse накосячил.
Когда прописывал в IntentFilter>Action>name
то name писался где угодно в манифесте