Урок 104. Android 3. Fragments. Lifecycle

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

Урок 104. Android 3. Fragments. Lifecycle

Сообщение damager82 » 26 авг 2012, 23:00

 В этом уроке:
- используем фрагменты
- разбираемся в их lifecycle


Click here to read this article!
Последний раз редактировалось damager82 23 май 2017, 22:06, всего редактировалось 6 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

kolipass
Сообщения: 50
Зарегистрирован: 16 апр 2012, 14:10

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение kolipass » 27 авг 2012, 07:38

Спасибо за статью. Вот бы еще пару слов про android-support-v4, оно бы реально очень помогло, или будет отдельная статья. как для старых андроидов сделать хорошо?

Yusyuriv
Сообщения: 12
Зарегистрирован: 14 май 2012, 08:30

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение Yusyuriv » 28 авг 2012, 08:55

Как раз стал интересоваться фрагментами, а тут и уроки по ним. Жду 105 урок! :)
kolipass писал(а):Спасибо за статью. Вот бы еще пару слов про android-support-v4, оно бы реально очень помогло, или будет отдельная статья. как для старых андроидов сделать хорошо?
Я точно не знаю, но, по-моему, достаточно положить android-support-v4.jar в папку libs, а в коде вместо, например, android.app.FragmentActivity использовать android.support.v4.app.FragmentActivity. Ну и со всеми необходимыми классами так. На сайте из различий указано только
To manage your fragments and loaders, you must use the methods FragmentActivity.getSupportFragmentManager() and FragmentActivity.getSupportLoaderManager() (instead of the getFragmentManager() and getLoaderManager() methods).

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

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение KamiSempai » 28 авг 2012, 10:47

В последнем SDK, при создании проекта, android-support-v4.jar прикрепляется автоматически.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ervin
Сообщения: 5
Зарегистрирован: 30 сен 2012, 16:42
Откуда: Киев

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение Ervin » 30 сен 2012, 17:26

Спасибо за туториалы по Android.
Как можно решить след. проблему:
Девайс для тестов Android 2.3.3 api10 (LG P500)
Проект 2.3.3 api 10 + android-support-v4
Пример компилится, но вылетает при запуске, ругаясь:

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

FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MyActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class fragment
...
 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MyActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class fragment // тут первая строчка <fragment 
...
 at android.app.Activity.setContentView(Activity.java:1657) at com.example.MyActivity.onCreate(MyActivity.java:13) // тут setContentView(R.layout.main);      
...
Caused by: java.lang.ClassNotFoundException: android.view.fragment in loader dalvik.system.PathClassLoader[/data/app/com.example-1.apk] 
импорты: import android.support.v4.app.Fragment;
в main.xml xmlns:tools="http://schemas.android.com/tools" выделено серым - типа не используется
Support4vDemos в комплекте с либой работают.
на эмуляторе api16 пример работает.

Возможно, есть какие-нибудь предположения по решению проблемы?

Аватара пользователя
Bersh
Сообщения: 20
Зарегистрирован: 30 сен 2012, 17:17

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение Bersh » 02 окт 2012, 11:00

Ervin писал(а):Спасибо за туториалы по Android.
Как можно решить след. проблему:
Девайс для тестов Android 2.3.3 api10 (LG P500)
Проект 2.3.3 api 10 + android-support-v4
Пример компилится, но вылетает при запуске, ругаясь:

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

FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MyActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class fragment
...
 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MyActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class fragment // тут первая строчка <fragment 
...
 at android.app.Activity.setContentView(Activity.java:1657) at com.example.MyActivity.onCreate(MyActivity.java:13) // тут setContentView(R.layout.main);      
...
Caused by: java.lang.ClassNotFoundException: android.view.fragment in loader dalvik.system.PathClassLoader[/data/app/com.example-1.apk] 
импорты: import android.support.v4.app.Fragment;
в main.xml xmlns:tools="http://schemas.android.com/tools" выделено серым - типа не используется
Support4vDemos в комплекте с либой работают.
на эмуляторе api16 пример работает.

Возможно, есть какие-нибудь предположения по решению проблемы?
Поправьте меня если я не прав, но на девайсе с api 10 никак не удастся запустить функционал добавленный в api 11. ИМХО тут 3 варианта: либо тестить на эмуляторе,
либо искать девайс с более новым андроидом, либо реализовывать поддержку разных версий api в приложении (но в любом случае фрагментов на api 10 все равно не увидеть)

Ervin
Сообщения: 5
Зарегистрирован: 30 сен 2012, 16:42
Откуда: Киев

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение Ervin » 02 окт 2012, 13:18

Bersh писал(а):
Ervin писал(а): Support4vDemos в комплекте с либой работают.
Поправьте меня если я не прав, но на девайсе с api 10 никак не удастся запустить функционал добавленный в api 11. ИМХО тут 3 варианта: либо тестить на эмуляторе,
либо искать девайс с более новым андроидом, либо реализовывать поддержку разных версий api в приложении (но в любом случае фрагментов на api 10 все равно не увидеть)
Примеры которые идут с либой в комплекте я у себя запускаю нормально + либа на то и рассчитана что бы добавить функционал в старые версии

Shifted
Сообщения: 7
Зарегистрирован: 12 окт 2012, 13:52

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение Shifted » 12 окт 2012, 14:02

Fragments запускаются, согласно документации, от Android 1.6.
Возможно проблема в том, что не указано:

public class MainActivity extends FragmentActivity {...

Как и было сказано ранее: не забываем про import android.support.v4.app.Fragment;

Ervin
Сообщения: 5
Зарегистрирован: 30 сен 2012, 16:42
Откуда: Киев

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение Ervin » 08 ноя 2012, 04:39

Shifted писал(а): public class MainActivity extends FragmentActivity {...
Спасибо, помогло.

heluvet
Сообщения: 8
Зарегистрирован: 20 дек 2012, 09:48

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение heluvet » 12 янв 2013, 14:25

Скачал пример приложения с фрагментами с сайта автора

http://androidbook.com/akc/filestorage/ ... gments.zip

В проекте, который должен поддерживать предыдущие версии SDK. ошибка "The method onInflate(AttributeSet, Bundle) of type DetailsFragment must override or implement a supertype method" в onInflate

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

    @Override
    public void onInflate(AttributeSet attrs, Bundle savedInstanceState) {
    	Log.v(MainActivity.TAG,
    			"in DetailsFragment onInflate. AttributeSet contains:");
    	for(int i=0; i<attrs.getAttributeCount(); i++)
            Log.v(MainActivity.TAG, "    " + attrs.getAttributeName(i) +
            		" = " + attrs.getAttributeValue(i));
    	super.onInflate(attrs, savedInstanceState);
    }
Не подскажете в чем проблема?

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

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение rezak90 » 12 янв 2013, 15:27

Windows -> Preferences -> Java -> Compiler поставить версию 1.6
R.id.team
Политика на форуме запрещена

heluvet
Сообщения: 8
Зарегистрирован: 20 дек 2012, 09:48

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение heluvet » 12 янв 2013, 16:36

rezak90 писал(а):Windows -> Preferences -> Java -> Compiler поставить версию 1.6
не помогло. так же подчеркнуто красным

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение Finch » 12 янв 2013, 16:54

У тебя так?
CEO of a company R.id.team

heluvet
Сообщения: 8
Зарегистрирован: 20 дек 2012, 09:48

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение heluvet » 12 янв 2013, 17:16

Finch писал(а):У тебя так?
да, именно так

http://imageshack.us/photo/my-images/13/123qom.jpg/

dumbDroid
Сообщения: 2
Зарегистрирован: 10 мар 2013, 00:52

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение dumbDroid » 14 апр 2013, 15:49

heluvet писал(а):Скачал пример приложения с фрагментами с сайта автора

http://androidbook.com/akc/filestorage/ ... gments.zip

В проекте, который должен поддерживать предыдущие версии SDK. ошибка "The method onInflate(AttributeSet, Bundle) of type DetailsFragment must override or implement a supertype method" в onInflate

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

    @Override
    public void onInflate(AttributeSet attrs, Bundle savedInstanceState) {
    	Log.v(MainActivity.TAG,
    			"in DetailsFragment onInflate. AttributeSet contains:");
    	for(int i=0; i<attrs.getAttributeCount(); i++)
            Log.v(MainActivity.TAG, "    " + attrs.getAttributeName(i) +
            		" = " + attrs.getAttributeValue(i));
    	super.onInflate(attrs, savedInstanceState);
    }
Не подскажете в чем проблема?

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

@Override 
public void onInflate(Activity activity, AttributeSet attrs,
            Bundle savedInstanceState) {
        super.onInflate(activity, attrs, savedInstanceState); // Always call the superclass method first!
        ....
}

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

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение Mikhail_dev » 05 июн 2013, 13:02

Для работы с API<11 не забывайте то, что активность должна наследоваться от FragmentActivity, а не от Activity, как это в API>=11
[syntax=java]
...
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
...
[/syntax]
Вот тут про это написано
Ну и сами фрагменты должны быть
[syntax=java]
public class Fragment1 extends android.support.v4.app.Fragment {
[/syntax]

max546
Сообщения: 8
Зарегистрирован: 13 янв 2013, 21:41

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение max546 » 12 окт 2013, 16:25

Здравствуйте, наткнулся на такую проблему. Есть SherlockFragmentActivity с двумя табами, содержимым которых является SherlockFragment. При переключении табов, соответственно фрагменты пересоздаются, мне нужно сохранять состояние, пробовал использовать setRetainInstance(true), не помогает фрагменты все равно пересоздаются, так же пробовал использовать onSaveInstanceState(Bundle outState)-тут ситуация еще интересней: при переключении табов этот метод вообще не выполняется, при повороте устройства метод отрабатывает, но onCreateView вызывается два раза, соответственно после второго вызова Bundle==null. И в итоге тоже ничего не сохраняется.
Вопрос:
Почему onCreateView отрабатывает 2 раза ?
Почему не работает setRetainInstance(true) ?

MainActivity

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

package ru.nn.sergach.smv.stopwatch2;

import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;

import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockDialogFragment;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.Menu;

public class MainActivity extends SherlockFragmentActivity implements
		ActionBar.TabListener {

	final String LOG_TAG = "myLogs";
	FragmentStopwatch fragmentStopwatch;
	FragmentTimer fragmentTimer;
	FragmentTransaction fTrans;
	SherlockDialogFragment dialogExit;

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

		fragmentStopwatch = new FragmentStopwatch();
		//fragmentStopwatch.setRetainInstance(true);//<-пробовал так, не получается
		fragmentTimer = new FragmentTimer();
		//fragmentTimer.setRetainInstance(true);//<-пробовал так, не получается

		ActionBar bar = this.getSupportActionBar();
		bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

		Tab tab = bar.newTab();
		tab.setText("Секундомер");
		tab.setTabListener(this);
		bar.addTab(tab);

		tab = bar.newTab();
		tab.setText("Таймер");
		tab.setTabListener(this);
		bar.addTab(tab);

		dialogExit = new DialogExit();

	}


	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		// Log.d(LOG_TAG, "selected tab: " + tab.getPosition());
		fTrans = getSupportFragmentManager().beginTransaction();
		fTrans.replace(R.id.frgmCont,
				tab.getPosition() == 0 ? fragmentStopwatch : fragmentTimer);
		fTrans.commit();

	}
}

Fragment 1

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

package ru.nn.sergach.smv.stopwatch2;

import java.util.ArrayList;
import java.util.List;
import ru.nn.sergach.smv.stopwatch2.Stopwatch.onTickListener;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import com.actionbarsherlock.app.SherlockFragment;

public class FragmentStopwatch extends SherlockFragment implements
		onTickListener, OnClickListener {

	Stopwatch stopwatch;
	TextView textDisplay, textMiliSec;
	Button buttonStart, buttonLap;
	String start, lap; //переменные которые не должны пересоздаваться
	/**
	 * коллекция для отображения в списке
	 */
	ArrayList<String> stringLap;//и эта не должна пересоздаваться
	ArrayAdapter<String> adapter;
	ListView lvMain;

        @Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		// setRetainInstance(true);//так не выходит 
	}
	
	@Override
	public void onDestroy(){
		super.onDestroy();
		Log.d("myLog", "FragmentStopwatch onDestroy");
	}

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

		Log.d("myLog", "FragmentStopwatch onCreateView");
		buttonStart = (Button) v.findViewById(R.id.buttonStart);
		buttonStart.setOnClickListener(this);

		buttonLap = (Button) v.findViewById(R.id.buttonLap);
		buttonLap.setOnClickListener(this);
		textDisplay = (TextView) v.findViewById(R.id.textDisplay);
		textMiliSec = (TextView) v.findViewById(R.id.textMiliSec);
		lvMain = (ListView) v.findViewById(R.id.lvMain);

		stopwatch = new Stopwatch();
		stopwatch.setOnTickListener(this);
		
		if(savedInstanceState!=null){
			Log.d("myLog", "111");
			start=savedInstanceState.getString("start");
			lap=savedInstanceState.getString("lap");
			stringLap=savedInstanceState.getStringArrayList("stringLap");
		}
		else{
			Log.d("myLog", "000");
			start = "start";
			lap = "reset";
			stringLap = new ArrayList<String>();
		}		
		
		adapter = new ArrayAdapter<String>(this.getActivity(),
				R.layout.my_list_item, stringLap);
		lvMain.setAdapter(adapter);		
		return v;
	}
	
	@Override
	public void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
	    Log.d("myLog", "onSaveInstanceState");
	    outState.putString ("start", start);
	    outState.putString ("lap", lap);
	    outState.putStringArrayList("stringLap", stringLap);
	    
	  }

	@Override
	public void tick(String numberDisp, String s) {
		// TODO Auto-generated method stub
		if (numberDisp.equals("1")) {
			textDisplay.setText(s);
		} else if (numberDisp.equals("2")) {
			textMiliSec.setText(s);
		}

	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.buttonStart:
			if (start == "start") {
				stopwatch.start();
				start = "stop";
				lap = "lap";
				buttonStart.setBackgroundResource(R.drawable.button_red_xml);
				buttonLap.setBackgroundResource(R.drawable.button_blue_xml);
				buttonLap.setText(R.string.Lap);
				buttonStart.setText(R.string.Stop);
			} else if (start == "stop") {
				stopwatch.Stop();
				start = "start";
				lap = "reset";// установка переменной на которую ориентируется
								// кнопка
				buttonStart.setBackgroundResource(R.drawable.button_green_xml);
				buttonLap
						.setBackgroundResource(R.drawable.button_nonactive_xml);
				buttonLap.setText(R.string.Reset);
				buttonStart.setText(R.string.Start);
			}
			break;
		case R.id.buttonLap:
			if (lap == "reset") {
				stringLap.clear();
				adapter.notifyDataSetChanged();
				stopwatch.Reset();
			} else if (lap == "lap") {
				stringLap.add(stopwatch.getTimer());
				adapter.notifyDataSetChanged();
				// прокручивание списка до последней добавленной строки
				lvMain.setSelection(stringLap.size());
			}
			break;
		}
	}

}

когда ставлю подсветку кода- точки заменяются на какой то код, копировал из eclipse

avex
Сообщения: 24
Зарегистрирован: 22 дек 2013, 06:19

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение avex » 03 фев 2014, 09:46

Unfortuly Fragments has stopped

т.е. приложение не запустилось. Какие могут быть причины? Все делал по уроку. С эклипсом и эмулятором все в порядке. Коды полностью скопировал, кроме названия пакета.

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

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение rezak90 » 03 фев 2014, 10:28

See your LogCat.
R.id.team
Политика на форуме запрещена

avex
Сообщения: 24
Зарегистрирован: 22 дек 2013, 06:19

Re: Урок 104. Android 3. Fragments. Lifecycle

Сообщение avex » 03 фев 2014, 12:12

Много строчек.
Например, такие

...
02-03 03:57:57.980: W/dalvikvm(959): threadid=1: thread exiting with uncaught exception (group=0xb4a69ba8)
...
02-03 03:57:58.030: E/AndroidRuntime(959): FATAL EXCEPTION: main
...
02-03 03:57:58.030: E/AndroidRuntime(959): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragments/com.example.fragments.MainActivity}: android.view.InflateException: Binary XML file line #10: Error inflating class fragment
...
02-03 03:57:58.030: E/AndroidRuntime(959): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment package com.example.fragments.Fragment1: make sure class name exists, is public, and has an empty constructor that is public
...
02-03 03:57:58.030: E/AndroidRuntime(959): Caused by: java.lang.ClassNotFoundException: Didn't find class "package com.example.fragments.Fragment1" on path: DexPathList[[zip file "/data/app/com.example.fragments-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.fragments-1, /system/lib]]

Ответить