Помогите!

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
iamtihonov
Сообщения: 41
Зарегистрирован: 20 сен 2012, 12:57

Помогите!

Сообщение iamtihonov » 21 фев 2013, 17:33

Всем привет! Надеюсь что мне мне поможете. :( Вот хочу сделать урок 91, но только и использование динамически добавляемыми фрагментами и появились у меня вот такие вопросы:
1. Почему при поворачиванию экрана создаться экземпляр Fragment соответствующий предыдущему, но с другим Хеш
кодом, который мне не нужен, у меня все равно в onCreateView создаёться Fragmen
2. Как выйти из ситуации что setRetainInstance(true) не работает при динамическом добавлении фрагмента
3. И собственно что ещё у меня не так
4. И если идти до конца, какую ссылку мы должны передавать в статический класс MyTask, что бы был доступ к фрагменту?

Побывал сохранить экземпляр фрагмента ничего из этого хорошего не получилось

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

public class MainActivity extends Activity {

	
	private FragmentTransaction fragmentTransaction;
	public Fragm1 currFragm1;
	

	@SuppressLint("NewApi")
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.d("Log3", "create MainActivity: " + this.hashCode());

		currFragm1 = new Fragm1();
		
		fragmentTransaction = getFragmentManager().beginTransaction();
		fragmentTransaction.replace(R.id.frag_content2, currFragm1);
		fragmentTransaction.commit();
	}
}

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

public class Fragm1 extends Fragment {

	private TextView tv;
	private MyTask mt;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.fragm1, container, false);

		Log.d("Log3", "create Fragm1: " + this.hashCode());

		tv = (TextView) v.findViewById(R.id.tv);
		
		if (mt == null) {
			mt = new MyTask();
			mt.execute();
			Log.d("Log3", "create MyTask: " + mt.hashCode());
		}
		
		return v;
	}
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		setRetainInstance(true);
	}
	
	class MyTask extends AsyncTask<String, Integer, Void> {

		@Override
		protected Void doInBackground(String... params) {
			try {
				for (int i = 1; i <= 10; i++) {
					TimeUnit.SECONDS.sleep(1);
					publishProgress(i);
					Log.d("Log3", "i = " + i
							+ ", Fragm1: " + Fragm1.this.hashCode()
							+ ", MyTask: " + this.hashCode());
				}

			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			return null;
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			super.onProgressUpdate(values);
			tv.setText("i = " + values[0]);
		}
	}
}

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

Re: Помогите!

Сообщение damager82 » 28 фев 2013, 14:11

setRetainInstance(true) работает для динамически добавляемых. Просто вы при пересоздании Activity сами явно создаете фрагмент. Тут у него уже выбора не остается, он пересоздается.

А в MyTask передавайте ссылку на фрагмент.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

iamtihonov
Сообщения: 41
Зарегистрирован: 20 сен 2012, 12:57

Re: Помогите!

Сообщение iamtihonov » 03 мар 2013, 17:55

Спасибо, в общем получилось так что я сохраняю экземпляр фрагмента и с ним продолжаю работать и в фрагменте сохраняю экземпляр MyTask, и тогда не нужно передавать ссылку и все замечательно работает))) Но раньше кажется так побывал не получалось...
И я вот думаю а как мне сохранить несколько экземпляров если в Activity у нас не доступен метод setRetainInstance(true)?

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

Re: Помогите!

Сообщение rezak90 » 03 мар 2013, 21:18

setRetainInstance этот метод запрещает вызываться onCreate у фрагмента (если в true стоит), так что вы что то путаете
R.id.team
Политика на форуме запрещена

iamtihonov
Сообщения: 41
Зарегистрирован: 20 сен 2012, 12:57

Re: Помогите!

Сообщение iamtihonov » 04 мар 2013, 00:54

Если точнее то метод

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

publicvoid onActivityCreated(Bundle savedInstanceState) {
	super.onActivityCreated(savedInstanceState);
	setRetainInstance(true);
}
Я так понимаю он сохраняет все наши экземпляры объектов,

И по поводу выше написанных слов, даже не нужно оказалось сохранять экземпляр Фрагмента а просто достаточно сделать проверку на первый запуск приложения
if(savedInstanceState == null){...}

Вопрос собственно в том как можно сохранить несколько Экземпляров фрагмента в Активити если метод onRetainNonConfigurationInstance может только один?

Ответить