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) { } } 

  • 如何从活动回到以前的片段?
  • 如何testing片段视图对用户是否可见?
  • 使用FragmentStatePagerAdapter而不支持库
  • 不兼容的types:HomeFragment无法在Android中转换为Fragment
  • Intent构造函数的参数
  • 模式何时使用活动转换与dynamic片段
  • Android碎片导航和后台堆栈
  • 转换android片段向上滑动
  • 只需在XML文件中为您的<fragment />设置背景颜色即可。

    解决这个问题。

    我可能会很迟才回答这个问题。

    注意:

    这个答案可能与上面的问题没有关系,但希望对一些人有所帮助。

    有时,当我们尝试使用不同types的片段时(即使用less数片段中的支持片段和其他片段中的正常片段)

    最近我在导航抽屉里遇到同样的问题。 由于错误,我在一个片段中使用了“ import android.support.v4.app.Fragment; ”,并在其他片段中使用了“ import android.app.Fragment; ”。

    希望这会有助于某人..

    片段pipe理器维护被replace的所有先前片段的堆栈,有时后端堆栈片段与我们replace的片段重叠

      fragmentManager.popBackStack(); 

    作品,我们也可以在循环中做到这一点,以popup堆栈中的所有碎片,希望它有帮助,谢谢。 快乐编码:)

    这是我如何解决它..

    只有在布局匹配填充屏幕的情况下,设置背景才能消除屏幕上的重叠效果

    button点击取代的新片段在tab_selected或制表符变更操作中没有被replace

    下面的代码修复了我的问题

      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作为容器有关。 我刚刚创build了FrameLayout并从那里使用ID。

    那么设置片段背景颜色不是一个解决scheme,因为片段将仍然在可能消耗内存的活动堆栈中。

    解决方法是在添加任何新的片段之前,从您的framelayout中删除所有视图。

     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)添加第二个片段时,replace第一个片段而不是添加它。由于第一个片段已经添加到堆栈中,所以当您从第二个片段中按回时会出现 –

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

    3)这里是如何处理后面的代码,下面的代码应该出现在父Activity中 –

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

    当你有一个重叠片段,也许你的片段的背景是透明的,你需要把一个android:background =“@ color / white”'在你的片段propeties

     <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里面。

    有时会 getFragmentManager()同样的问题,但是我的问题与不同的片段pipe理器( getSupportFragmentManager()getFragmentManager()getFragmentManager() 。 我认为还有一个问题。 在我的情况下,当我打开导航抽屉时,我总是删除每个菜单选项上的旧片段,例如:

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

    没有导航抽屉就不可能进入子菜单,所以碎片基本上总是被删除。 在某些情况下,当我在一个Activity中删除并添加一个片段后,它突然与另一个(之前的片段)重叠? 但为什么片段pipe理器突然发现以前的片段呢? 这可能意味着片段pipe理器是越野车,它不会删除旧的碎片,或其他东西被打破。
    我的想法是,这是某种程度上Android Studio的错误或任何其他使用它的adb开发工具。 为什么我认为这是因为Android Studio有时似乎失去了正在运行的应用程序的实例。 可能这个问题在某种程度上与相同的问题有关: Android Studio不会部署对应用程序的更改 。 发生这种情况时我还没弄明白。 我所知道的是它不能成为一个编程问题,因为在我通过Android Studio重新启动应用程序之后,它不能重现。 我想有一些挂起的后台进程会导致活动,碎片,片段pipe理器等等的多个实例。 而且这不仅仅是这个bug。 过去我看到很多与此类似的奇怪行为。 (例如,当应用程序未由IDE启动时,行为突然消失)。

    这一切都与replaceaddToBackStack方法背后的工程有关。

    replace方法实际上会做两件事。 隐藏现有的片段(比方说A),并在容器中添加一个新的(比方说B)。

    将该事务添加到后端堆栈会做相反的事情。 删除B并添加A.

    所以,解决你的问题是
    1.使用addToBackStack方法。
    2.确保片段的反向replace是正确的顺序

    第二个build议是非常重要的,因为在某些时候,当前片段不会被删除,并且会添加另一个片段,这会导致两个片段同时显示。

     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();} 

    使背景颜色白色解决了我也是。 我认为这是Android碎片pipe理器中的一个错误或执行问题。 我正确地执行我的replace和popBackStack()。