Я отвечаю на свой вопрос здесь, потому что сам вопрос остается прежним.У меня просто есть идея, которая может решить мою проблему.Поэтому я считаю, что этот пост должен быть прокомментирован отдельно.Может быть, моя идея противоречит всем правилам дизайна ?!Дайте мне знать, что вы об этом думаете.
Описание немного сложнее, поэтому я надеюсь, вы понимаете, что я имею в виду.
Просто в качестве примечания.Я пишу код с Xamarin C #.Но структура должна быть сопоставима с Java-кодом Android.
Хорошо, поехали ...
Макеты
- У меня есть действие с макетомXML, который имеет FrameLayout (@ id / frame_base) в качестве заполнителя для фрагментов.
- У меня есть макет XML (фрагмент_base.axml), который имеет два FrameLayouts (@ id / frame_left и @ id / frame_right) в качествезаполнители для будущих фрагментов.
- У меня есть макет xml (фрагмент_A.axml), в котором есть просто огромная кнопка с текстом «A».
- У меня есть макет XML (фрагмент_B.axml)у него есть просто огромная кнопка с текстом «B».
Идея состоит в том, что заполнитель frame_base
будет раздуваться макетом XML fragment_base
, который содержит заполнитель frame_left
, это будет раздуто макетом XML fragment_A
или fragment_B
.
Фрагменты
- У меня есть
FragmentBase
, который получается из Android.Support.V4.App.Fragment
. - У меня есть
FragmentA
, который получен из FragmentBase
. - У меня есть
FragmentB
, который получен из FragmentBase
.
В методе FragmentA::OnCreateView(..)
я пересылаю вызов базовому классу FragmentBase::OnCreateView(..)
, который наполнит контейнер группы просмотра макетом fragment_base
xml.Мы помним, этот макет содержит заполнитель с идентификатором frame_left
.Мы можем «найти» заполнитель после того, как FragmentBase::OnCreateView(..)
вернется с раздутым видом.Имея представление frame_left
, мы раздуваем его с помощью макета fragment_A
xml.
В FragmentB мы делаем то же самое.Конечно, мы используем соответствующие файлы и классы "B".
Вот код ...
класс FragmentA
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Inflate frame_base
var view = base.OnCreateView(inflater, container, savedInstanceState);
// Inflate frame_left
var leftFrame = view.FindViewById<ViewGroup>(Resource.Id.frame_left);
inflater.Inflate(Resource.Layout.fragment_A, leftFrame, true); // The 'true' is important!
return view;
}
class FragmentBase
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.Inflate(Resource.Layout.fragment_base, container, false);
}
Activity
Для этого решения мне нужно одно действие.Для тестирования я использовал несколько кнопок панели инструментов для переключения между FragmentA и FragmentB.Для меня важно то, что теперь я могу создавать экземпляр FragmentA, а также генерируется базовый макет и логика FrameBase.Взгляните на код:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_main);
// ... do some stuff here, that is really not important for this post...
// Get the FrameManager (in Java this is like: FragmentManager fm = getFragmentManager();
var fragmentManager = this.SupportFragmentManager;
// Start transaction
var transaction = fragmentManager.BeginTransaction();
// Add a new fragment of type FragmentA that derives from FragmenBase.
transaction.Add(Resource.Id.frame_base, new FragmentA(), "FrgmA");
// Make it happen
transaction.Commit();
}
private void OnToolbarButton_A()
{
// Replace current fragment by FragmentA
var fragmentManager = this.SupportFragmentManager;
var transaction = fragmentManager.BeginTransaction();
transaction.Replace(Resource.Id.frame_base, new FragmentA(), "FrgmA");
transaction.Commit();
}
private void OnToolbarButton_B()
{
// Replace current fragment by FragmentB
var fragmentManager = this.SupportFragmentManager;
var transaction = fragmentManager.BeginTransaction();
transaction.Replace(Resource.Id.frame_base, new FragmentB(), "FrgmB");
transaction.Commit();
}
Вывод
Вот и все ... э-э-э ... похоже, работает.
Но я не уверен, что жонглирование макетом / классом - это предназначенный для Android фреймворк образ жизни.
Дайте мне знать, что вы думаете?Может быть, у вас есть лучшие решения?