Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

Посмотри это Раздел Android Documentatin для инфромации. Короче говоря, они просто реализуют интерфейс слушателя с помощью класса деятельности, и Cast Getactivity () приводит к фрагменту для слушателя.

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

  1. Eastilly Switch, лежащая в основе деятельности (например, вы проводите весь фрагмент в обертке для совместимости в до 3,0 и размещаете этот фрагмент вместе с другими в 11+)
  2. Easilly Control, если активность обертки поддерживает обратные вызовы или нет. Просто проверьте, реализует ли он слушателя, и выполняет конкретные действия вашего приложения, если это не так.

Другие советы

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

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

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

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

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

    FragmentTransaction ft = this.getFragmentManager().beginTransaction();
    Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName());
    ft.replace(android.R.id.content, mFragment);
    ft.commit();
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();
                     }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top