Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Serbis
7 / 7 / 2
Регистрация: 13.07.2012
Сообщений: 127
#1

Обратиться к фрагменту находящемуся в ViewPager - Программирование Android

19.02.2015, 13:33. Просмотров 973. Ответов 2
Метки нет (Все метки)

Внутри onCreate происходит проверка физических размеров устройства. Если функция проверки возвращает tablet то подгружаем основную активность, в которой объявлены три фрагмента сразу. Если функция проверки возвращает phone , то тогда грузим активность c ViewPager и проводим его инициализацию. Проблема в том как обратиться к фрагмента во втором случае. Представленный код при первой же попытке обращения к фрагменту по id приводит к NullPointerExeption, что вполне понятно, так как фрагмент подгружается динамически в адаптере. В принципе понятно, что нужно ссылаться на объект который создается к классе адаптера, но я никак не могу допереть как это сделать.


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        inSys = new InSys();        //Объект бибилиотеки технических функций
        if (inSys.checkDeviceType(this) =="tablet") {       //Проверяем размер экрана, если программа запущена на планшете
            setContentView(R.layout.activity_main);     //то загружаем обычную активноть
        } else {        //если же программа запущена на телефоне
            setContentView(R.layout.activity_main_phone);       //то загружаем активность с ViewPager и проводим его инициализацию
 
            mMainPager = (ViewPager)findViewById(R.id.main_pager);
            mPagerAdapter = new ScreenSliderPagerAdapter(getSupportFragmentManager());
            mMainPager.setAdapter(mPagerAdapter);
        }
 
 
        context = getApplicationContext();      //Получить текущий контекст
 
        android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();       //Медеждер фрагментов
        fragment1 = (Fragment1)fragmentManager.findFragmentById(R.id.fragment1);        //Создание объекта фрагмента белки
        fragment2 = (Fragment2)fragmentManager.findFragmentById(R.id.fragment2);        //Создание объекта фрагмента жиры
        fragment3 = (Fragment3)fragmentManager.findFragmentById(R.id.fragment3);        //Создание объекта фрагмента углеводы
 
 
        tvProtSum = (TextView)fragment1.rootView.findViewById(R.id.protSum);
Последняя строка тут как раз ведет в никуда.

Адаптер
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private class ScreenSliderPagerAdapter extends FragmentStatePagerAdapter {      //Подкласс адаптера отвечаюзего за инициализацию
        public ScreenSliderPagerAdapter(android.support.v4.app.FragmentManager fm) {        //компонента PageViewer если программу запустили
            super(fm);      // на устройтсве с малым размером экрана
        }
 
        @Override
        public Fragment getItem(int i) {
            Fragment fragment = null;
            if (i == 0) {
                fragment = new Fragment1();
            }
            if (i == 1) {
                fragment = new Fragment2();
            }
            if (i == 2) {
                fragment = new Fragment3();
            }
            return fragment;
        }
 
        @Override
        public int getCount() {
            return NUM_PAGES;
        }
    }
Активность под планшет
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="100">
 
    <fragment
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:name="ru.cerber.kkal.ui.MainActivity.Fragment1"
        android:id="@+id/fragment1"
        android:layout_margin="10dp"
        android:layout_weight="33"
 
        tools:layout="@layout/fragment1" />
 
    <fragment
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:name="ru.cerber.kkal.ui.MainActivity.Fragment2"
        android:id="@+id/fragment2"
        android:layout_margin="10dp"
        android:layout_weight="33"
 
        tools:layout="@layout/fragment2" />
 
    <fragment
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:name="ru.cerber.kkal.ui.MainActivity.Fragment3"
        android:id="@+id/fragment3"
        android:layout_margin="10dp"
        android:layout_weight="33"
 
        tools:layout="@layout/fragment3" />
 
</LinearLayout>
И под телефон
XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/main_pager"/>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2015, 13:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обратиться к фрагменту находящемуся в ViewPager (Программирование Android):

Обращение к фрагменту вне активити - Программирование Android
Здравствуйте, форумчане! Назрел такой вот вопрос: создан класс BannerFragment, унаследованный от фрагмента. В нём переопределён...

Передача даных с фрагмента к фрагменту! - Программирование Android
Вопрос возможно глупый но все ж... Искал в инете но ответ на свой вопрос найти не смог. Есть активность которая является хостом для 2...

Передача одному фрагменту объекта из другого - Программирование Android
Если передавать объект(свой класс данных) из одного фрагмента в другой как стерилизованный аргумент это нормально? или есть какой то другой...

ViewPager - Программирование Android
Всем. Да я недалекий и тупой, уже дня три не могу никак понять :wall: Есть ViewPager &lt;android.support.v4.view.ViewPager ...

ViewPager - Программирование Android
Здравствуйте! В приложении использовал пример с Хабра http://habrahabr.ru/post/131889/, однако, не могу понять как при прокрутке экранов...

ViewPager - Программирование Android
Помогите пожалуйста. Использую эту фичу в своей программе(пример один и его очень много в поисковике). И столкнулся с проблемой. На...

2
Serbis
7 / 7 / 2
Регистрация: 13.07.2012
Сообщений: 127
20.02.2015, 23:50  [ТС] #2
Пожалуй переформулирую свой вопрос, так как в начале спросил как обычно, не разобравшись в теме. Сейчас бредовенький код из первого поста обрел вот такое обличие.

main_activity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class MainActivity extends ActionBarActivity {
    private static final int NUM_PAGES = 3;
    private ViewPager mViewPager;
    private Context context;
    private ScreenSliderPagerAdapter mPagerAdapter;     //Адаптер для ViewPager активности телефонной версии
    private Fragment1 fragment1;
    Vector<Fragment> fragments;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        context = getApplicationContext();
        mViewPager = (ViewPager)findViewById(R.id.pager);
 
        fragments = new Vector<Fragment>();
        fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
        fragments.add(Fragment.instantiate(this, Fragment2.class.getName()));
        fragments.add(Fragment.instantiate(this, Fragment3.class.getName()));
        mViewPager.setOffscreenPageLimit(fragments.size());
 
        mPagerAdapter = new ScreenSliderPagerAdapter(getSupportFragmentManager(), fragments);
        mViewPager.setAdapter(mPagerAdapter);
        mViewPager.setCurrentItem(0);
 
        fragment1 = (Fragment1)mPagerAdapter.getRegisteredFragment(0);
        Toast.makeText(this, String.valueOf(fragment1), Toast.LENGTH_LONG).show();
 
    }
Адаптер
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class ScreenSliderPagerAdapter extends FragmentStatePagerAdapter {      //Подкласс адаптера отвечаюзего за инициализацию
    private List<Fragment> fragments;
    private SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
 
 
 
    public ScreenSliderPagerAdapter(FragmentManager fm, Vector<Fragment> fragments) {        //компонента PageViewer если программу запустили
        super(fm);      // на устройтсве с малым размером экрана
        this.fragments = fragments;
    }
 
 
 
    @Override
    public Fragment getItem(int i) {
        return this.fragments.get(i);
    }
 
    @Override
    public int getCount() {
         return this.fragments.size();
    }
 
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        registeredFragments.put(position, fragment);
        return fragment;
    }
 
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        registeredFragments.remove(position);
        super.destroyItem(container, position, object);
    }
 
    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }
 
 
}
В чем суть, у адаптера есть метод instantiateItem, который должен регистрировать фрагмент, что бы к нему потом можно было обратиться через вызов getRegisteredFragment, но что нужно сделать в getItem для того что бы все работало как нужно я не понимаю. В данной реализации метод getRegisteredFragment возвращает null. Все уже перепробовал, ничего не получается
0
dtx1212
6 / 6 / 1
Регистрация: 08.12.2013
Сообщений: 26
21.02.2015, 16:06 #3
Попробуй использовать FragmentPagerAdapter вместо FragmentStatePagerAdapter.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2015, 16:06
Привет! Вот еще темы с ответами:

создание ViewPager - Программирование Android
здравствуйте,возник вопрос по ViewPager. Не получается добавить компоненты после ViewPager, т.е Статический компонент вверху и внизу,а по...

ViewPager и ListView - Программирование Android
Вообще пытаюсь сделать пролистывающиеся редактируемые списки. Для этого использую ViewPager и ListView. Так как ViewPager использует...

ViewPager setText - Программирование Android
Приветствую ув.форумчане! Скопировал данный код из startandroid,помогите как сделать, чтобы при каждом слайде был разный текст который...

ViewPager и TextView - Программирование Android
В приложении ViewPager и TextView. Все работает. Теперь нужно впихнуть во ViewPager 2 TextView. Можно ли это сделать и как?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru