Урок 104. Android 3. Fragments. Lifecycle
Урок 104. Android 3. Fragments. Lifecycle
В этом уроке:
- используем фрагменты
- разбираемся в их lifecycle
Click here to read this article!
- используем фрагменты
- разбираемся в их lifecycle
Click here to read this article!
Последний раз редактировалось damager82 23 май 2017, 22:06, всего редактировалось 6 раз.
Re: Урок 104. Android 3. Fragments. Lifecycle
Спасибо за статью. Вот бы еще пару слов про android-support-v4, оно бы реально очень помогло, или будет отдельная статья. как для старых андроидов сделать хорошо?
Re: Урок 104. Android 3. Fragments. Lifecycle
Как раз стал интересоваться фрагментами, а тут и уроки по ним. Жду 105 урок!
Я точно не знаю, но, по-моему, достаточно положить android-support-v4.jar в папку libs, а в коде вместо, например, android.app.FragmentActivity использовать android.support.v4.app.FragmentActivity. Ну и со всеми необходимыми классами так. На сайте из различий указано толькоkolipass писал(а):Спасибо за статью. Вот бы еще пару слов про android-support-v4, оно бы реально очень помогло, или будет отдельная статья. как для старых андроидов сделать хорошо?
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
В последнем SDK, при создании проекта, android-support-v4.jar прикрепляется автоматически.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 104. Android 3. Fragments. Lifecycle
Спасибо за туториалы по Android.
Как можно решить след. проблему:
Девайс для тестов Android 2.3.3 api10 (LG P500)
Проект 2.3.3 api 10 + android-support-v4
Пример компилится, но вылетает при запуске, ругаясь:
импорты: import android.support.v4.app.Fragment;
в main.xml xmlns:tools="http://schemas.android.com/tools" выделено серым - типа не используется
Support4vDemos в комплекте с либой работают.
на эмуляторе api16 пример работает.
Возможно, есть какие-нибудь предположения по решению проблемы?
Как можно решить след. проблему:
Девайс для тестов 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]
в main.xml xmlns:tools="http://schemas.android.com/tools" выделено серым - типа не используется
Support4vDemos в комплекте с либой работают.
на эмуляторе api16 пример работает.
Возможно, есть какие-нибудь предположения по решению проблемы?
Re: Урок 104. Android 3. Fragments. Lifecycle
Поправьте меня если я не прав, но на девайсе с api 10 никак не удастся запустить функционал добавленный в api 11. ИМХО тут 3 варианта: либо тестить на эмуляторе,Ervin писал(а):Спасибо за туториалы по Android.
Как можно решить след. проблему:
Девайс для тестов Android 2.3.3 api10 (LG P500)
Проект 2.3.3 api 10 + android-support-v4
Пример компилится, но вылетает при запуске, ругаясь:
импорты: import android.support.v4.app.Fragment;Код: Выделить всё
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]
в main.xml xmlns:tools="http://schemas.android.com/tools" выделено серым - типа не используется
Support4vDemos в комплекте с либой работают.
на эмуляторе api16 пример работает.
Возможно, есть какие-нибудь предположения по решению проблемы?
либо искать девайс с более новым андроидом, либо реализовывать поддержку разных версий api в приложении (но в любом случае фрагментов на api 10 все равно не увидеть)
Re: Урок 104. Android 3. Fragments. Lifecycle
Примеры которые идут с либой в комплекте я у себя запускаю нормально + либа на то и рассчитана что бы добавить функционал в старые версииBersh писал(а):Поправьте меня если я не прав, но на девайсе с api 10 никак не удастся запустить функционал добавленный в api 11. ИМХО тут 3 варианта: либо тестить на эмуляторе,Ervin писал(а): Support4vDemos в комплекте с либой работают.
либо искать девайс с более новым андроидом, либо реализовывать поддержку разных версий api в приложении (но в любом случае фрагментов на api 10 все равно не увидеть)
Re: Урок 104. Android 3. Fragments. Lifecycle
Fragments запускаются, согласно документации, от Android 1.6.
Возможно проблема в том, что не указано:
public class MainActivity extends FragmentActivity {...
Как и было сказано ранее: не забываем про import android.support.v4.app.Fragment;
Возможно проблема в том, что не указано:
public class MainActivity extends FragmentActivity {...
Как и было сказано ранее: не забываем про import android.support.v4.app.Fragment;
Re: Урок 104. Android 3. Fragments. Lifecycle
Спасибо, помогло.Shifted писал(а): public class MainActivity extends FragmentActivity {...
Re: Урок 104. Android 3. Fragments. Lifecycle
Скачал пример приложения с фрагментами с сайта автора
http://androidbook.com/akc/filestorage/ ... gments.zip
В проекте, который должен поддерживать предыдущие версии SDK. ошибка "The method onInflate(AttributeSet, Bundle) of type DetailsFragment must override or implement a supertype method" в onInflate
Не подскажете в чем проблема?
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
Windows -> Preferences -> Java -> Compiler поставить версию 1.6
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 104. Android 3. Fragments. Lifecycle
не помогло. так же подчеркнуто краснымrezak90 писал(а):Windows -> Preferences -> Java -> Compiler поставить версию 1.6
Re: Урок 104. Android 3. Fragments. Lifecycle
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
Для работы с 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]
[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
Здравствуйте, наткнулся на такую проблему. Есть SherlockFragmentActivity с двумя табами, содержимым которых является SherlockFragment. При переключении табов, соответственно фрагменты пересоздаются, мне нужно сохранять состояние, пробовал использовать setRetainInstance(true), не помогает фрагменты все равно пересоздаются, так же пробовал использовать onSaveInstanceState(Bundle outState)-тут ситуация еще интересней: при переключении табов этот метод вообще не выполняется, при повороте устройства метод отрабатывает, но onCreateView вызывается два раза, соответственно после второго вызова Bundle==null. И в итоге тоже ничего не сохраняется.
Вопрос:
Почему onCreateView отрабатывает 2 раза ?
Почему не работает setRetainInstance(true) ?
MainActivity
Fragment 1
когда ставлю подсветку кода- точки заменяются на какой то код, копировал из eclipse
Вопрос:
Почему 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();
}
}
Код: Выделить всё
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;
}
}
}
Re: Урок 104. Android 3. Fragments. Lifecycle
Unfortuly Fragments has stopped
т.е. приложение не запустилось. Какие могут быть причины? Все делал по уроку. С эклипсом и эмулятором все в порядке. Коды полностью скопировал, кроме названия пакета.
т.е. приложение не запустилось. Какие могут быть причины? Все делал по уроку. С эклипсом и эмулятором все в порядке. Коды полностью скопировал, кроме названия пакета.
Re: Урок 104. Android 3. Fragments. Lifecycle
See your LogCat.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 104. Android 3. Fragments. Lifecycle
Много строчек.
Например, такие
...
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]]
Например, такие
...
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]]