Урок 125. ViewPager

Обсуждение уроков
igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 125. ViewPager

Сообщение igrok-vip » 06 май 2013, 12:27

Скажите я правильно понял, что для отображения нужного содержимого на каждой странице я должен использовать case в методе onCreateView и в зависимости от pageNumber выводить нужные элементы экрана?

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

Re: Урок 125. ViewPager

Сообщение rezak90 » 06 май 2013, 12:58

igrok-vip писал(а):Скажите я правильно понял, что для отображения нужного содержимого на каждой странице я должен использовать case в методе onCreateView и в зависимости от pageNumber выводить нужные элементы экрана?
это если Вы используете один фрагмент для отображения
R.id.team
Политика на форуме запрещена

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 125. ViewPager

Сообщение igrok-vip » 06 май 2013, 16:58

Блин, я в тупике.
Я хотел сделать внутри ViewPager редактируемые списки через ListView. Редактироваться они должны были через контекстное меню(Изменить, Удалить, Добавить) + кастомное диалоговое окно с EditText.
1) Не могу сделать кастомное диалоговое окно внутри PageFragment. Ругается на onPrepareDialog и onCreateDialog (обычные диалоги создаются отлично).
2) Перенёс onPrepareDialog и onCreateDialog в MainActivity - диалоги заработали, но не могу изменять наполнение ListView во фрагменте из MainActivity. Точнее могу, но всё отображается коряво(то пока не прокрутишь не отобразиться, то отображается сразу на 2х страницах).

Подскажите что можно использовать вместо кастомного диалогового окна во фрагменте или как заставить кастомные работать во фрагменте или как правильно редактировать ListView из MainActivity?

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

Re: Урок 125. ViewPager

Сообщение rezak90 » 06 май 2013, 17:57

igrok-vip писал(а):Блин, я в тупике.
Я хотел сделать внутри ViewPager редактируемые списки через ListView. Редактироваться они должны были через контекстное меню(Изменить, Удалить, Добавить) + кастомное диалоговое окно с EditText.
1) Не могу сделать кастомное диалоговое окно внутри PageFragment. Ругается на onPrepareDialog и onCreateDialog (обычные диалоги создаются отлично).
2) Перенёс onPrepareDialog и onCreateDialog в MainActivity - диалоги заработали, но не могу изменять наполнение ListView во фрагменте из MainActivity. Точнее могу, но всё отображается коряво(то пока не прокрутишь не отобразиться, то отображается сразу на 2х страницах).

Подскажите что можно использовать вместо кастомного диалогового окна во фрагменте или как заставить кастомные работать во фрагменте или как правильно редактировать ListView из MainActivity?
Давно такого поста не видел. Всё нормально работает, если Вы не правильно приготовили значит показывайте код и будем смотреть что и где не правильно.
R.id.team
Политика на форуме запрещена

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 125. ViewPager

Сообщение igrok-vip » 06 май 2013, 18:35

Сначала я пытался сделать кастомный диалог внутри PageFragment
[syntax=java]
package com.example.test4;

import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;



public class PageFragment extends Fragment {

static final String ARGUMENT_PAGE_NUMBER = "arg_page_number";

int pageNumber;
String names[] = { "Иванов И.И.", "Петров П.П.",
"Сидоров С.С.", "Васькин В.В.", "Пупкин П.П.",
"Смирнов С.С.", "Косточкин К.К.", "Виляева В.В.",
"Смоленов С.С.", "Трубицкой Т.Т.", "Земляникин З.З.",
"Коровин К.К.", "Коробочкин К.К.", "Смирнова С.С.",
"Сидоров С.С.", };
ArrayAdapter<String> adapter;
static int itemselected;
final int M_EDIT = 100;
final int M_DELETE = 101;
final int M_ADD = 102;
final int D_EDIT = 200;
final int D_DELETE = 201;
final int D_ADD = 202;
EditText ed;


static PageFragment newInstance(int page) {
PageFragment pageFragment = new PageFragment();
Bundle arguments = new Bundle();
arguments.putInt(ARGUMENT_PAGE_NUMBER, page);
pageFragment.setArguments(arguments);
return pageFragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);
}


@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);

AdapterContextMenuInfo aMenuInfo = (AdapterContextMenuInfo) menuInfo;
itemselected = aMenuInfo.position;

menu.add(Menu.NONE, M_EDIT, Menu.NONE, "Изменить");
menu.add(Menu.NONE, M_DELETE, Menu.NONE, "Удалить");
menu.add(Menu.NONE, M_ADD, Menu.NONE, "Добавить");

}


@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
if (id == D_EDIT) {
}
}


@Override
protected Dialog onCreateDialog(int id) {
AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
LinearLayout L_view = (LinearLayout) getLayoutInflater().inflate(R.layout.dialog, null);
ed = new EditText(getActivity());
adb.setView(L_view);
return adb.create();
}


@Override
public boolean onContextItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case M_EDIT:
showDialog(D_EDIT);
break;
case M_DELETE:
showDialog(D_DELETE);
break;
case M_ADD:
showDialog(D_ADD);
break;

default:
return super.onContextItemSelected(item);
}

return true;
}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.activity_page_fragment, null);
ListView lvMain = (ListView) view.findViewById(R.id.lvMain);



switch (pageNumber){
case 0:

adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, names);
lvMain.setAdapter(adapter);
registerForContextMenu(lvMain);
break;

}

return view;
}


}
[/syntax]
убрал лишнее чтобы не мешалось

Но эклипс ругается на onPrepareDialog(The method onPrepareDialog(int, Dialog) of type PageFragment must override or implement a supertype method)
на super.onPrepareDialog (The method onPrepareDialog(int, Dialog) is undefined for the type Fragment)
на onCreateDialog (The method onCreateDialog(int) of type PageFragment must override or implement a supertype method)
на getLayoutInflate (The method getLayoutInflater(Bundle) in the type Fragment is not applicable for the arguments ())
и на showDialog (The method showDialog(int) is undefined for the type PageFragment)

Потом перенёс onPrepareDialog и onCreateDialog в mainactivity и попытался в кнопках изменить массив names, найти ListView и присвоить ему адаптер по новой, чтобы список обновился, но это привело к глюкам, про которые я писал ранее

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

Re: Урок 125. ViewPager

Сообщение rezak90 » 06 май 2013, 18:47

с чего Вы взяли что в Fragment есть методы onPrepareDialog, onCreateDialog, getLayoutInflate, showDialog?
R.id.team
Политика на форуме запрещена

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 125. ViewPager

Сообщение igrok-vip » 06 май 2013, 18:55

а если их там нет, как быть?

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

Re: Урок 125. ViewPager

Сообщение rezak90 » 06 май 2013, 19:18

igrok-vip писал(а):а если их там нет, как быть?
диалог создаётся при помощи DialogFragment, 110 урок
R.id.team
Политика на форуме запрещена

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 125. ViewPager

Сообщение igrok-vip » 06 май 2013, 19:23

А вон оно что. Всё ясно, спасибо.

Ivan_P
Сообщения: 7
Зарегистрирован: 06 май 2013, 22:13

Re: Урок 125. ViewPager

Сообщение Ivan_P » 06 май 2013, 22:25

Доброго времени суток!
Решил добавить на страничку вывод изображения (то есть чтобы Page1 содержала картинку image1, Page2 - image2 и т.д. ). И столкнулся с проблемой генерации строки ресурса для setImageResource
Код примерно следующий:
ImageView IvImg = (ImageView) view.findViewById(R.id.ivImg);
int pn = pageNumber;
String pns = Integer.toString(pn);
int plans = getResources().getIdentifier("image" + pns, "drawable", "P1251_ViewPager");
IvImg.setImageResource(plans);

В итоге тянется картинка blank на каждой страничке. Пробовал тянуть и из "raw" и из "assets". Но проблема осталась. Что посоветуете, коллеги?

Ivan_P
Сообщения: 7
Зарегистрирован: 06 май 2013, 22:13

Re: Урок 125. ViewPager

Сообщение Ivan_P » 07 май 2013, 22:22

Разобрался сам. Отработал следующий код
int plans = getResources().getIdentifier("com.example.p1251_viewpager" + ":raw/image" + pns, null, null);

Sanuch89
Сообщения: 2
Зарегистрирован: 06 апр 2013, 17:18

Re: Урок 125. ViewPager

Сообщение Sanuch89 » 13 май 2013, 09:27

Здравствуйте!

У меня проблема. Есть ViewPager - у него 3 страницы. Использую SamplePagerAdapter.

По сетевому протоколу я принимаю данные и мне нужно их обработать и ими заполнять все три страницы одновременно. Проблема в том что если я нахожусь на 1-й странице, то я не могу заполнить данные на 3-й странице и наоборот (генерируется исключение).

Я думаю, что это связано с тем, что уничтожается View-структура страницы, которая находится через одну от текущей. И при обращении к View-элементу этой странице происходит ошибка, т.к. фактически его не существует.

В принципе, можно вычислять какая сейчас страница и выводить данные только в неё, а остальные обрабатывать, но не выводить.
Но интересует вопрос. Возможно ли сделать так, чтобы View-структура всех страниц сохранялась в памяти?

Заранее спасибо!

Всё, разобрался:) Не прочитал внимательно урок:) Для этого есть метод setOffscreenPageLimit.

azusdex
Сообщения: 1
Зарегистрирован: 19 май 2013, 17:56

Re: Урок 125. ViewPager

Сообщение azusdex » 19 май 2013, 18:26

Здравствуйте!
У меня есть ViewPager, с 3 станицами
Проблема в том, что если я захожу на 3 страницу и делаю новую загрузку данных, то я могу обновить только первую страницу, а вторую нет. Насколько я понял он держит ее в памяти, а как же мне подобратся к элементам на второй странице?

Зарание спасибо!

gorod
Сообщения: 10
Зарегистрирован: 04 июн 2013, 11:34

Re: Урок 125. ViewPager

Сообщение gorod » 04 июн 2013, 11:47

Здравствуйте, уважаемые форумчане!

Прошу, если можно, помочь в следующем вопросе.
Есть несколько фрагментов: fragment1.xml, fragment2.xml ..., fragment15.xml.
Подскажите, как сделать так, чтобы перелистывание страниц осуществлялось программно и через заданный интервал времени, и при этом на страницу 1 подставлялось содержимое фрагмента 1, на страницу 2 - фрагмента 2 и т.д.

Благодарю всех, кто сможет откликнуться.

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

Re: Урок 125. ViewPager

Сообщение KamiSempai » 04 июн 2013, 12:30

Программное перелистывание страниц осуществляется методом setCurrentItem. Если вторым параметром указать true то произойдет "плавная" прокрутка до указанной страницы.

Про использование фрагментов в ViewPager много расписывать не буду вот >>ССЫЛКА<< на FragmentPagerAdapter, используйте его. Там же есть пример по его использованию.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

gorod
Сообщения: 10
Зарегистрирован: 04 июн 2013, 11:34

Re: Урок 125. ViewPager

Сообщение gorod » 04 июн 2013, 13:50

Про использование фрагментов в ViewPager много расписывать не буду вот >>ССЫЛКА<< на FragmentPagerAdapter, используйте его. Там же есть пример по его использованию.
Вы знаете, я попробовал использовать пример по указанной ссылке, но ничего не работает. Eclipse ругается на множество ошибок.
В папке layout создал 2 файла R.layout.fragment_pager_list.xml и R.layout.fragment_pager.xml, в папке src создал новый класс FragmentPagerSupport.java
В чем может быть причина, как Вы думаете?

Shtihl
Сообщения: 13
Зарегистрирован: 03 июн 2013, 08:45

Re: Урок 125. ViewPager

Сообщение Shtihl » 04 июн 2013, 14:05

а может надо было в папке Layout файлы называть не R.layout.filename.xml а просто filename.xml?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 125. ViewPager

Сообщение klblk » 04 июн 2013, 14:06

мб отсутствует android.support.v4? Ну и фраза "Eclipse ругается на множество ошибок" ни о чём не говорит.

gorod
Сообщения: 10
Зарегистрирован: 04 июн 2013, 11:34

Re: Урок 125. ViewPager

Сообщение gorod » 04 июн 2013, 14:47

Shtihl писал(а):а может надо было в папке Layout файлы называть не R.layout.filename.xml а просто filename.xml?
Нет же, посмотрите ссылку, там файлы именно так и названы.

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

Re: Урок 125. ViewPager

Сообщение KamiSempai » 04 июн 2013, 15:04

gorod писал(а):
Shtihl писал(а):а может надо было в папке Layout файлы называть не R.layout.filename.xml а просто filename.xml?
Нет же, посмотрите ссылку, там файлы именно так и названы.
Shtihl прав. Вы не правильно назвали файлы. R.layout.fragment_pager_list и R.layout.fragment_pager - это Id ресурсов.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить