Android:片段重叠问题

gir*_*ate 34 android overlapping android-fragments

当我在标签之间切换并将片段附加到下面的标签视图时,我面临着重叠片段的问题是我的代码请帮忙

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

    }
}
Run Code Online (Sandbox Code Playgroud)

kvh*_*kvh 84

只需为您<fragment />的XML文件设置背景颜色即可.

解决了这个问题.

  • 您可能还会遇到新片段背后的片段仍然可以点击的问题.如果发生这种情况,那么只需将新片段的父视图设为可点击:) (13认同)
  • 这不是一个好的解决方案,只是一种掩盖可能的代码味道的解决方法. (11认同)
  • 如果想要保持活动的背景呢? (4认同)
  • 这不是解决问题的好方法. (3认同)
  • 我是 android 开发的新手,你能告诉我我该怎么做吗? (2认同)
  • 这是一个正确的答案还是只是一招? (2认同)

Ros*_*han 16

我可能很晚才回答这个问题.

注意:

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

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

最近我在导航抽屉中面临同样的问题.错,我用" 进口android.support.v4.app.Fragment; "在一个片段,并用" 进口android.app.Fragment; "在其他几个片段.

希望这会对某人有所帮助..


Suf*_*ari 11

好吧设置片段背景颜色不是解决方案,因为片段仍然在活动堆栈中,这可能消耗内存.

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


Sye*_*hdi 10

片段管理器维护所有先前片段的堆栈,有时后面的堆栈片段与我们替换的片段重叠,对我而言

  fragmentManager.popBackStack(); 
Run Code Online (Sandbox Code Playgroud)

工作,我们也可以循环执行此操作以弹出堆栈中的所有片段希望它有所帮助,谢谢.快乐编码:)


gir*_*ate 5

这就是我修复它的方式..

仅当布局与填充屏幕匹配时,设置背景才会从屏幕上移除重叠效果

在 tab_selected 或 tab 更改操作上没有替换按钮点击时替换的新片段

以下代码为我修复了它

    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);
}
Run Code Online (Sandbox Code Playgroud)

  • 您首先替换然后删除,您不认为它会删除最新添加的片段... (2认同)

Sun*_*ita 5

我还面临片段重叠问题。这是我解决问题的方法。

  1. 我们需要添加第一个片段addToBackStack,以便将其保留在堆栈中。
    FirstFragment firstFragment = new FirstFragment();
    getFragmentManager()
        .beginTransaction()
        .add(R.id.fragment_container, firstFragment)
        .addToBackStack("first frag")
        .commit();
Run Code Online (Sandbox Code Playgroud)
  1. 添加第二个片段时,替换第一个片段而不是添加它。由于第一个片段已添加到堆栈中,因此当您从第二个片段按回时,它将出现。
    SecondFragment secondFragment = new SecondFragment();
    
    getFragmentManager()
        .beginTransaction()
        .replace(R.id.fragment_container, secondFragment)
        .addToBackStack("second frag")
        .commit();
Run Code Online (Sandbox Code Playgroud)
  1. 以下是如何处理后按,下面的代码应该出现在父 Activity 中。
     public void onBackPressed() {
        if(getFragmentManager().getBackStackEntryCount() <= 1) {
           super.onBackPressed();
        } else {
           getFragmentManager().popBackStack();
        }
     }
Run Code Online (Sandbox Code Playgroud)


Dav*_*nta 5

您检查过 XML 并查看主要布局是否为框架布局吗?如果没有,请改用框架布局。这将解决重叠问题。这是唯一的修复方法。我在寻找此问题的解决方案时尝试了“已接受”的答案,但它不起作用。