Intereting Posts
Android: сохранить синий фон после выбора ListView В Android – Как зарегистрировать только длинные клики с помощью ClickableSpan Android View анимация – низкая производительность на больших экранах GCM 3.0 – Требуется уточнение сообщения вверх по устройствам Восстановить режим трассировки по умолчанию adb FirebaseInstanceId: фоновая синхронизация не выполнена: PHONE_REGISTRATION_ERROR, повторите попытку в 10 с / 20 с / 40 с Как получить имя изображения, используя намерение камеры в android? Как узнать программно, установлен ли какой-либо двигатель TTS на моем устройстве или нет? Применение ненормального поведения не запускает активность, указанную в намерении Изменить значок маркера во время выполнения Состояние цвета фона CardView не соблюдается Проблемы с SD-картой Android Пролистать отфильтрованные изображения для Android WebView и Cookies на Android Как получить имя пакета (по умолчанию) приложения sms в Android до KitKat?

Проблема с обратным вызовом на экране в полноэкранном режиме Android

У меня возникли проблемы, обертывая что-то вокруг, но позвольте мне сначала описать мою установку:

течь

У меня есть активность, которая ссылается на 3 фрагмента, каждый из которых отображается в нужное время. Вот как выглядит функция ChildrenSpecificationFragment:

Если пользователь нажимает кнопку с плавающим действием, открывается следующий диалог DialogFragment:

В новых руководствах по разработке материалов я нашел следующую информацию: https://www.google.com/design/spec/components/dialogs.html#dialogs-full-screen-dialogs

Избегайте диалогов, которые: открывают дополнительные диалоги из диалогового окна. Содержите прокручивающийся контент, особенно оповещения. Вместо этого рассмотрите альтернативные контейнеры или макеты, которые оптимизированы для чтения или взаимодействия со значительным количеством контента.

Исключения включают в себя: Полноэкранные диалоги могут открывать дополнительные диалоги, такие как сборщики, потому что их дизайн вмещает дополнительные слои материала без значительного увеличения воспринимаемой z-глубины или визуального шума приложения.

Вот где мои проблемы начинаются. Диалог «добавить ребенка» имеет прокручиваемое содержимое (в альбомном режиме), и когда пользователь нажимает «Дата рождения», открывается панель выбора даты.

Я пытаюсь найти способ реализовать полноэкранный диалог (как в руководствах), который имеет обратный вызов в ChildSpecificationFragment, так что я могу добавить ребенка в RecyclerView.

Я надеюсь, что мои поиски ясны и будут очень признательны за любые материалы, которые приведут меня к решению. Заранее спасибо!

Я не вижу код с вашего поста. Поэтому я предполагаю, что ваша структура кода начинается. Сначала создайте свой диалог с помощью слушателя и процесса setPositiveButton () и события onClick.

Предложение кода:

public class ChildrenSpecificationFragment extends Fragment { ... public void passData(Object obj) { } class SubChildFragment extends Fragment { AlertDialog.Builder builder = new AlertDialog.Builder(thisContext); ... // Add the buttons... builder.setPositiveButton("Save", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { ... passData(Object obj); // pass data to the outer fragment class 

Заметки:

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

Добавить дочерний полноэкранный фрагмент

  • Этот метод кодирования проще, чем запуск нового действия и намерения.

Для показа полноэкранных диалогов есть хорошая веб-страница Google. Думаю, @ Dialog – полноэкранный режим . Найдите текст «Отображение полноэкранного диалога или встроенного фрагмента».

TL; DR – DialogFragment недостаточно для чего-либо, кроме полностью полного экрана. Вместо этого используйте действие.

Можно сделать DialogFragment (с показанным ActionBar ), но он вызывает множество раздражений.

DialogFragment , как следует из названия, показывает Dialog и Fragment в одном: его можно рассматривать как Dialog , используя show() и dismiss() или как Fragment , используя его с помощью FragmentManager .

Как предполагает официальная документация , сделать диалог полностью полноэкранным (накладывая все) достигается путем присоединения диалога к корневому представлению android.R.id.content :

 public void showDialog() { FragmentManager fragmentManager = getSupportFragmentManager(); CustomDialogFragment newFragment = new CustomDialogFragment(); if (mIsLargeLayout) { // The device is using a large layout, so show the fragment as a dialog newFragment.show(fragmentManager, "dialog"); } else { // The device is smaller, so show the fragment fullscreen FragmentTransaction transaction = fragmentManager.beginTransaction(); // For a little polish, specify a transition animation transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); // To make it fullscreen, use the 'content' root view as the container // for the fragment, which is always the root view for the activity transaction.add(android.R.id.content, newFragment) .addToBackStack(null).commit(); } } 

Чтобы диалоговое окно появилось под ActionBar , требуется FrameLayout который используется вместо корневого макета:

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_height="match_parent" android:layout_width="match_parent" android:fitsSystemWindows="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.design.widget.CoordinatorLayout android:id="@+id/toolbar_layout" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- Use ThemeOverlay to make the toolbar and tablayout text white --> <android.support.design.widget.AppBarLayout android:id="@+id/abl_top" android:layout_height="wrap_content" android:layout_width="match_parent" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:fitsSystemWindows="true" android:layout_height="wrap_content" android:layout_width="match_parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_scrollFlags="scroll|enterAlways"/> </android.support.design.widget.AppBarLayout> </android.support.design.widget.CoordinatorLayout> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_height="match_parent" android:layout_width="wrap_content" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header" app:menu="@menu/nav_view"/> </android.support.v4.widget.DrawerLayout> 

Теперь наступает боль.

В зависимости от того, как настраивается основная навигация приложения, нужно перепрыгнуть через разные обручи, чтобы все было отлично.

В приведенном выше примере есть NavigationView . Поскольку главная кнопка android.R.id.home обрабатывается в главном представлении, там нужна какая-то логика, чтобы проверить, отображается ли наш диалог, чтобы кнопка home, которая теперь X , закроет диалог. Возвращение false позволяет разрешить обработку события в диалоговом окне.

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: FragmentManager fm = getSupportFragmentManager(); Fragment f = fm.findFragmentById(R.id.content); if (f instanceof MyDialogFragment) { return false; } mDrawerLayout.openDrawer(GravityCompat.START); return true; } return super.onOptionsItemSelected(item); } 

Кроме того, кнопка назад требует аналогичной логики, чтобы определить, нужно ли NavigationView закрывать или сбросить содержимое ActionBar .

 @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { mDrawerLayout.closeDrawer(GravityCompat.START); } else { FragmentManager fm = getSupportFragmentManager(); Fragment f = fm.findFragmentById(R.id.content); if (f instanceof MyDialogFragment) { final ActionBar ab = getSupportActionBar(); ab.setHomeAsUpIndicator(R.drawable.ic_menu); ab.setTitle(R.string.app_name); } super.onBackPressed(); } } 

В самом диалоговом окне «Диалог» необходимо реализовать логику закрытия диалога (и злоупотребления ActionBar ).

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: if (mActionBar != null) { mActionBar.setHomeAsUpIndicator(R.drawable.ic_menu); mActionBar.setTitle(R.string.app_name); } getActivity().getSupportFragmentManager().popBackStack(); case R.id.action_save: if (mOnAcceptListener != null) { mOnAcceptListener.onAccept(); } if (mActionBar != null) { mActionBar.setHomeAsUpIndicator(R.drawable.ic_menu); mActionBar.setTitle(R.string.app_name); } getActivity().getSupportFragmentManager().popBackStack(); return true; } return super.onOptionsItemSelected(item); } 

Все это чувствует себя очень глупым . Конечно, если вы используете TabLayout , забудьте все, что я только что сказал.

С помощью TabLayout вы можете просто обрабатывать все в DialogFragment окне DialogFragment , но если вы используете ViewPager , невозможно будет ViewPager диалог для вкладок, но не панель действий. См. « Показать диалоговое окно» по элементу TabLayout .

У этого вопроса (у меня) есть ответ, который предлагает то же, что и @Jdruwe, который должен забыть о безнадежности DialogFragment и вместо этого использовать Activity .

Решение, описанное в моем блоге, используя startActivityForResult (…): http://jeroendruwe.be/full-screen-dialogs-in-android/

Добавьте эту строку в oncreate в свой собственный фрагмент диалогового окна.

 setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen); 

С другой стороны, вы можете использовать контент-резольвера для хранения ваших дочерних данных. Он имеет шаблон наблюдателя. Поэтому каждый CursorAdapter, прикрепленный к этому контенту, обновляется без вызова notifySetDataChanged(); ,

Я думаю, вы используете RecyclerView.Adapter. Вы можете использовать этот класс.

Еще один совет по внедрению дочерней функции – использование startActivityForResult(activity); , Вы можете отправить обратно данные с помощью getIntent().getExtras().put(key,value); Вы можете искать пользовательскую начальную активность для результата.

Удачи