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

Solutions Collecting From Web of "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()。