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

Обсуждение уроков
hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

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

Сообщение hard » 13 сен 2013, 22:36

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

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 13 сен 2013, 23:00

Я шел изначально по тому же пути, когда отбросил фрагментДиалоги, потому что вроде как с АлертДиалогами получалось. Сделал для них отдельный статический класс, передавал необходимые параметры и всё вроде как работало. Но вылилось это вот во что:
1. Поддерживаемость кода была на уровне того, кто создал этот код. Чем больше кода становилось, тем больше и эта грань стиралась. Спустя пол года я уже и сам потихоньку забывал, о чем данный метод и почему так. Размер класса переступил порог в 2000 строк.
2. ФрагментДиалоги довольно гибки и красивы, хотя если требуется реализовать простую задачу, то АлертДиалоги буду лучше.

В общем если логика не на уровне
" - Вы уверены что хотите выйти? Да|Нет"
то лучше может попробовать фрагментДиалоги. Лично мне пришлось переписывать все эти 2000 строк заново. Но хоть поддерживаемость стала на уровне того, что код теперь разбросал логически верно и его можно понять другим человеком.
все хорошо было-диалог стартовал в асинктаске но если я переворачивал экран то попытка закрытия диалога с помощью команды dissmis заканчивалась крахом приложения. Так и не смог разобраться.
В той статье, о которой я говорил, там это и было основной пробелмой, почему не стоит использовать android:configChanges="keyboardHidden|orientation|screenSize"
они предложили использовать Фрагмент, в котором сделать статический метод, либо класс, который реализует данную работу. А как известно, Фрагмент - объект, который сохраняет своё состояние в случаях, наподобие поворота экрана. Разрушается только само представление (View). В итоге AsyncTask отработает нормально и к нему можно будет обратиться.
Хотя от AsyncTask тоже стоит отказываться, уже есть другие либы для этого дела, к примеру Volley, которая была представлена на Google I/O.

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

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

Сообщение hard » 14 сен 2013, 08:13

спасибо за ответ.
Я пытался использовать фрагменты таким образом:
1.Создал класс наследующийся от FragmentDialog
2. Реализовал в нем метод createDialog , в котором создавался обычный алерт диалог.
3. Создал асинктаск в методе onPreExecute я запускал фрагмент диалог кодом:

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

DialogFragment newFragment = MyAlertDialogFragment();
    newFragment.show(((ListActivity) ctx).getFragmentManager(), "dialog");

((ListActivity) ctx).getFragmentManager() так я делал потому что getFragmentManager просто так не вызывается в асинктаске.

4. в асинктаске была какая то работа
5. В методе onPostExecute я пытался закрыть диалог при помощи кода:

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

((ListActivity) ctx).getSupportFragmentManager().findFragmentByTag("dialog").getDialog().dissmis
Ну вот и при повороте экрана именно на команде dissmis приложение падает.

Я новичок поэтому видимо что то ни так делал?

И если можно посоветуйте сайты или что то где можно следить за новшествами в андроиде, что уже устарело и к чему переходить надо.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 14 сен 2013, 08:54

developer.android.com
stackoverflow.com
((ListActivity) ctx).getFragmentManager() так я делал потому что getFragmentManager просто так не вызывается в асинктаске.
Вот этого делать как раз и не надо. Нужно реализовывать через слушатели (Listener), вот тут показан пример от гугл как делать надо http://developer.android.com/guide/comp ... l#Managing
На этом сайте есть серия уроков на тему фрагментов. Всё же советую изучить, потому что фрагменты на столько закрепились в Андроиде, что по сути без них андроид был бы очень скудным. Вот уроки
http://startandroid.ru/ru/uroki/vse-uro ... cycle.html

Нашел всё таки, вот та тема, где говорится как лучше работать с AsynckTask при поворотах, а также размышления на эту тему

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

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

Сообщение hard » 14 сен 2013, 08:56

Спасибо буду разбираться.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 14 сен 2013, 20:08

hard писал(а):Заранее извиняюсь не знал в какую тему написать. Нужен совет вот в каком вопросе:
Допустим имеется большое приложение и в файле MainActivity очень много кода, который усложняет чтение и понимание программы. Для упрощения создаю вспомогательный класс в который передаю MainActivity и в котором реализую нужные мне методы которые так же взаимодействуют с View(к примеру установка адаптера в listView act.listview.setAdapter(adapter)). Не приведет ли такой подход к проблемам и ошибкам?
У меня тоже мнение делить, но не так, как вы описали. Все, что относится к управлению активити и ее визуальному - это одно. Отделять нужно то, что функционирует отдельно - расчеты, работу с бд (как тут многие лепят в код активити), обработку строковых констант (например, преобразование их к виду), какие-то проверки (если они используются в разных местах). Но вот отделять то, что использует view я бы не стала. Если напрягает большой длинный код - у эклипса есть плюсики - сворачиваем то, что давно и верно написали и дело в шляпе.

Вообще, лучше не выдумывать сразу самому, а посмотреть шаблоны проектирования кода. Например, Model-View-Presenter - я как-то на ютюбе смотрела хорошее объяснение (на русском) как это понимать и применять на простом примере (кажется калькулятор писали). Так вот лучше взять за основу что-то такое, а уже потом, исходя из этих знаний делить код на модули, классы и т.д.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 14 сен 2013, 20:09

Ссылку нашла, как бы не в от эта http://edu.jobsmarket.ru/library/it/9811/
тут лекция по шаблону проектирования. К сожалению посмотреть мне некогда, чтобы убедиться.
Там все очень несложно.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Дмитрий_
Сообщения: 9
Зарегистрирован: 17 сен 2013, 19:46

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

Сообщение Дмитрий_ » 17 сен 2013, 19:59

Добрый вечер!
Подскажите как сделать так, чтобы вторая Activity которая отображается на экране при нажатии на back не уничтожалась, и при повторном вызове второй активити из первой startActivity() она восстанавливалась?

Заранее благодарен за ответ.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

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

Сообщение anber » 17 сен 2013, 20:09

Дмитрий_ писал(а):Добрый вечер!
Подскажите как сделать так, чтобы вторая Activity которая отображается на экране при нажатии на back не уничтожалась, и при повторном вызове второй активити из первой startActivity() она восстанавливалась?

Заранее благодарен за ответ.
а зачем?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Дмитрий_
Сообщения: 9
Зарегистрирован: 17 сен 2013, 19:46

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

Сообщение Дмитрий_ » 18 сен 2013, 07:34

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

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

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

Сообщение anber » 18 сен 2013, 12:31

Дмитрий_ писал(а):Чтобы не создавать второй экземпляр Activity, если она уже отображается то просто в ней изменить надписи.
Я бы советовал подумать над архитектурой. Что такого особого во второй Activity что мешает его пересоздать?
Ну к примеру в манифесте у Activity можно прописать launchMode="singleInstance". Тогда если она уже лежит в стеке (т.е. к ней можно вернуться по back) будет использована та же Activity.

Или ты из активити хочешь запустить копию этой же активити?

Вообще возможно стоит посмотреть в сторону фрагментов.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 18 сен 2013, 13:01

активити нужно пересоздавать, сохранив ее состояние, например, в SharedPreferences.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Дмитрий_
Сообщения: 9
Зарегистрирован: 17 сен 2013, 19:46

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

Сообщение Дмитрий_ » 18 сен 2013, 14:54

Мне состояние и текущие данные в текущей ненужны! Мне нужно исключить создание еще одной Activity2.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 18 сен 2013, 15:09

Советую почитать про Task. Там стек работает по принципу последний вошел-первый вышел. А это значит, что кнопка back уничтожает то, что мы видели, когда нажимали кнопку back. Можно переопределить конечно кнопку назад и шаманить, но это извращение.
Как уже сказал anber, а сказал очень верно, дорога Вам во фрагменты, там с backStack можно работать очень неплохо. И пересоздавать ничего не нужно будет. И вообще много всяких плюшек. Советую не полениться, потратить с недельку на работу с фрагментами и про большинство геморроя можно забыть.

Дмитрий_
Сообщения: 9
Зарегистрирован: 17 сен 2013, 19:46

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

Сообщение Дмитрий_ » 19 сен 2013, 07:42

Спасибо! .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - Помогло, теперь только один экземпляр Activity при повторном его вызове.
А как из класса первого активити можно поменять значение в TextView которое во втором активити?
Пока делаю так:
В первом Activity

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

        SharedPreferences settings = getSharedPreferences("mysettings", 0);
    	SharedPreferences.Editor editor = settings.edit();
        // Save
         editor.putString("Key_tv1", s);
         editor.commit();
         
    	startActivity(IntentMainWork);
А во втором Activity

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

protected void onResume() {
      super.onResume();
      // Init
      SharedPreferences settings = getSharedPreferences("mysettings", 0);
      // Load
      tv.setText(settings.getString("Key_tv1", ""));
}
Может есть проще вариант?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 19 сен 2013, 08:29

Если без старта активности, то правильно. Если мы с одной активности стартуем вторую и во второй надо изменить текст, то засовываем всё в Bundle что надо изменить. А во второй уже меняем, открывая Bundle.
P.S. не забываем про фрагменты!

Дмитрий_
Сообщения: 9
Зарегистрирован: 17 сен 2013, 19:46

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

Сообщение Дмитрий_ » 27 сен 2013, 12:26

Добрый день.
Еще возник вопрос:
Как из кода в основной Activity закрыть все дочерние запущенные через startActivityForResult, либо просто переключится на на основную?

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

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

Сообщение hard » 27 сен 2013, 14:40

Если я правильно понимаю поверх основной активити, (запущенная этой осоновной активити) может находиться только одна дочерняя?! В дочерней вызвать finish(); или же просто с помощью intent вызвать основное активити.

Anton30
Сообщения: 7
Зарегистрирован: 26 сен 2013, 18:03

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

Сообщение Anton30 » 27 сен 2013, 15:00

у меня проблема такая с 1 layout на другой при нажатии на кнопку переходит без проблем а вот во 2 layout при нажатии на кнопку ничего не происходит ...
package com.exaple.test1;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Activ extends Activity {

Button btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);

btn2 = (Button) findViewById(R.id.btn2);

btn2=(Button)findViewById(R.id.btn2);


OnClickListener OnClickRevers = new OnClickListener() {
@Override
public void onClick(View v) {

setContentView(R.layout.main);

}
};

btn2.setOnClickListener(OnClickRevers );

}


}

Anton30
Сообщения: 7
Зарегистрирован: 26 сен 2013, 18:03

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

Сообщение Anton30 » 28 сен 2013, 06:26

добавил активити в манифесте переходит без проблем в другой леаут с 1 леаута в девайсе но при нажатии на кнопку во 2 леауте он не переходит обратно я пробовал чтобы менялся текст тоже ничего не происходит почему не видит кнопка обработчик выше код для 2 леаута

Ответить