Страница 1 из 6

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

Добавлено: 26 авг 2012, 23:00
damager82
 В этом уроке:
- используем фрагменты
- разбираемся в их lifecycle


Click here to read this article!

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

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

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

Добавлено: 28 авг 2012, 08:55
Yusyuriv
Как раз стал интересоваться фрагментами, а тут и уроки по ним. Жду 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).

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

Добавлено: 28 авг 2012, 10:47
KamiSempai
В последнем SDK, при создании проекта, android-support-v4.jar прикрепляется автоматически.

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

Добавлено: 30 сен 2012, 17:26
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 пример работает.

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

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

Добавлено: 02 окт 2012, 11:00
Bersh
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 все равно не увидеть)

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

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

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

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

public class MainActivity extends FragmentActivity {...

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

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

Добавлено: 08 ноя 2012, 04:39
Ervin
Shifted писал(а): public class MainActivity extends FragmentActivity {...
Спасибо, помогло.

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

Добавлено: 12 янв 2013, 14:25
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);
    }
Не подскажете в чем проблема?

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

Добавлено: 12 янв 2013, 15:27
rezak90
Windows -> Preferences -> Java -> Compiler поставить версию 1.6

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

Добавлено: 12 янв 2013, 16:36
heluvet
rezak90 писал(а):Windows -> Preferences -> Java -> Compiler поставить версию 1.6
не помогло. так же подчеркнуто красным

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

Добавлено: 12 янв 2013, 16:54
Finch
У тебя так?

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

Добавлено: 12 янв 2013, 17:16
heluvet
Finch писал(а):У тебя так?
да, именно так

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

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

Добавлено: 14 апр 2013, 15:49
dumbDroid
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!
        ....
}

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

Добавлено: 05 июн 2013, 13:02
Mikhail_dev
Для работы с 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]

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

Добавлено: 12 окт 2013, 16:25
max546
Здравствуйте, наткнулся на такую проблему. Есть 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

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

Добавлено: 03 фев 2014, 09:46
avex
Unfortuly Fragments has stopped

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

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

Добавлено: 03 фев 2014, 10:28
rezak90
See your LogCat.

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

Добавлено: 03 фев 2014, 12:12
avex
Много строчек.
Например, такие

...
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]]