Android: правильный способ перехода между фрагментами - PullRequest
19 голосов
/ 06 сентября 2011

Это вопрос разработки, а не технического вопроса.

Общий случай : я хочу, чтобы событие пользовательского интерфейса во фрагменте внесло изменения во всей деятельности.

Конкретный случай : у меня есть два фрагмента, размещенных в одном упражнении.Когда пользователь нажимает кнопку в одном из этих фрагментов, я хочу заменить его другим.

Я не хочу , однако мои фрагменты касаются моей деятельности.Я могу захотеть изменить поведение позже (может быть, на большом экране показать оба фрагмента вместо замены первого), и я не хочу, чтобы мой фрагментный код имел такую ​​логику.

То, что я сделал, быловнедрить класс Listener в мои фрагменты, который сообщает о событиях обратно в Activity.Таким образом, если я хочу использовать другой класс Activity с другим поведением дисплея, я могу просто поменять слушателя и оставить код Fragment без изменений.

Это хороший способ для этого?Существует ли стандартная хорошая практика или лучший шаблон проектирования?

Ответы [ 4 ]

12 голосов
/ 14 сентября 2011

Использование слушателей является рекомендуемым способом общения между фрагментом и вашей деятельностью.

См. раздел Android-документов для получения информации. Короче говоря, они просто реализуют интерфейс слушателя с помощью класса Activity и приводят результат getActivity () к фрагменту слушателю.

Из моего личного опыта это очень удобно, потому что позволяет:

  1. Легко переключать основное действие (например, вы размещаете весь фрагмент в действии оболочки для совместимости в pre-3.0 и размещаете этот фрагмент вместе с другими в 11 +)
  2. Легко контролирует, поддерживает ли действие оболочки обратные вызовы или нет. Просто убедитесь, что он реализует слушатель и выполняет определенные действия для вашего приложения, если это не так.
2 голосов
/ 09 сентября 2011

Вы правы в использовании слушателя.Это то, с чем мне также пришлось иметь дело в проекте на работе.Лучший способ справиться с этим - сделать Фрагмент автономным по своей природе.Все, кто хочет взаимодействовать с Фрагментом, должен использовать его открытый API и / или установить прослушиватели для определенных событий.Если вы знакомы с шаблонами проектирования , то это шаблон наблюдателя .События могут быть общими или конкретными, а также содержать данные или не содержать данных.

В качестве примера моего проекта у меня было два фрагмента.ListFragment и InfoFragment, который отображает выбранный ListItem.ListFragment уже имеет интерфейс Listener, к которому может подключиться моя активность, но InfoFragment не имеет его базового фрагмента.Я добавил интерфейс слушателя в InfoFragment, который будет уведомляться, когда фрагмент захочет закрыться.Для Фрагмента это может быть нажатием кнопки или определенным действием, но что касается моей Деятельности, то когда Событие запускается, оно закрывает представление Фрагмента.

Небоятся использовать много Слушателей для Фрагментов, но также пытаются группировать их по определенному действию, используя параметры данных для их индивидуализации.Надеюсь, это поможет!

0 голосов
/ 26 декабря 2014
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();
                     }
    }
0 голосов
/ 11 декабря 2012

Технический ответ для:

У меня есть два фрагмента, размещенных в одном упражнении.Когда пользователь нажимает кнопку в одном из этих фрагментов, я хочу заменить ее другим.

    FragmentTransaction ft = this.getFragmentManager().beginTransaction();
    Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName());
    ft.replace(android.R.id.content, mFragment);
    ft.commit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...