Урок 21. Создание и вызов Activity
Re: Урок 21. Создание и вызов Activity
У меня алерт, пробовал использовать фрагменты но не получилось, все хорошо было-диалог стартовал в асинктаске но если я переворачивал экран то попытка закрытия диалога с помощью команды dissmis заканчивалась крахом приложения. Так и не смог разобраться.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 21. Создание и вызов Activity
Я шел изначально по тому же пути, когда отбросил фрагментДиалоги, потому что вроде как с АлертДиалогами получалось. Сделал для них отдельный статический класс, передавал необходимые параметры и всё вроде как работало. Но вылилось это вот во что:
1. Поддерживаемость кода была на уровне того, кто создал этот код. Чем больше кода становилось, тем больше и эта грань стиралась. Спустя пол года я уже и сам потихоньку забывал, о чем данный метод и почему так. Размер класса переступил порог в 2000 строк.
2. ФрагментДиалоги довольно гибки и красивы, хотя если требуется реализовать простую задачу, то АлертДиалоги буду лучше.
В общем если логика не на уровне
" - Вы уверены что хотите выйти? Да|Нет"
то лучше может попробовать фрагментДиалоги. Лично мне пришлось переписывать все эти 2000 строк заново. Но хоть поддерживаемость стала на уровне того, что код теперь разбросал логически верно и его можно понять другим человеком.
они предложили использовать Фрагмент, в котором сделать статический метод, либо класс, который реализует данную работу. А как известно, Фрагмент - объект, который сохраняет своё состояние в случаях, наподобие поворота экрана. Разрушается только само представление (View). В итоге AsyncTask отработает нормально и к нему можно будет обратиться.
Хотя от AsyncTask тоже стоит отказываться, уже есть другие либы для этого дела, к примеру Volley, которая была представлена на Google I/O.
1. Поддерживаемость кода была на уровне того, кто создал этот код. Чем больше кода становилось, тем больше и эта грань стиралась. Спустя пол года я уже и сам потихоньку забывал, о чем данный метод и почему так. Размер класса переступил порог в 2000 строк.
2. ФрагментДиалоги довольно гибки и красивы, хотя если требуется реализовать простую задачу, то АлертДиалоги буду лучше.
В общем если логика не на уровне
" - Вы уверены что хотите выйти? Да|Нет"
то лучше может попробовать фрагментДиалоги. Лично мне пришлось переписывать все эти 2000 строк заново. Но хоть поддерживаемость стала на уровне того, что код теперь разбросал логически верно и его можно понять другим человеком.
В той статье, о которой я говорил, там это и было основной пробелмой, почему не стоит использовать android:configChanges="keyboardHidden|orientation|screenSize"все хорошо было-диалог стартовал в асинктаске но если я переворачивал экран то попытка закрытия диалога с помощью команды dissmis заканчивалась крахом приложения. Так и не смог разобраться.
они предложили использовать Фрагмент, в котором сделать статический метод, либо класс, который реализует данную работу. А как известно, Фрагмент - объект, который сохраняет своё состояние в случаях, наподобие поворота экрана. Разрушается только само представление (View). В итоге AsyncTask отработает нормально и к нему можно будет обратиться.
Хотя от AsyncTask тоже стоит отказываться, уже есть другие либы для этого дела, к примеру Volley, которая была представлена на Google I/O.
Re: Урок 21. Создание и вызов Activity
спасибо за ответ.
Я пытался использовать фрагменты таким образом:
1.Создал класс наследующийся от FragmentDialog
2. Реализовал в нем метод createDialog , в котором создавался обычный алерт диалог.
3. Создал асинктаск в методе onPreExecute я запускал фрагмент диалог кодом:
((ListActivity) ctx).getFragmentManager() так я делал потому что getFragmentManager просто так не вызывается в асинктаске.
4. в асинктаске была какая то работа
5. В методе onPostExecute я пытался закрыть диалог при помощи кода:
Ну вот и при повороте экрана именно на команде dissmis приложение падает.
Я новичок поэтому видимо что то ни так делал?
И если можно посоветуйте сайты или что то где можно следить за новшествами в андроиде, что уже устарело и к чему переходить надо.
Я пытался использовать фрагменты таким образом:
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
Я новичок поэтому видимо что то ни так делал?
И если можно посоветуйте сайты или что то где можно следить за новшествами в андроиде, что уже устарело и к чему переходить надо.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 21. Создание и вызов Activity
developer.android.com
stackoverflow.com
На этом сайте есть серия уроков на тему фрагментов. Всё же советую изучить, потому что фрагменты на столько закрепились в Андроиде, что по сути без них андроид был бы очень скудным. Вот уроки
http://startandroid.ru/ru/uroki/vse-uro ... cycle.html
Нашел всё таки, вот та тема, где говорится как лучше работать с AsynckTask при поворотах, а также размышления на эту тему
stackoverflow.com
Вот этого делать как раз и не надо. Нужно реализовывать через слушатели (Listener), вот тут показан пример от гугл как делать надо http://developer.android.com/guide/comp ... l#Managing((ListActivity) ctx).getFragmentManager() так я делал потому что getFragmentManager просто так не вызывается в асинктаске.
На этом сайте есть серия уроков на тему фрагментов. Всё же советую изучить, потому что фрагменты на столько закрепились в Андроиде, что по сути без них андроид был бы очень скудным. Вот уроки
http://startandroid.ru/ru/uroki/vse-uro ... cycle.html
Нашел всё таки, вот та тема, где говорится как лучше работать с AsynckTask при поворотах, а также размышления на эту тему
Re: Урок 21. Создание и вызов Activity
Спасибо буду разбираться.
Re: Урок 21. Создание и вызов Activity
У меня тоже мнение делить, но не так, как вы описали. Все, что относится к управлению активити и ее визуальному - это одно. Отделять нужно то, что функционирует отдельно - расчеты, работу с бд (как тут многие лепят в код активити), обработку строковых констант (например, преобразование их к виду), какие-то проверки (если они используются в разных местах). Но вот отделять то, что использует view я бы не стала. Если напрягает большой длинный код - у эклипса есть плюсики - сворачиваем то, что давно и верно написали и дело в шляпе.hard писал(а):Заранее извиняюсь не знал в какую тему написать. Нужен совет вот в каком вопросе:
Допустим имеется большое приложение и в файле MainActivity очень много кода, который усложняет чтение и понимание программы. Для упрощения создаю вспомогательный класс в который передаю MainActivity и в котором реализую нужные мне методы которые так же взаимодействуют с View(к примеру установка адаптера в listView act.listview.setAdapter(adapter)). Не приведет ли такой подход к проблемам и ошибкам?
Вообще, лучше не выдумывать сразу самому, а посмотреть шаблоны проектирования кода. Например, Model-View-Presenter - я как-то на ютюбе смотрела хорошее объяснение (на русском) как это понимать и применять на простом примере (кажется калькулятор писали). Так вот лучше взять за основу что-то такое, а уже потом, исходя из этих знаний делить код на модули, классы и т.д.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 21. Создание и вызов Activity
Ссылку нашла, как бы не в от эта 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
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 21. Создание и вызов Activity
Добрый вечер!
Подскажите как сделать так, чтобы вторая Activity которая отображается на экране при нажатии на back не уничтожалась, и при повторном вызове второй активити из первой startActivity() она восстанавливалась?
Заранее благодарен за ответ.
Подскажите как сделать так, чтобы вторая Activity которая отображается на экране при нажатии на back не уничтожалась, и при повторном вызове второй активити из первой startActivity() она восстанавливалась?
Заранее благодарен за ответ.
Re: Урок 21. Создание и вызов Activity
а зачем?Дмитрий_ писал(а):Добрый вечер!
Подскажите как сделать так, чтобы вторая Activity которая отображается на экране при нажатии на back не уничтожалась, и при повторном вызове второй активити из первой startActivity() она восстанавливалась?
Заранее благодарен за ответ.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Урок 21. Создание и вызов Activity
Чтобы не создавать второй экземпляр Activity, если она уже отображается то просто в ней изменить надписи.
Re: Урок 21. Создание и вызов Activity
Я бы советовал подумать над архитектурой. Что такого особого во второй Activity что мешает его пересоздать?Дмитрий_ писал(а):Чтобы не создавать второй экземпляр Activity, если она уже отображается то просто в ней изменить надписи.
Ну к примеру в манифесте у Activity можно прописать launchMode="singleInstance". Тогда если она уже лежит в стеке (т.е. к ней можно вернуться по back) будет использована та же Activity.
Или ты из активити хочешь запустить копию этой же активити?
Вообще возможно стоит посмотреть в сторону фрагментов.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Урок 21. Создание и вызов Activity
активити нужно пересоздавать, сохранив ее состояние, например, в SharedPreferences.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 21. Создание и вызов Activity
Мне состояние и текущие данные в текущей ненужны! Мне нужно исключить создание еще одной Activity2.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 21. Создание и вызов Activity
Советую почитать про Task. Там стек работает по принципу последний вошел-первый вышел. А это значит, что кнопка back уничтожает то, что мы видели, когда нажимали кнопку back. Можно переопределить конечно кнопку назад и шаманить, но это извращение.
Как уже сказал anber, а сказал очень верно, дорога Вам во фрагменты, там с backStack можно работать очень неплохо. И пересоздавать ничего не нужно будет. И вообще много всяких плюшек. Советую не полениться, потратить с недельку на работу с фрагментами и про большинство геморроя можно забыть.
Как уже сказал anber, а сказал очень верно, дорога Вам во фрагменты, там с backStack можно работать очень неплохо. И пересоздавать ничего не нужно будет. И вообще много всяких плюшек. Советую не полениться, потратить с недельку на работу с фрагментами и про большинство геморроя можно забыть.
Re: Урок 21. Создание и вызов Activity
Спасибо! .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - Помогло, теперь только один экземпляр Activity при повторном его вызове.
А как из класса первого активити можно поменять значение в TextView которое во втором активити?
Пока делаю так:
В первом Activity
А во втором Activity
Может есть проще вариант?
А как из класса первого активити можно поменять значение в TextView которое во втором активити?
Пока делаю так:
В первом Activity
Код: Выделить всё
SharedPreferences settings = getSharedPreferences("mysettings", 0);
SharedPreferences.Editor editor = settings.edit();
// Save
editor.putString("Key_tv1", s);
editor.commit();
startActivity(IntentMainWork);
Код: Выделить всё
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
Если без старта активности, то правильно. Если мы с одной активности стартуем вторую и во второй надо изменить текст, то засовываем всё в Bundle что надо изменить. А во второй уже меняем, открывая Bundle.
P.S. не забываем про фрагменты!
P.S. не забываем про фрагменты!
Re: Урок 21. Создание и вызов Activity
Добрый день.
Еще возник вопрос:
Как из кода в основной Activity закрыть все дочерние запущенные через startActivityForResult, либо просто переключится на на основную?
Еще возник вопрос:
Как из кода в основной Activity закрыть все дочерние запущенные через startActivityForResult, либо просто переключится на на основную?
Re: Урок 21. Создание и вызов Activity
Если я правильно понимаю поверх основной активити, (запущенная этой осоновной активити) может находиться только одна дочерняя?! В дочерней вызвать finish(); или же просто с помощью intent вызвать основное активити.
Re: Урок 21. Создание и вызов Activity
у меня проблема такая с 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 );
}
}
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 );
}
}
Re: Урок 21. Создание и вызов Activity
добавил активити в манифесте переходит без проблем в другой леаут с 1 леаута в девайсе но при нажатии на кнопку во 2 леауте он не переходит обратно я пробовал чтобы менялся текст тоже ничего не происходит почему не видит кнопка обработчик выше код для 2 леаута