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

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

Войти
Регистрация
Восстановить пароль
 
Serbis
3 / 3 / 2
Регистрация: 13.07.2012
Сообщений: 121
19.02.2015, 13:33     Обратиться к фрагменту находящемуся в ViewPager #1
Внутри 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"/>
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2015, 13:33     Обратиться к фрагменту находящемуся в ViewPager
Посмотрите здесь:

ViewPager Android
Android ViewPager
Android Поворот ViewPager
ViewPager Android
GridView и ViewPager Android
Android Правильный ViewPager
Android Обращение к фрагменту вне активити
ViewPager автодаводка Android
Android Передача даных с фрагмента к фрагменту!
Android ViewPager и Tab
Передача одному фрагменту объекта из другого Android
Android ViewPager и TextView

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Serbis
3 / 3 / 2
Регистрация: 13.07.2012
Сообщений: 121
20.02.2015, 23:50  [ТС]     Обратиться к фрагменту находящемуся в ViewPager #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. Все уже перепробовал, ничего не получается
dtx1212
6 / 6 / 1
Регистрация: 08.12.2013
Сообщений: 26
21.02.2015, 16:06     Обратиться к фрагменту находящемуся в ViewPager #3
Попробуй использовать FragmentPagerAdapter вместо FragmentStatePagerAdapter.
Yandex
Объявления
21.02.2015, 16:06     Обратиться к фрагменту находящемуся в ViewPager
Ответ Создать тему
Опции темы

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