Урок 106. Android 3. Fragments. Взаимодействие с Activity

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 106. Android 3. Fragments. Взаимодействие с Activity

Сообщение damager82 » 09 сен 2012, 23:00

В этом уроке:
- рассмотрим взаимодействие между Activity и ее фрагментами


Click here to read this article!
Последний раз редактировалось damager82 23 май 2017, 22:09, всего редактировалось 11 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Shifted
Сообщения: 7
Зарегистрирован: 12 окт 2012, 13:52

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Shifted » 18 окт 2012, 09:59

хочу заполнить Gridview во Fragment из базы sqlite. Мне надо создавать отдельное подключение в БД (как это скажется на производительности и не будет ли каких-либо конфликтов)?
Например:
DB db = new DB(getActivity());
db.open();

или создать тока в Activity (onCreate). И каким образом тогда получить(передать) доступ к соединению с бд из Activity во fragment.

Желательно, чтобы fragment был максимально независим от Activity.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Foenix » 02 дек 2012, 00:04

Уже устала думать, поэтому хочу попросить помощи.
У меня активити, назовем MainActivity. Вызывает диалог (будь он неладен) назову FragmentDialog1, на нем дата. Я хочу приделать дату-пикер к нему. Приделала, Все окей, но не могу данные вернуть, как я обычно это делаю в обычном случае:

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

public void onDateSet(DatePicker view, int year, int month, int day) {
        EditDateDialogListener activity = (EditDateDialogListener) getActivity();
        activity.onFinishDateDialog(day, month, year);
}
ошибка датакаст, что естественно, идет на строчке с getActivity(). Понятное дело, у меня обработчик сидит в FragmentActivity, а тут получается что если я вызываю getActivity(), то оно возвращает мне MainActivity, из которой я вызывала первый FragmentDialog1.
Можно как-то быстренько к нему обратиться, или надо затевать передачу даты в MainActivity, потом передавать это дело в FragmentDialog1..? :roll:
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Foenix » 02 дек 2012, 10:39

люди.. ну подскажите..
как обратиться из датапикера (который dialogFragment), вызываемого из DialogFragment1? Мне сказали, что как-то можно назначить DialogFragment1-у ID, а потом по нему достать
Я пишу в коде DialogFragment1:

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

@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.dordernewfragment, container, false);
		v.setId(222);
...
}
А затем пытаюсь из датапикера вызывать

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

public void onDateSet(DatePicker view, int year, int month, int day) {
		EditDateDialogListener handler = (EditDateDialogListener) getActivity().getSupportFragmentManager().findFragmentById(222);
		handler.onFinishDateDialog(day, month, year);
		
	}
Пробовала и так

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

EditDateDialogListener handler = (EditDateDialogListener) getActivity().getFragmentManager().findFragmentById(222);
и так

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

EditDateDialogListener handler = (EditDateDialogListener) getFragmentManager().findFragmentById(222);
все равно null туда попадает. Я просто плохо разбираюсь что именно тут надо вызывать..


Нашла! нашла по тегу!!
может кому-то надо будет, пишу тут
ПРи вызове диалога

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

DialogFragment dlg = DOrderCaptionFragment.newInstance(p1,p11, p2, p3);
			dlg.show(getSupportFragmentManager(), "NewFragmentDate");
а затем, чтобы найти его

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

EditDateDialogListener activity = (EditDateDialogListener) getActivity().getSupportFragmentManager().findFragmentByTag("NewFragmentDate");
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Foenix » 31 дек 2012, 01:08

Кто-нибудь знает, как получить из активити доступ к переменной класса статического фрагмента? В уроке только к вьюшке доступ

Fragment frag1 = getFragmentManager().findFragmentById(R.id.fragment1);
((TextView) frag1.getView().findViewById(R.id.textView))
.setText("Access to Fragment 1 from Activity");

А мне нужно получить переменную моего класса, которая extends Fragment
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

heluvet
Сообщения: 8
Зарегистрирован: 20 дек 2012, 09:48

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение heluvet » 14 янв 2013, 18:59

Olivka писал(а):Кто-нибудь знает, как получить из активити доступ к переменной класса статического фрагмента? В уроке только к вьюшке доступ

Fragment frag1 = getFragmentManager().findFragmentById(R.id.fragment1);
((TextView) frag1.getView().findViewById(R.id.textView))
.setText("Access to Fragment 1 from Activity");

А мне нужно получить переменную моего класса, которая extends Fragment
Создал переменную в классе, который extends Fragment. Присвоил в конструкторе значение. В активити просто обратился к экземпляру класса и получил нужное значение:

Toast.makeText(this, String.valueOf(frag1.some_Var), Toast.LENGTH_SHORT).show();

Аватара пользователя
River
Сообщения: 4
Зарегистрирован: 23 окт 2013, 01:57

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение River » 23 окт 2013, 02:49

В уроке такой текст:
"На всякий случай проговорю одну вещь из разряда «Спасибо кэп!». Если посмотреть на код MainActivity, то можно заметить, что frag2 в методе onCreate и frag2 в методе onClick по сути работают с одним объектом – Fragment2. Это так и есть. Оба frag2 в итоге будут ссылаться на один объект. Так что, если вы динамически добавили фрагмент, то у вас уже есть ссылка на него, и искать его через findViewById вам уже не надо."
Судя по всему, речь здесь идёт о методе findFragmentById, а не о findViewById..

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение damager82 » 06 ноя 2013, 11:35

River писал(а):В уроке такой текст:
"На всякий случай проговорю одну вещь из разряда «Спасибо кэп!». Если посмотреть на код MainActivity, то можно заметить, что frag2 в методе onCreate и frag2 в методе onClick по сути работают с одним объектом – Fragment2. Это так и есть. Оба frag2 в итоге будут ссылаться на один объект. Так что, если вы динамически добавили фрагмент, то у вас уже есть ссылка на него, и искать его через findViewById вам уже не надо."
Судя по всему, речь здесь идёт о методе findFragmentById, а не о findViewById..
Верно, спасибо!
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

mr.Lazy
Сообщения: 2
Зарегистрирован: 15 ноя 2013, 06:43

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение mr.Lazy » 21 ноя 2013, 14:54

Здравствуйте подскажите кто знает очень надо !!! Задача заключается в следующем нужно передать данные из FragmentActivity в созданный в нём Fragment. Фрагменты создаются с помощью FragmentPagerAdapter.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение damager82 » 21 ноя 2013, 22:41

mr.Lazy писал(а):Здравствуйте подскажите кто знает очень надо !!! Задача заключается в следующем нужно передать данные из FragmentActivity в созданный в нём Fragment. Фрагменты создаются с помощью FragmentPagerAdapter.
Можно Arguments использовать. Посмотрите Урок 115, там они есть в примере
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

mr.Lazy
Сообщения: 2
Зарегистрирован: 15 ноя 2013, 06:43

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение mr.Lazy » 22 ноя 2013, 08:59

damager82 писал(а):
mr.Lazy писал(а):Здравствуйте подскажите кто знает очень надо !!! Задача заключается в следующем нужно передать данные из FragmentActivity в созданный в нём Fragment. Фрагменты создаются с помощью FragmentPagerAdapter.
Можно Arguments использовать. Посмотрите Урок 115, там они есть в примере
Как принимать данные в Fragment я понял:

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

	static FragmentView1 newInstance(String pos) {
		  FragmentView1 details = new FragmentView1();
		    Bundle args = new Bundle();
		    args.putString("title", pos);
		    details.setArguments(args);
		    return details;
		  }

	  String getPosition() {
		    return getArguments().getString("position");
		  }
А как их туда передать так и не могу понять....

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

package com.example.vksktv;
public class abonentsInfo extends FragmentActivity {
	public static final String TAG_LOG = "MyLog";
	SectionsPagerAdapter mSectionsPagerAdapter;
	ViewPager mViewPager;
	private CharSequence subtitle = "Поиск модема";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
		mViewPager = (ViewPager) findViewById(R.id.pager);
		mViewPager.setAdapter(mSectionsPagerAdapter);
		ActionBar barOne = getActionBar();
		barOne.setSubtitle(subtitle );
		
		//--------------Эти данные нужно передать в созданные Fragment ------
		Intent intent = getIntent();		
		String title = intent.getStringExtra("title");
		//-------------------------------------------

	}
	public class SectionsPagerAdapter extends FragmentPagerAdapter {
		private final String titles[] = new String[]{"История изменения статуса","Баланс абонента","Патежи абонента"};
		private final Fragment frags[] = new Fragment[titles.length];
		public SectionsPagerAdapter(FragmentManager fm) {
			super(fm);
			frags[0]= new FragmentView1();
			frags[1]= new FragmentView2();
			frags[2]= new FragmentView3();
		}
		@Override
		public Fragment getItem(int position) {
			return frags[position];
		}
		@Override
		public int getCount() {
			return frags.length;
		}
		@Override
		public CharSequence getPageTitle(int position) {
			Locale l = Locale.getDefault();
			return titles[position];
		}	
	}
}

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение damager82 » 23 ноя 2013, 16:41

mr.Lazy писал(а):А как их туда передать так и не могу понять....
После создания фрагмента используйте метод setArguments
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

madcrinkle
Сообщения: 4
Зарегистрирован: 25 ноя 2013, 13:52

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение madcrinkle » 25 ноя 2013, 14:07

Здравствуйте! Помогите плиз, в основном activity есть checkbox как мне проверить isChecked из фрагмента?

andrews
Сообщения: 3
Зарегистрирован: 20 ноя 2013, 12:12

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение andrews » 25 ноя 2013, 14:23

Думаю стоит сохранять значения чекбоксов в Preferences - в этом случае можно из достать из любого места

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

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение KamiSempai » 25 ноя 2013, 14:26

Решений масса. Я бы создал специальный интерфейс, через который фрагмент смог бы общаться с Activity.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

madcrinkle
Сообщения: 4
Зарегистрирован: 25 ноя 2013, 13:52

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение madcrinkle » 25 ноя 2013, 16:23

KamiSempai писал(а):Решений масса. Я бы создал специальный интерфейс, через который фрагмент смог бы общаться с Activity.
А можно немного поподробнее, как реализовать, хотя бы через что и в какую сторону покопать?
andrews писал(а):Думаю стоит сохранять значения чекбоксов в Preferences - в этом случае можно из достать из любого места
Через Preferences можно попробовать, но хотелось бы что бы checkbox был на глазах.

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

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение KamiSempai » 25 ноя 2013, 17:35

madcrinkle писал(а):
KamiSempai писал(а):Решений масса. Я бы создал специальный интерфейс, через который фрагмент смог бы общаться с Activity.
А можно немного поподробнее, как реализовать, хотя бы через что и в какую сторону покопать?
[syntax=java]public interface MyInterface {
public boolean optionChecked();
}[/syntax]
После чего Activity должно реализовать этот интерфейс.
Далее, нужно передать его во фрагмент. Например так:[syntax=java]public class MyFragment extends Fragment {

public MyInterface mMyInterface;

public void setMyInterface (MyInterface myInterface) {
mMyInterface = myInterface;
}
}[/syntax]Теперь можно общаться с активностью через этот интерфейс.

А можно сделать еще хитрее[syntax=java]public class MyFragment extends Fragment {

public MyInterface mMyInterface;

public void onAttach (Activity activity){
if(activity instanceof MyInterface)
mMyInterface = activity;
}[/syntax]
Но это в том случае если фрагмент используется в нескольких активностях, иначе можно просто получить активность и обращаться к ее публичным методам:[syntax=java]((MyActivity) getActivity()).myMetod()[/syntax]Тогда, вышеописанные пляски с интерфейсом не нужны.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

madcrinkle
Сообщения: 4
Зарегистрирован: 25 ноя 2013, 13:52

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение madcrinkle » 26 ноя 2013, 13:24

KamiSempai, спасибо, буду пробовать.

madcrinkle
Сообщения: 4
Зарегистрирован: 25 ноя 2013, 13:52

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение madcrinkle » 26 ноя 2013, 16:30

KamiSempai писал(а):Теперь можно общаться с активностью через этот интерфейс.
Сделал интерфейс, но что то не могу понять как мне теперь достучатся до моего checkbox'a

пробую так:

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

pdaStream = (CheckBox) mMyInterface.findViewById(R.id.pdaStream);
но видимо неправильно :cry: , пишет что The method findViewById(int) is undefined for the type MainActivity.MyInterface

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

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение KamiSempai » 27 ноя 2013, 13:40

Очевидно, вы не в ладах с ООП. Вы вообще поняли, что было в этом уроке и как оно работает?

Видимо я совершенно вас запутал своими примерами. Забудьте все, что я писал про интерфейс.
Делайте так:
[syntax=java]pdaStream = (CheckBox) getActivity().findViewById(R.id.pdaStream); [/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить