Страница 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
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]]