Android: фрагменты, перекрывающие проблему

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

public class FragmentManage extends Fragment implements ActionBar.TabListener { private Fragment mFragment; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_manage, container, false); OnClickListener clickListener = new OnClickListener() { public void onClick(View v) { FragmentTransaction ft = getFragmentManager().beginTransaction(); switch(v.getId()) { case R.id.imageBtnCategory: if (mFragment == null){ mFragment = new FragmentCategory(); } ft.replace(android.R.id.content, mFragment); break; case R.id.imageBtnManageKey: if (mFragment == null){ mFragment = new FragmentKeys(); } ft.replace(android.R.id.content, mFragment); break; case R.id.imageBtnChangePswd: if (mFragment == null){ mFragment = new FragmentChangePwd(); } ft.replace(android.R.id.content, mFragment); break; } ft.commit(); } }; ImageButton imageBtnCategory = (ImageButton) v.findViewById(R.id.imageBtnCategory); ImageButton imageBtnManageKey = (ImageButton) v.findViewById(R.id.imageBtnManageKey); ImageButton imageBtnChangePswd = (ImageButton) v.findViewById(R.id.imageBtnChangePswd); imageBtnCategory.setOnClickListener(clickListener); imageBtnManageKey.setOnClickListener(clickListener); imageBtnChangePswd.setOnClickListener(clickListener); return v; } public void onTabSelected(Tab tab, FragmentTransaction ft) { mFragment = new FragmentManage(); ft.add(android.R.id.content, mFragment); ft.attach(mFragment); } public void onTabUnselected(Tab tab, FragmentTransaction ft) { ft.remove(mFragment); } public void onTabReselected(Tab tab, FragmentTransaction ft) { } } 

    Просто установите цвет фона для вашего <fragment /> в XML-файле.

    Решите эту проблему.

    Возможно, мне очень поздно ответить на этот вопрос.

    Заметка:

    Этот ответ может быть не связан с вышеуказанным вопросом, но надеюсь, что это поможет некоторым.

    Иногда проблема перекрытия фрагментов возникает, когда мы пытаемся использовать разные типы фрагментов (т. Е. Используя фрагмент поддержки в нескольких фрагментах и ​​нормальных фрагментах в другом фрагменте)

    Недавно я столкнулся с такой же проблемой в навигационном ящике. По ошибке я использовал « import android.support.v4.app.Fragment; » в одном фрагменте и использовал « import android.app.Fragment; » в нескольких других фрагментах.

    Надеюсь, это поможет кому-то.

    Менеджер фрагментов поддерживает стек всех предыдущих фрагментов, которые заменяются, иногда фрагменты заднего стека перекрываются с фрагментом, который мы заменили, для меня

      fragmentManager.popBackStack(); 

    Работает, мы можем сделать это в цикле, чтобы всплыть все фрагменты в стеке, надеюсь, что это поможет, спасибо. Счастливое кодирование 🙂

    Вот как я это исправил.

    Установка фона приведет к удалению эффекта перекрытия с экрана, только если макет будет соответствовать заполнению экрана

    Новые фрагменты, замененные на нажатия кнопок, не заменялись в tab_selected или в результате изменения вкладок

    Следующий код исправил это для меня

      public void onTabUnselected(Tab tab, FragmentTransaction ft) { // This is required since button click replaces fragment whose link is lost hence overlapping isuee was occuring ft.replace(android.R.id.content, mFragment); // On Tab Change remove old fragment views ft.remove(mFragment); } 

    Другая проблема может быть связана с использованием android.R.id.content в качестве контейнера. Я только что создал FrameLayout и использую id оттуда.

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

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

     private void changeFragment(Fragment fr){ FrameLayout fl = (FrameLayout) findViewById(R.id.mainframe); fl.removeAllViews(); FragmentTransaction transaction1 = getSupportFragmentManager().beginTransaction(); transaction1.add(R.id.mainframe, fr); transaction1.commit(); } 

    Я также столкнулся с проблемой перекрытия фрагментов. Вот как я ее решил –

    1) Нам нужно добавить первый фрагмент с помощью addToBackStack, чтобы он сохранялся в стеке –

     FirstFragment firstFragment = new FirstFragment(); getFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).addToBackStack("first frag").commit(); 

    2) При добавлении второго фрагмента замените первый фрагмент, а затем добавьте его. Поскольку первый фрагмент уже добавлен в стек, он будет присутствовать при нажатии на второй фрагмент –

     SecondFragment secondFragment= new SecondFragment(); getFragmentManager().beginTransaction().replace(R.id.fragment_container, secondFragment).addToBackStack("second frag").commit(); 

    3) Вот как можно работать с обратным прессом, ниже код должен присутствовать в родительской операции –

      public void onBackPressed(){ if(getFragmentManager().getBackStackEntryCount() <= 1){ super.onBackPressed(); } else { getFragmentManager().popBackStack(); } } 

    Если у вас есть фрагмент перекрытия, возможно, ваш фон вашего фрагмента прозрачен, вам нужно добавить андроид: background = "@ color / white" внутри ваших фрагментов

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" 

    И белый вам нужно вставить внутри colors.xml #FFFFFF в папку для отдыха.

    У меня иногда есть одна и та же проблема, но моя проблема не связана с разными менеджерами фрагментов ( getSupportFragmentManager() , getFragmentManager() ). Я думаю, что есть еще одна проблема. В моем случае, когда я открываю навигационный ящик, я всегда удаляю старые фрагменты в каждом пункте меню, например:

     Fragment calendarFragment = context.getSupportFragmentManager().findFragmentByTag(FragmentTag.CALENDAR.name()); if (calendarFragment != null) { context.getSupportFragmentManager().beginTransaction().remove(calendarFragment).commit(); } 

    Невозможно войти в подменю без навигационного ящика, поэтому фрагменты в основном всегда удаляются. В некоторых случаях после удаления и добавления фрагмента внутри Activity он внезапно перекрывается с другим (предыдущим) фрагментом ?! Но почему менеджер фрагментов неожиданно обнаруживает предыдущие фрагменты? Это может означать, что диспетчер фрагментов неисправен, и он не удаляет старые фрагменты или что что-то другое нарушено.
    Я считаю, что это как-то по вине Android Studio или любого другого инструмента разработки adb, который используется им. Почему я так думаю, потому что Android Studio иногда, похоже, потеряет экземпляр запущенного приложения. Вероятно, эта проблема как-то связана с той же проблемой: Android Studio не развертывает изменения в приложении . Я еще не понял, когда это произойдет. Я знаю, что это не проблема программирования, потому что она не воспроизводится после того, как я перезапустил приложение Android Studio. Я думаю, что есть какие-то фоновые процессы, зависающие, что вызывает несколько экземпляров «Действия», «Фрагменты», «Менеджеры фрагментов» и т. Д. Кроме того, это не просто эта ошибка. Я видел много странных поведений в прошлом, которые похожи на это. (Например, поведение внезапно исчезло, когда приложение не было запущено с помощью IDE).

    Все это связано с разработкой методов замены и addToBackStack .

    Метод замены фактически выполнит две вещи. Скройте существующий фрагмент (допустим, A) и добавьте новый (скажем B) в контейнер.

    Добавление этой транзакции в задний стек сделает наоборот. Удалите B и добавьте A.

    Итак, решение вашей проблемы
    1. Используйте метод addToBackStack .
    2. убедитесь, что обратная замена фрагментов – правильный порядок

    Второе предложение действительно важно, потому что довольно часто в какой-то момент текущий фрагмент не удаляется, а другой добавляется, что вызывает одновременное отображение двух фрагментов.

     private void changeFragment(Fragment fr){ FrameLayout fl = (FrameLayout) findViewById(R.id.mainframe); fl.removeAllViews(); FragmentTransaction transaction1 =getSupportFragmentManager().beginTransaction(); transaction1.add(R.id.mainframe, fr); transaction1.commit();} 
     @Override protected void onSaveInstanceState(Bundle outState) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.remove(fragment1); ft.remove(fragment2); ft.commitAllowingStateLoss(); super.onSaveInstanceState(outState); } 
    Intereting Posts
    Установка Android-приложения через службу OTA Пользовательская аннотация и динамическая загрузка Java Я использую traceView, и я вижу android.view.ViewRoot.handleMessage 76.4% Добавление плагинов от конкретной версии проекта Github к проекту Cordova Как получить имя пакета (по умолчанию) приложения sms в Android до KitKat? Как протестировать определенные аппаратные функции с помощью Robolectric на Android? Идентификатор ресурса не найден для атрибута 'parentActivityName' в пакете 'android' Android M запрашивает разрешение без активности Модуль Google map v2. Android-приложение не отображает карту внутри карты Android, объектно-ориентированное программирование и проектирование для производительности Android как вращать холст rect SDK Местоположение не найдено в андроид-студии Откройте камеру по умолчанию на SurfaceView и запишите переднюю камеру Как загрузить изображение в хранилище Firebase? Есть ли наилучшая практика для упаковки слоев MVP?