Наследование пользовательского интерфейса Android - PullRequest
0 голосов
/ 30 ноября 2018

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

Вот моя проблема:
Поскольку я пришел из C # и WinForms , я привык разрабатывать пользовательские интерфейсы по наследству.Как намеченный путь в Android?

Пример:
У меня есть основная форма FormBase, которая содержит кнопку выхода и заполнитель для других компонентов графического интерфейса.Тогда у меня есть два класса FormA и FormC, которые оба наследуются от FormBase.
FormA добавляет листок на заполнитель FormBase.
FormC реализует некоторые текстовые поля и кнопки (может быть что угодно).

Основная логика приложения теперь переключается между FormA и FormC, в зависимости от состояния приложения.

Чтобы сделать мой вопрос более конкретным, как такое поведение реализовано в Android?Когда приложение запускается, оно подключается к какому-то сетевому сервису.Эта служба сообщит приложению, что Диалог / Активность / Фрагмент в данный момент активен.Изменение с FormA на FormC может быть инициировано по сети!

Что такое «чистый» и «предназначенный» способ в Android писать такие приложения.Поскольку дизайн фреймворка для Android не сравним с WinNET-формами .NET, я ожидаю чего-то совершенно другого.

Спасибо, что уделили время на чтение этого поста.

Pix

1 Ответ

0 голосов
/ 30 ноября 2018

Я отвечаю на свой вопрос здесь, потому что сам вопрос остается прежним.У меня просто есть идея, которая может решить мою проблему.Поэтому я считаю, что этот пост должен быть прокомментирован отдельно.Может быть, моя идея противоречит всем правилам дизайна ?!Дайте мне знать, что вы об этом думаете.

Описание немного сложнее, поэтому я надеюсь, вы понимаете, что я имею в виду.

Просто в качестве примечания.Я пишу код с 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 фреймворк образ жизни.

Дайте мне знать, что вы думаете?Может быть, у вас есть лучшие решения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...