Подтвердить что ты не робот

Android: правильный способ прыгать между фрагментами

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

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

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

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

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

Это хороший способ? Есть ли стандартная хорошая практика или лучший дизайн?

4b9b3361

Ответ 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();
                     }
    }