Начать фрагмент с деятельности
Я могу начать фрагмент из действия. Однако я беспокоюсь о потенциальных проблемах с моей реализацией.
У меня есть два фрагмента, FragmentA
а также FragmentB
И у меня есть 3 класса активности, Activity1
, Activity2
, ResultActivity
public class NavigationTabs extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_tabs_2);
FragmentStatePagerAdapter adapter = new MyTabs(getSupportFragmentManager());
....
....
}
static class MyTabs extends FragmentStatePagerAdapter {
public MyTabs(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position)
{
case 0:
FragmentA FragA = new FragmentA();
return FragA;
case 1:
FragmentB FragB = new FragmentB();
return FragB;
......
......
}
}
^ Как я звоню FragmentA
а также FragmentB
FragmentA
начинается Activity1
через намерение.
Intent intent = new Intent(getActivity(), Activity1.class);
startActivity(intent);
Activity1
затем передает результаты счетчика ResultActivity
ResultActivity
начинается (или возвращается к) FragmentA
и устанавливает SharedPreferences через onClick, как это
public void onClick(View v) {
if(v.getId()== R.id.button_1){
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putInt(passedSavePref, counter);
edit.commit();
finish();
}
}
FragmentB
начинается Activity2
через намерение.
Intent intent = new Intent(getActivity(), Activity2.class);
startActivity(intent);
Activity2
затем передает результаты счетчика ResultActivity
ResultActivity
начинается (возвращается) FragmentB
и устанавливает SharedPreferences через onClick, как это
public void onClick(View v) {
if(v.getId()== R.id.button_1){
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putInt(passedSavePref, counter);
edit.commit();
finish();
}
}
Это все работает для моих нужд. GC вроде нормально, его освобождают и выделяют память.
ResultActivty
возвращается к правильному фрагменту, и он правильно устанавливает SavedPreferences.
Все же это кажется очень плохой реализацией. Для начала, при поиске других вопросов, которые я прочитал, "Не запускайте действие непосредственно из фрагмента", постер также был связан с правильной реализацией здесь https://developer.android.com/guide/components/fragments.html
Я пробовал звонить Activity1
от FragmentA
как это, но я не вижу разницы в поведении или производительности
Intent intent = new Intent(getActivity(), Activity1.class);
startActivity(intent);
getActivity().getSupportFragmentManager().popBackStack();
Так что мой вопрос, мне нужно закончить / удалить FragmentA
когда я начну Activity1
затем начните FragmentA
снова из ResultActivity
используя что-то вроде
FragmentTransaction transaction = getFragmentManager().beginTransaction();
Заранее спасибо.
РЕДАКТИРОВАТЬ Так что я пытался убить / закончить / поп FragmentA
чтобы я мог перезапустить его с ResultActivity
, Причина, по которой я пытался это сделать, заключалась в том, что мои сохраненные ссылки не загружались, когда я возвращался в FragmentA
от ResultActivity
(хорошо они сохранялись и загружались правильно, но я их не видел)
Как я понимаю из документов, фрагменты идут на паузу. Так что вызывая мой метод loadPreferences onResume(); загрузил мои SavedPreferences.
Не отмечать это как ответ, потому что я не внедрил ни одну стандартную / надлежащую практику работы с Фрагментами popBackStack();
FragmentTransactions
так далее
1 ответ
- Цитата: "Не начинайте деятельность непосредственно с фрагмента"
Я прочитал плакат, который написал это, и я категорически не согласен. Его обоснование заключается в том, что это уменьшает модульность фрагмента, и он считает, что вы должны заставить интерфейс вызывать действия.
Я не согласен. Это не уменьшает модульность, фактически это увеличивает. Зачем реализовывать слой абстракции, чтобы делать что-то, что фрагмент должен делать в каждой реализации? Зачем переписывать один и тот же код в каждом упражнении, если его можно модулировать во фрагменте? На самом деле фрагменты не будут иметь своих собственных специализированных функций для запуска действий, если это противоречит принципам проектирования.
Например, если вы запускаете действие с помощью frag.startAcitivtyForResult(), фрагмент помещается непосредственно как получатель onActivityResult. Это не так, если вы используете свой экземпляр активности для непосредственного запуска нового действия.
- Вам не нужно удалять фрагменты перед началом нового действия
Android приостановит / остановит ваши фрагменты и, возможно, уничтожит их и основную деятельность. Android постоянно уничтожает и воссоздает действия и фрагменты, как каждый раз, когда вы меняете ориентацию на экране - в настройках по умолчанию ваша активность и фрагменты совершают массовое самоубийство.
Вот почему такие функции, как OnSaveInstanceState(), так важны, потому что они позволяют вашим действиям и фрагментам возвращаться в сохраненное состояние. Общее правило программирования для Android - ваша деятельность / фрагменты должны быть в состоянии изящно реагировать на спонтанную смерть.