FragmentManager как изменить компонент фрагмента

Интерфейс, диалоги, темы, стили, меню
Ответить
zrtnq
Сообщения: 2
Зарегистрирован: 08 авг 2014, 05:35

FragmentManager как изменить компонент фрагмента

Сообщение zrtnq » 09 авг 2014, 02:44

Есть такой адаптер

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

public class TabsPagerAdapter extends FragmentPagerAdapter {

	public TabsPagerAdapter(FragmentManager fm) {
		super(fm);
	}

	@Override
	public Fragment getItem(int index) {

		switch (index) {
		case 0:
			return new Fragment1;
		case 1:
			return new Fragment2;
		case 2:
			return new Fragment3;
		}

		return null;
	}

	@Override
	public int getCount() {
		return 3;
	}

}
Я создаю главную активность, наледуюсь от FragmentManager, устанавливаю главный view - pagerView(R.id.pager), и устанавливаю адаптер, все ок. Но как мне теперь изменить, к примеру, TextView(R.id.textView1) на моем Fragment1 из главного активити?

Пробовал так, но не робит:
tx = (TextView) getFragmentManager().findFragmentById(R.id.pager).getView().findViewById(R.id.TextView1);

findFragmentById(R.id.pager) возвращает null;

Вот код как я устанавливаю адаптер, если надо:

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

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.pager_menu);

		viewPager = (ViewPager) findViewById(R.id.pager);
		actionBar = getActionBar();
		mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

		viewPager.setAdapter(mAdapter);
		actionBar.setHomeButtonEnabled(false);
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

		for (String tab_name : tabs) {
			actionBar.addTab(actionBar.newTab().setText(tab_name)
					.setTabListener(this));
		}

		/**
		 * on swiping the viewpager make respective tab selected
		 * */
		viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

			@Override
			public void onPageSelected(int position) {
				// on changing the page
				// make respected tab selected
				actionBar.setSelectedNavigationItem(position);
			}

			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
			}

			@Override
			public void onPageScrollStateChanged(int arg0) {
			}
		});
	}

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

Re: FragmentManager как изменить компонент фрагмента

Сообщение Mikhail_dev » 09 авг 2014, 10:06

Во вьюпейджере надо искать по тегу, а не по идентификатору контейнера. Если посмотреть исходный код виьюпейджера, то можно увидеть вот что
[syntax=java5]return "android:switcher:" + viewId + ":" + index;[/syntax]
Т.е. так он получает имя. Собственно и ищите по данному тегу фрагмент.
[syntax=java5]
public Fragment getActiveFragment(int position) {
if (customPager!=null) {
switch (position) {
case PAGE_LIST:
position = 0;
break;
case PAGE_MAP:
position = isTwoPane?0:1;
break;
case PAGE_DETAILS:
position = isTwoPane?1:2;
break;
}
}
String name = makeFragmentName(customPager.getId(), position);
return getChildFragmentManager().findFragmentByTag(name);
}

private String makeFragmentName(int viewId, int index) {
return "android:switcher:" + viewId + ":" + index;
}

[/syntax]
Это мой код получения фрагмента. В нём уложненная логика, где в ландшафте у меня во вьюпейджере два фрамгмента, а в портрете один. Адаптируйте под себя.

Но также советую помнить про флаг
customPager.setOffscreenPageLimit(нужное_количество_фрагментов);

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

Re: FragmentManager как изменить компонент фрагмента

Сообщение Viewer » 09 авг 2014, 11:13

zrtnq писал(а):Пробовал так, но не робит:
tx = (TextView) getFragmentManager().findFragmentById(R.id.pager).getView().findViewById(R.id.TextView1);

findFragmentById(R.id.pager) возвращает null;
findFragmentById и findFragmentByTag ищут фрагменты по ID или тегу заданным для самих фрагментов, а не для элементов которые они содержат (пусть даже это корневой элемент) эти ID и/или TAG задаются либо в разметке XML, если в ней явно задан fragment (не путать с контейнером для него!) либо при транзакции добавления фрагментов.

Ответить