Можно ли получить доступ к элементам пользовательского интерфейса fragment из onCreate activitiy

#android #android-fragments

#Android #android-фрагменты

Вопрос:

Как говорится в заголовке: возможно ли получить видимый в данный момент фрагмент со всеми элементами пользовательского интерфейса, инициализированными в методе onCreate() действия? Я реализую разделение на модель, представление и контроллер с отдельными классами контроллеров, которые обрабатывают бизнес-логику и события пользовательского интерфейса. Поэтому им нужна ссылка на текущий фрагмент. Эти контроллеры инициализируются в методе onCreate() activity, поэтому мне нужен инициализированный фрагмент в этом методе.

Я приветствую любые советы 🙂

Редактировать:

Добавление некоторого кода для лучшего понимания: Я использую dagger для внедрения зависимостей и хотел бы сделать это в методе onCreate(). Как я уже говорил, моему контроллеру нужен элемент MapView. И именно поэтому я хотел бы иметь фрагмент с инициализированным элементом MapView.

MapActivity#onCreate (пакет):

 public void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.activity_layout);

    MyMapFragment fragment = new MyMapFragment();
    getFragmentManager().beginTransaction()
        .add(R.id.activity_container, fragment, "fragment")
        .commit();

    ObjectGraph.create(new Module(fragment.getMapView())).inject(this);
}    
  

activity_layout.xml

 <android.support.v4.widget.DrawerLayout>
    <FrameLayout
        android:id="@ id/activity_container"
        ... />
    <ListView .../>
</android.support.v4.widget.DrawerLayout>
  

fragment_layout.xml

 <RelativeLayout>
    <org.osmdroid.map.MapView 
        android:id"@ id/mapview"
        ... />
    <Button .../>
</RelativeLayout>
  

2-Е РЕДАКТИРОВАНИЕ:
Похоже, что это невозможно… Ура для downvote ^^

Комментарии:

1. То, что вы хотите сделать, невозможно. Проверьте жизненный цикл фрагментов и Activity еще раз.

2. Существует очень мало информации о том, как взаимодействуют жизненные циклы фрагментов и действий, поэтому я подумал, что onCreateView() будет вызываться сразу при создании фрагмента…

Ответ №1:

По умолчанию нет. Во время onCreate() выполнения activity фрагмент еще не привязан к activity.

Правильное место для доступа к представлениям фрагмента находится в самом фрагменте. Рассмотрите возможность размещения назначений контроллера во фрагменте в пределах его жизненного цикла, например, onCreateView() или onViewCreated() .

Можно явно запускать транзакции фрагментов в очереди, используя executePendingTransactions() или неявно после super.onStart() запуска в жизненном цикле activity. После этого представления фрагментов доступны в иерархии представлений активности.

Комментарии:

1. Невозможно сделать это во фрагменте, поскольку действие является отправной точкой внедрения… Я подумал, что есть другой вариант, чем использовать обратный вызов из фрагмента. Мне это кажется неуклюжим решением…

Ответ №2:

в вашем onCreate методе добавьте следующее (я использовал textview в качестве примера):

 while (fragment.getView() == null) {

        }
rootView = fragment.getView();
TextView myView = (TextView) rootView.findViewById(R.id.text_view);
  

Обязательно верните метод rootView вашего фрагмента onCreateView следующим образом:

     @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_activity,
                container, false);
        return rootView;
    }
  

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

Комментарии:

1. Это навсегда заблокирует поток пользовательского интерфейса, и приложение будет убито, если «приложение не отвечает».

2. @laalto Я думаю, что он будет оставаться в цикле while некоторое время, пока activity не получит фрагмент rootView . Это не заблокирует приложение навсегда. Я не знаю, имеете ли вы в виду, что возврат rootView из фрагмента не гарантируется. Каково ваше мнение?

3. Транзакции фрагмента будут выполняться в том же потоке пользовательского интерфейса, который вы блокируете.

4. Представление не будет создано, поскольку Android работает только в одном потоке. Вы бы навсегда заблокировали этот поток