Урок 21. Создание и вызов Activity

Обсуждение уроков
Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 21. Создание и вызов Activity

Сообщение KamiSempai » 22 окт 2012, 19:23

AndreyI писал(а):Пока вы не вызовете Activity у вас оно не будет создано, как вы собираетесь передавать данные в несуществующее Activity?
Насколько я понял, Activity уже создано. Видимо он не совсем понимает, что такое стек и как им пользоваться.

dil_android, советую еще раз прочитать про жизненные циклы Activity и использование startActivityForResult.
Дело в том, что для обновления списка в другом Activity нужно лишь перечитать курсор. Сделать это можно будет, например, в onActivityResult или onResume.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: Урок 21. Создание и вызов Activity

Сообщение dil_android » 22 окт 2012, 19:46

Мне наверно нужно быть просто поконкретнее.

Есть две Активити:
public class MainActivity extends Activity {
} и

public class ChildActivity extends Activity {
}

В обеих Активити есть метод onClick().

Я хочу при удалении всех данных в Main удалять и в Child.
Сработает ли такое обращение из Main:
ChildActivity ca = new ChildActivity();
ca.deleteinChildonClick();

Если нет, то я пытаюсь передать int значение через Intent, которое выступило бы в роли своеобразного triggera и запустило удаление в Child без вызова Child.

В Main

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

            public void deleteinMainonClick(DialogInterface dialog, int id) {
                // удаляем с листа все содержимое по всем позициям
                values.clear();
                // вызываем метод удаления всех данных из таблицы класса DataSourceMain()               
                main_datasource.deleteAllinMain();
                // уведомляем, что данные изменились
                myAdapter.notifyDataSetChanged();
int dor = 5;                
Intent intent = new Intent(getApplicationContext(), ChildActivity.class); 
intent.putExtra("val", dor);
            }
В Child

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


            public void deleteinChildonClick(DialogInterface dialog, int id) {
int a; 
Intent intent_1 = getIntent();                
a = intent_1.getIntExtra("val", dor);
if (a == 5) {
                // удаляем с листа все содержимое по всем позициям
                item_values.clear();
                // вызываем метод удаления всех данных из таблицы класса DataSourceChild()               
                child_datasource.deleteAllinChild();
                // уведомляем, что данные изменились
                boxAdapter.notifyDataSetChanged();
} else {Toast.makeText(getApplicationContext(), "Не получилось", Toast.LENGTH_LONG).show();}
}

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 21. Создание и вызов Activity

Сообщение KamiSempai » 22 окт 2012, 19:55

Кто-нибудь, объясните этому человеку, что такое ООП.
Я пас.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: Урок 21. Создание и вызов Activity

Сообщение dil_android » 22 окт 2012, 20:11

Может я не верно формулирую? То, что работает в Java, на сколько я понимаю, работает и в Android за исключением того, что каждая Activity самодостаточна. И все взаимодействия (включая передачу данных) осуществляются через Intent. Но при передаче данных вы Intent(ом) вызываете второе Activity и оно отображается на экране вашего устройства. Как передавать данные (осуществлять коммуникацию между Activity) без отображения Activity, которое принимает данные на устройстве.

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

Re: Урок 21. Создание и вызов Activity

Сообщение rezak90 » 22 окт 2012, 20:42

dil_android
Господи, какая же у вас каша в голове то наверное. Не в обиду =) Есть по крайней мере 5 способов сделать то что вам нужно, сейчас придумаю:

1) Вы ошибаетесь на счёт того что в Intent нельзя передавать все значения, можно, просто нужно набить руку. Передайте туда ваш список, в childactivity удаляйте всё что хотите и возвращайте это в родительское активити;
2) Ещё проще. Создайте отдельный статический класс в котором есть ваш список и работайте с его полями и методами из любой области программы;
3) ShardePreferences хорошо если мало значений, хотите его использовать - пожалуйста, здесь нет ничего плохого. Каждый реализовывает то как хочет (а точнее каждый строит свой велосипед сам);
4) Вынесите в конце концов общие методы в отдельный класс, в котором храните и ваш список и методы для работы со списком;
5) Создайте синглтон. Если знаете что это то комментарии излишне.
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 21. Создание и вызов Activity

Сообщение AndreyI » 22 окт 2012, 21:02

KamiSempai писал(а): Насколько я понял, Activity уже создано. Видимо он не совсем понимает, что такое стек и как им пользоваться.

dil_android, советую еще раз прочитать про жизненные циклы Activity и использование startActivityForResult.
Дело в том, что для обновления списка в другом Activity нужно лишь перечитать курсор. Сделать это можно будет, например, в onActivityResult или onResume.
По этому сообщению я понял что он как раз вызывает Activity B из Activity A и туда же передает данные при таком раскладе Activity B у него не создано.
Если бы он, наоборот, вызвав Activity B хотел вернуть данные в Activity A без вызова самого Activity, тогда да, предыдыдущее Activity будет в стеке перед Activity B .

В таком случае можно передать данные, тут уже как душа пожелает, можно через статику, можно через BroadcastReceiver или еще как-нибудь.

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

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 21. Создание и вызов Activity

Сообщение AndreyI » 22 окт 2012, 21:07

dil_android писал(а): ChildActivity ca = new ChildActivity();
ca.deleteinChildonClick();
Вот так создавать объекты Activity точно нельзя, запомните раз и навсегда - объекты Activity (и все наследуемые от Context) может создавать только система, если они прописаны, должным образом в Манифесте.

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

Re: Урок 21. Создание и вызов Activity

Сообщение dil_android » 22 окт 2012, 22:44

если нужный метод оперирует только с параметрами и ни как не использует сам объект, его можно объявить как static и использовать независимо от самого объекта
Сделал следующим образом:

объявил переменные и методы класса DataSourceChild, через который работаю с БД, static и заменил везде ссылкой на класс.

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


DataSourceChild.openToWriteChild(); // открывает БД
DataSourceChild.deleteAllinChild(); // удаляет все записи
DataSourceChild.closeChild(); // закрывает БД
finish();

все работает!
Создайте отдельный статический класс в котором есть ваш список и работайте с его полями и методами из любой области программы;
Перечитал о static, понял, что при объявлении переменных static мы обеспечиваем к ним доступ со стороны всех создаваемых объектов, превращая их в переменные класса + static используется для декларирования только вложенных (inner) классов + static важен при объявлении констант для, опять таки, обеспечения доступа (по моему все).

Совершенно согласен, что
Вот так создавать объекты Activity точно нельзя
Вы подтвердили мои сомнения.

Спасибо всем.

P.S. Каша, - это верно. Но я здесь общаюсь не для обид, а чтобы научиться. Кто это понимает, тому благодарен.

rumvit
Сообщения: 4
Зарегистрирован: 23 окт 2012, 23:23

Re: Урок 21. Создание и вызов Activity

Сообщение rumvit » 23 окт 2012, 23:29

Урок 21. Создание и вызов Activity
У меня все получилось, но есть и вопрос.
Почему при запуске на api 10 возникает ошибка и требование api 14.
Проект запустился и работает, но лишь по 14 api,
Буду благодарен за ответ о причине.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 21. Создание и вызов Activity

Сообщение AndreyI » 23 окт 2012, 23:59

По всей видимости в Манифесте прописан атрибут android:minSdkVersion="14"

rumvit
Сообщения: 4
Зарегистрирован: 23 окт 2012, 23:23

Re: Урок 21. Создание и вызов Activity

Сообщение rumvit » 24 окт 2012, 08:39

Спасибо.Посмотрю вечером.
А где он там прописывается.Я, вроде, смотрел в манифесте....
Или так смотрел.....

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

Re: Урок 21. Создание и вызов Activity

Сообщение damager82 » 24 окт 2012, 09:45

Либо в коде

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

    <uses-sdk
        android:minSdkVersion="13"
        android:targetSdkVersion="15" />
либо как на скрине:
manifest.JPG
manifest.JPG (33.09 КБ) 8042 просмотра
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

rumvit
Сообщения: 4
Зарегистрирован: 23 окт 2012, 23:23

Re: Урок 21. Создание и вызов Activity

Сообщение rumvit » 24 окт 2012, 11:50

Спасибо, еще раз за обстоятельный ответ.

rumvit
Сообщения: 4
Зарегистрирован: 23 окт 2012, 23:23

Re: Урок 21. Создание и вызов Activity

Сообщение rumvit » 24 окт 2012, 16:46

Вы абсолютно правы. Именно в манифесте у меня косяк.
Исправил и все заработало в api 10.
Спасибо большое.....

Zin4uk
Сообщения: 3
Зарегистрирован: 07 ноя 2012, 18:19

Re: Урок 21. Создание и вызов Activity

Сообщение Zin4uk » 07 ноя 2012, 18:42

Здравствуйте. Спасибо автору за уроки. Есть такой вопрос, пока не нашел на него ответ, думаю у Вас найдется что сказать.
Я пытаюсь создать приложение, которое бы использовало бы в своей основе составной паттерн MVC. Поискав и интернете нашел описание его реализации для платформы андроид. Судя этому описанию Activity является сразу и вью и контроллером, а модель создается в самой Activity. В одном из функций модели я пытаюсь создать новую Activity, но как это сделать пока не понимаю, для старта новой Activity нужен контекст, но где его взять не знаю. Конечно можно модели передать стартовую Activity и использовать ее в подобных случаях, но хотелось бы не прибегать к таким радикальным мерам.

В итоге вопрос сводится к тому как создать новую Activity не из Activity?

Ну и еще хочется знать, почему андроид так привязан к визуальным формам (стартует с Activity, а не с метода main(), какого-то класса program)? Как реализовать старт с метода класса, а не с Activity?

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

Re: Урок 21. Создание и вызов Activity

Сообщение rezak90 » 07 ноя 2012, 23:26

В итоге вопрос сводится к тому как создать новую Activity не из Activity?
можно где угодно главное выполнение двух требований: наличие контекста и объявление данной активити в манифесте
почему андроид так привязан к визуальным формам?
во-первых, потому что это мобильна ось, здесь не стоит задача выполнение сложных программ; во-вторых, юзайте ndk или если увлекаетесь хардкодом то по пробуйте на асме пописать под андроид, там уж точно нету "активити" =) ; в третьих, посмотрите на лайфцикл активити и увидите что oncreate считай и есть точка входа, или же onresume можно считать то же что и main()
R.id.team
Политика на форуме запрещена

Zin4uk
Сообщения: 3
Зарегистрирован: 07 ноя 2012, 18:19

Re: Урок 21. Создание и вызов Activity

Сообщение Zin4uk » 08 ноя 2012, 10:34

Спасибо за ответ.
можно где угодно главное выполнение двух требований: наличие контекста и объявление данной активити в манифесте
Как и какой получить контекст если вызов совершается из обычного класса (не унаследованного от активити)?
во-первых, потому что это мобильна ось, здесь не стоит задача выполнение сложных программ;
Такая "привязка" к активити уж больно напоминает какой-то VB по своей сути, но как мы знаем VB не является оплотом "адекватного" приложеньестроения :)
юзайте ndk
Интересная идея, надо посмотреть, но чую что на джаве жизнь красочней :)
пробуйте на асме пописать под андроид
Спасибо, но я как-то воздержусь :)

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

Re: Урок 21. Создание и вызов Activity

Сообщение rezak90 » 08 ноя 2012, 10:59

Как и какой получить контекст если вызов совершается из обычного класса (не унаследованного от активити)?
передать в этот класс контекст
Такая "привязка" к активити уж больно напоминает какой-то VB по своей сути, но как мы знаем VB не является оплотом "адекватного" приложеньестроения
а чем плоха привязка? или вы хотите пописать консольные приложения? тогда в чём проблема, ведроид тот же линукс, только урезанный, gcc есть, правда опять таки урезанный
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 21. Создание и вызов Activity

Сообщение AndreyI » 08 ноя 2012, 11:10

Используя NDK можно вообще обойтись без единой строчки JAVA-кода и JNI, создаете свой NativeActivity прописываете его в манифесте и вперед.
Посмотрел самый простой пример, который они приводят, как оформляют Lifecycle взаимодействуют с оборудованием и т.п. пришел к выводу для себя, что для Андроид лучше писать на JAVA.

Что касается консольных приложений для Андроид, то здесь есть другая засада, запустить такое приложение можно только с правами root либо поместить в системную папку, но для этого тоже нужен root.

Zin4uk
Сообщения: 3
Зарегистрирован: 07 ноя 2012, 18:19

Re: Урок 21. Создание и вызов Activity

Сообщение Zin4uk » 08 ноя 2012, 11:24

rezak90 писал(а): а чем плоха привязка? или вы хотите пописать консольные приложения? тогда в чём проблема, ведроид тот же линукс, только урезанный, gcc есть, правда опять таки урезанный
Нет, писать консольные приложения мне не нужно. Проблема в том что правильно, когда вся логика и процессы приложения происходят внутри, что визуальные формы нужны только для того что бы вывести информацию на экран и все, только отображение. В любой момент написал новый способ вывода для модели и готово. А здесь выходит что без Activity и новую Activity не создашь и контекст для создания БД не получишь и с ресурсами нормально не поработаешь (getString() опять же таки метод Activity) и т.д. Все в активити любимой. А хотелось бы как у людей, написал логику и показываешь как хочешь, не зависишь не от чего.
Я не то что бы наезжаю или критикую, скорее спрашиваю. Я в этом деле новичок и просто хочу разобраться с помощью опытных программистов правильно ли я делаю.

Ответить