#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 работает только в одном потоке. Вы бы навсегда заблокировали этот поток