Android: правильный способ прыгать между фрагментами
Это вопрос дизайна, а не технический.
Общий случай. Я хочу, чтобы в пользовательском интерфейсе произошел обход изменений во всей области.
Конкретный случай. У меня есть два фрагмента, размещенных в одном и том же действии. Когда пользователь нажимает кнопку в одном из этих фрагментов, я хочу, чтобы он был заменен другим.
Я не хочу, однако мои фрагменты касаются моей активности. Возможно, я захочу изменить поведение позже (возможно, на большем экране, покажите оба фрагмента вместо замены первого), и я не хочу, чтобы мой код фрагмента имел такую логику.
То, что я сделал, это реализовать класс Listener
в моих фрагментах, который передает события обратно в Activity
. Таким образом, если я хочу использовать другой класс Activity
с различным поведением дисплея, я могу просто изменить прослушиватель и оставить код Fragment
нетронутым.
Это хороший способ? Есть ли стандартная хорошая практика или лучший дизайн?
Ответы
Ответ 1
Использование прослушивателей - это рекомендуемый способ связи между фрагментом и вашей деятельностью.
Смотрите раздел документа Google для передачи информации. Короче говоря, они просто реализуют интерфейс слушателя классом Activity, а cast getActivity() приводит фрагмент к слушателю.
Из моего личного опыта это очень удобно, потому что позволяет:
- Легко переключать базовую активность (например, вы размещаете весь фрагмент в активности оболочки для совместимости в pre-3.0 и размещаете этот фрагмент вместе с другими в 11 +)
- Легко контролировать, поддерживает ли активность обертки обратные вызовы или нет. Просто проверьте, реализует ли он прослушиватель и выполняет ли какие-либо действия для вашего приложения, если это не так.
Ответ 2
Вы можете использовать прослушиватель. Это то, с чем мне пришлось столкнуться и в проекте на работе. Лучший способ справиться с этим - сделать Фрагмент автономным по своей природе. Все, что хочет взаимодействовать с фрагментом, должно использовать его общедоступный API и/или устанавливать прослушиватели для определенных событий. Если вы знакомы с Design Patterns, это шаблон наблюдателя. События могут быть общими или конкретными, а также содержать данные или данные.
В качестве примера моего проекта у меня было два фрагмента. ListFragment и InfoFragment, который отображает выбранный ListItem. В ListFragment уже есть интерфейс Listener для моей активности, но InfoFragment не работает со своего основного фрагмента. Я добавил интерфейс Listener к InfoFragment, который будет уведомлен, когда Фрагмент хотел закрыть. Для фрагмента это может быть нажатие кнопки или определенное действие, но в отношении моей активности, когда событие инициировано, оно закрывает представление фрагмента.
Не бойтесь использовать множество прослушивателей для фрагментов, но также попытайтесь сгруппировать их по конкретному действию с использованием параметров данных для их индивидуализации. Надеюсь, это поможет!
Ответ 3
Технический ответ для:
У меня есть два фрагмента, размещенных в одном и том же действии. Когда пользователь нажимает кнопку в одном из этих фрагментов, я хочу, чтобы он был заменен другим.
FragmentTransaction ft = this.getFragmentManager().beginTransaction();
Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName());
ft.replace(android.R.id.content, mFragment);
ft.commit();
Ответ 4
public class Example_3_Mainfile extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.example_3_mainfile);
Fragment fr ;//make class that extend to thefragment
fr = new Act_2_1();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
//id get of fragment tag from xml file there decelar
fragmentTransaction.commit();
}
}