Android 安卓:碎片重叠问题

Android 安卓:碎片重叠问题,android,android-fragments,overlapping,Android,Android Fragments,Overlapping,在选项卡之间切换并将片段附加到选项卡视图时,我遇到了重叠片段的问题 下面是我的代码,请帮忙 public class FragmentManage extends Fragment implements ActionBar.TabListener { private Fragment mFragment; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,

在选项卡之间切换并将片段附加到选项卡视图时,我遇到了重叠片段的问题 下面是我的代码,请帮忙

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

    }
}

只需为XML文件中的
设置背景色


解决了问题。

我就是这样解决的

只有当布局与填充屏幕相匹配时,设置背景才能消除屏幕上的重叠效果

单击按钮时替换的新片段在所选选项卡或选项卡更改操作时未被替换

下面的代码为我修复了它

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

fragment manager维护被替换的所有先前片段的堆栈,有时,对我来说,后堆栈片段与我们替换的片段重叠

  fragmentManager.popBackStack(); 

工作,我们也可以在一个循环中这样做,以弹出堆栈中的所有片段希望它有帮助,谢谢。快乐编码:)

我回答这个问题可能会很晚

注意:

这个答案可能与上述问题无关,但希望对一些人有所帮助

有时,当我们尝试使用不同类型的片段(即在少数片段中使用支持片段,而在其他片段中使用正常片段)时,会出现片段重叠问题

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

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.R.id.content
作为容器有关。我刚刚创建了
FrameLayout
,并在那里使用id

我也面临片段重叠问题。下面是我如何解决它的-

1) 我们需要使用addToBackStack添加第一个片段,以便它保留在堆栈中-

FirstFragment firstFragment = new FirstFragment();
getFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).addToBackStack("first frag").commit();
2) 添加第二个片段时,替换第一个片段,而不是添加它。因为第一个片段已经添加到堆栈中,所以当您从第二个片段按back时,它将出现-

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();
    }
 }
public void onBackPressed(){

如果(getFragmentManager().GetBackBackbackEntryCount()当您有一个重叠片段时,您的片段背景可能是透明的,那么您需要在片段属性中放置一个android: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"

设置片段背景色并不是一个解决方案,因为片段仍然在活动堆栈中,这可能会消耗内存

解决方案是在添加任何新片段之前从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();
}

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

Fragment calendarFragment = context.getSupportFragmentManager().findFragmentByTag(FragmentTag.CALENDAR.name());
if (calendarFragment != null)
{
    context.getSupportFragmentManager().beginTransaction().remove(calendarFragment).commit();
}
如果没有导航抽屉,就无法进入子菜单,因此片段基本上总是被删除的。在某些情况下,在我删除并在活动中再次添加一个片段后,它会突然与另一个(以前的)片段重叠?!但是为什么片段管理器会突然发现以前的片段? 这可能意味着片段管理器有缺陷,无法删除旧片段,或者其他部分已损坏。

我的想法是,这不知何故是Android Studio或其使用的任何其他adb开发工具的错误。我认为这是因为Android Studio有时似乎会丢失正在运行的应用程序的实例。可能这个问题不知何故与同一问题有关:。我还不知道这是什么时候发生的。我知道的是,它不能这不是一个编程问题,因为在我通过Android Studio重新启动应用程序后,它是不可复制的。我想可能有任何后台进程挂起,导致多个活动实例、片段、片段管理器等。此外,这不仅仅是这个bug。我在过去看到了很多与此类似的奇怪行为是一个。(例如,当应用程序不是由IDE启动时,行为突然消失)。

这一切都与替换和addToBackStack方法背后的工程有关。 replace方法实际上会做两件事:隐藏现有片段(比如A)并在容器中添加一个新片段(比如B)。 将该事务添加到后堆栈将起相反的作用。 删除B并添加A. 因此,您的问题的解决方案是
1.使用addToBackStack方法。
2.确保碎片的反向替换顺序正确
第二个建议非常重要,因为在某些情况下,当前片段通常不会被删除,而添加了另一个片段,这导致两个片段同时显示。

将背景颜色设置为白色也解决了这一问题。我认为这是安卓片段m中的一个bug或实现问题我正在实现我的替换和popBackStack()正确。

当我遇到这样的问题时,我似乎是在用childFragmentManager添加一个片段,用家长的fragmentManager添加另一个片段,所以请检查您是否使用了相同类型的片段管理器。

我认为实现白色背景不是一个安全的解决方案,尽管它可能很方便。基本上,问题发生在bec因为片段管理器不知道要弹出哪个片段

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();}
Backback看起来像这样,并且认为你在frag 4 1->2,2->3,3->4上 但由于某种原因,你实际上在第6架上,所以popbackstack开始了


删除(4)添加(3)我找到了简单而干净的解决方案。对我来说,问题在于每次调用活动的onCreate()时都会执行片段事务。 现在,我只在savedInstanceState==null时执行事务

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        if (savedInstanceState == null) {
        // replace fragment 
        }
    }

您是否检查了XML和se
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        if (savedInstanceState == null) {
        // replace fragment 
        }
    }