Урок 125. ViewPager

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

Re: Урок 125. ViewPager

Сообщение Mikhail_dev » 16 янв 2014, 02:31

Да. Еще можете глянуть метод у ВьюПейджера setOffscreenPageLimit. Вырезка с урока к одному из адаптеров
Можно сделать вывод. Этот адаптер быстрый, т.к. не требует пересоздания. Но затратный, т.к. все держит в памяти. Т.е. подходит для небольшого количества страниц. Например, набор вкладок или визард.

Правда есть нюанс: хоть сами фрагменты и не уничтожаются, но уничтожается их View-структура и потом создается заново. Вставьте лог в метод onCreateView и убедитесь. Хранится структура только текущей страницы и по одной справа и слева. Это кол-во соседних страниц с сохраняемой View-структурой может быть настроено методом setOffscreenPageLimit.
Вообще данные уж лучше сам фрагмент где-то забирает, если он мертвый, а данные ему готовы. Так будет логичней.

sheygam
Сообщения: 9
Зарегистрирован: 16 янв 2014, 01:39

Re: Урок 125. ViewPager

Сообщение sheygam » 16 янв 2014, 02:38

m090050 спасибо, направление и идею я понял, буду копать, в прицепи количество фрагментов не большое 15-20, и не сильно весомые но аппликация по мимо этого потребляет ресурс, будем разбираться!

sheygam
Сообщения: 9
Зарегистрирован: 16 янв 2014, 01:39

Re: Урок 125. ViewPager

Сообщение sheygam » 17 янв 2014, 17:59

Вопрос перенес в новую тему, не знаю как удалить сообщение.
viewtopic.php?f=33&t=3310
Последний раз редактировалось sheygam 17 янв 2014, 19:14, всего редактировалось 1 раз.

ruba123
Сообщения: 2
Зарегистрирован: 10 янв 2014, 16:33

Re: Урок 125. ViewPager

Сообщение ruba123 » 23 янв 2014, 18:03

Скажите пожалуйста, у меня такой вопрос, если класс уже наследуется от какого то другого, как тогда реализовать ViewPager?? Так как надо наследоваться от FragmentPagerAdapter, Fragment но мы не можем потому что наследуемся от другого класса, как быть в такой ситуации?

qwe
Сообщения: 10
Зарегистрирован: 04 ноя 2013, 23:29

Re: Урок 125. ViewPager

Сообщение qwe » 31 янв 2014, 10:51

Помогите пожалуйста как вместо надписей реализовать imgbatton. Чтобы перелистывание помимо слайда происходило от кнопок. Вчера весь вечер промучился- не получается.
Вложения
Slide.rar
Это проект.
(1.14 МБ) 151 скачивание
А надо примерно так.
А надо примерно так.
device2.png (15.61 КБ) 9257 просмотров
Сейчас вот так.
Сейчас вот так.
device1.png (10.52 КБ) 9257 просмотров

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

Re: Урок 125. ViewPager

Сообщение KamiSempai » 31 янв 2014, 11:35

Ни как. Вы используете PagerTabStrip, а он почти не кастомизируется.
Смотрите в сторону сторонних библиотек.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

qwe
Сообщения: 10
Зарегистрирован: 04 ноя 2013, 23:29

Re: Урок 125. ViewPager

Сообщение qwe » 31 янв 2014, 12:04

А вы можете что нибудь посоветовать, что нужно использовать для реализации такого ViewPager ?

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

Re: Урок 125. ViewPager

Сообщение KamiSempai » 31 янв 2014, 12:26

Возможно это поможет http://viewpagerindicator.com/?utm_sour ... um=toolbox
Там вроде бы можно иконки для записей устанавливать.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

umni4ek
Сообщения: 2
Зарегистрирован: 31 янв 2014, 12:37

Re: Урок 125. ViewPager

Сообщение umni4ek » 31 янв 2014, 12:39

Хочу реализовать что-то типа книги с использованием ViewPager, есть достаточно объемный текст, как определить, по сколько строк текста может вместиться на каждой странице?

qwe
Сообщения: 10
Зарегистрирован: 04 ноя 2013, 23:29

Re: Урок 125. ViewPager

Сообщение qwe » 31 янв 2014, 12:57

На каждом устройстве по разному (зависит от разрешения экрана). Если будет использоваться на устройстве с одним разрешением то методом тыка посмотрите.

qwe
Сообщения: 10
Зарегистрирован: 04 ноя 2013, 23:29

Re: Урок 125. ViewPager

Сообщение qwe » 31 янв 2014, 13:04

KamiSempai писал(а):Возможно это поможет http://viewpagerindicator.com/?utm_sour ... um=toolbox
Там вроде бы можно иконки для записей устанавливать.
Спасибо !!!
Последний раз редактировалось qwe 31 янв 2014, 17:43, всего редактировалось 2 раза.

umni4ek
Сообщения: 2
Зарегистрирован: 31 янв 2014, 12:37

Re: Урок 125. ViewPager

Сообщение umni4ek » 31 янв 2014, 13:08

qwe писал(а):На каждом устройстве по разному (зависит от разрешения экрана). Если будет использоваться на устройстве с одним разрешением то методом тыка посмотрите.
На разных устройствах планируется использовать. Книги вот как делают?

George.Light
Сообщения: 3
Зарегистрирован: 08 окт 2013, 18:19

Re: Урок 125. ViewPager

Сообщение George.Light » 01 фев 2014, 00:04

Подскажите, а можно в ViewPager вместо Layout прикрутить целое Activity?
Мой случай:
Мной переделанный пример из урока 125;
У меня пару страниц, на каждой свой Layout(fragment1, fragment2)
При запуске на первой странице(fragment1), есть кнопка, в клас fragment1 помещен onClickListener.
Но тем не менее кнопка не срабатывает.
В функции onCreateView организовал проверку pageNumber по которой идет выбор среди
R.layout.fragment1 и
R.layout.fragment2
Есть ли простой способ заставить содержимое работать?
(P.S. Не судите строго, написал пост на быструю руку со смарта)

Александра
Сообщения: 1
Зарегистрирован: 02 фев 2014, 00:13

Re: Урок 125. ViewPager

Сообщение Александра » 02 фев 2014, 00:21

Подскажите, а как отключить оптимизацию, которая генерирует страницы заранее. Я пробовала методом setOffscreenPageLimit() установить количество страниц в 0 или -1. Однако на отладке в OnCreate() и в onViewCreated() все равно заходит дважды для 0-ой и 1-ой страниц.
Или может быть есть какой-то иной способ реализации. Дело в том, что содержимое моей 1-ой страницы должно зависеть от того, что произойдет на 0-ой. А если они обе генерируются одновременно, то действия, предпринимаемые на 0-ой странице получаются бесполезными

SevenXP
Сообщения: 113
Зарегистрирован: 21 июл 2013, 18:20

Re: Урок 125. ViewPager

Сообщение SevenXP » 13 апр 2014, 01:03

есть проблема, может кто сталкивался и знает как ее решить.
Все у меня происходит на фрагмента, только 1 FragmentActivite. (FragmentActivity) пришлось использовать что бы получить SupportFragmentManager и используется супорт только в ViewPager.
Проблема у меня такая.
Нажимаю на кнопку, перехожу на Fragment у которого есть ViewPager и листаю фрагменты, все отлично все видно, показывается нужная информация. (только при первом переходе на фрагмент с ViewPager)
Жму назад отрабатывает мето popBackStack, жму опять ( на эту же кнопку или на другу)
ViewPager не показывает Fragment, начинаю листать, бывает 1-2 раза еще не покажет, потом показывает все нормаль, делаю слайды назад. Все показывает.

В чем косяк, при втором переходе на фрагмен с ViewPager первых 1-2 фрагмента черных, при слайде назад, потом он их показывает. Проблема начинается на 2+ переходе на ViewPager?

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

Re: Урок 125. ViewPager

Сообщение Mikhail_dev » 13 апр 2014, 08:15

Я слабо что понял. Тут бы видео записать (для записи видео я лично использую UVScreenCamera, только при записи отключить запись звука).

SevenXP
Сообщения: 113
Зарегистрирован: 21 июл 2013, 18:20

Re: Урок 125. ViewPager

Сообщение SevenXP » 13 апр 2014, 12:23

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

Сразу падло, смотрю просит задать id задал статический id проблема осталась.
Когда сделал viewPager.setId(rnd.nextInt(100000)); то проблема исчезла но, это не круто.
Эта ссылка с рандом id https://www.youtube.com/watch?v=PLe_ONU ... e=youtu.be но такое решение меня не устраивает, иногда кидает что не может найти ресуср, когда фрагмент где ViewPager находится, закрывается (popBackStack).

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

public class FragmentViewPage  extends BasicFragment implements OnPageChangeListener{
	private ViewPager viewPager;
	private ArrayList<DataInfoMainNews> listNews;
	private AdapterForPageView adapterForPageView;
	private ProgressBar progressBar;
	private LinearLayout layout;
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View view = inflater.inflate(R.layout.fragment_news_detail_main_contener, null); 
		int idGroup = this.getArguments().getInt(KEY_GROUP_NEWS);
		int idNews = this.getArguments().getInt(KEY_NUMBER_NEWS);
		listNews = FragmentNews.getDataInfoMainNews(idGroup);
		
		layout = (LinearLayout)  view.findViewById(R.id.fragment_liner);
		viewPager = new ViewPager(getActivity());
		FrameLayout.LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
		viewPager.setLayoutParams(params);
		Random rnd = new Random();
		viewPager.setId(rnd.nextInt(1000000));
		layout.addView(viewPager);
		adapterForPageView = new AdapterForPageView(getFragmentActivity().getSupportFragmentManager(), listNews, idGroup);
		viewPager.setAdapter(adapterForPageView);
		progressBar = (ProgressBar) view.findViewById(R.id.fragment_news_detail_progressBar);
		progressBar.setMax(listNews.size());
		viewPager.setOnPageChangeListener(this);
		viewPager.setCurrentItem(idNews);
		progressBar.setProgress(idNews+1);
		progressBar.getProgressDrawable().setColorFilter(Color.RED, Mode.SRC_IN);
		setCallBackFunction();
		return view;
	}

Вот так если я тену ViewPager c layout либо статический ID
Если залить фон. То за мест черного фона, будет бэкграунд но фрагмент не отображает
https://www.youtube.com/watch?v=CZ1D89t ... e=youtu.be



Cейчас накидал тестовый Использовал везде support.v4.fragment.
Баг остался, при повторном заходе на фрагмент с ViewPage контент не виден. При сколле соседния появляются.

Но если я делаю StartActivirty в котором есть ViewPager всегда отрабатывает нормально. Но мне так не подайдет. Мне нельзя вызывать активиту. Работа должна быть на фрагментах.

SevenXP
Сообщения: 113
Зарегистрирован: 21 июл 2013, 18:20

Re: Урок 125. ViewPager

Сообщение SevenXP » 13 апр 2014, 15:23

Пипец какой то

Вот если кому нужно

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

 @Override
	    public void onViewCreated(View view, Bundle savedInstanceState) {
	        super.onViewCreated(view, savedInstanceState);

	        viewPager = (ViewPager) view.findViewById(R.id.pager);
			adapter= new Adapter(getChildFragmentManager()); <-Именно эта строчка убрала баг и менно нужно передать в адаптер SupportManagerFragment (getChildFragmentManager())
			viewPager.setAdapter(adapter);
	    }
В проекте переделал и все работает. Теперь правда по классам не красиво и га... код, но главное работает
И прикол в том, что должен пойти именно getChildFragmentManager() а что бы его передать нужно унаследоваться от android.support.v4.app.Fragment; и проблема со вторым запуском и темным экраном пропала.

+ Не используте при динамических созданиях фгаментов FragmentPagerAdapter хранит все вьюхи и не удаляет. Используйте FragmentStatePagerAdapter.

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

Re: Урок 125. ViewPager

Сообщение Mikhail_dev » 14 апр 2014, 09:05

getChildFragmentManager необходим когда создают фрагмент во фрагменте.

SevenXP
Сообщения: 113
Зарегистрирован: 21 июл 2013, 18:20

Re: Урок 125. ViewPager

Сообщение SevenXP » 14 апр 2014, 16:02

Спасибо буду знать,

Еще такой вопрос. ВСе тот же ViewPager все вроде бы как работает. Дальше пишу и столкнулся с проблемой. Как решить не знаю.
ViewPager показывает фрагмент. Тискаю на кнопку, происходит StartActivity. Но когда тискаю back.
Я перехожу на ViewPager и фрагменты начинают сролится при переходе на них через 1-2 секунд. На рандомное значение. У фрагмента родитель ScrollView -> можно ли отключить вообще скрол? То что пробовал, не получилось.

Ответить