Java 当从一个片段移动到另一个片段时,前者的元素会停留在屏幕上

Java 当从一个片段移动到另一个片段时,前者的元素会停留在屏幕上,java,android,android-fragments,Java,Android,Android Fragments,所以我有一个主要的活动,它有一个表格和一个显示不同片段的浏览页面 当我使用Tablayout在片段之间移动时,一切都很好,但是如果我使用按钮打开片段,当返回到前一个片段时(通过按下取消按钮),我留下的片段元素会留在屏幕上(如图所示) 我尝试使用方法viewPager.setCurrentItem(0)在片段中,从ft.replace(R.id.fragment\u edit\u提醒,新的主要活动\u fragment())的片段instade返回主页。提交()但它没有移回我的主片段(使用repa

所以我有一个主要的活动,它有一个表格和一个显示不同片段的浏览页面

当我使用Tablayout在片段之间移动时,一切都很好,但是如果我使用按钮打开片段,当返回到前一个片段时(通过按下取消按钮),我留下的片段元素会留在屏幕上(如图所示)

我尝试使用方法
viewPager.setCurrentItem(0)在片段中,从
ft.replace(R.id.fragment\u edit\u提醒,新的主要活动\u fragment())的片段instade返回主页。提交()但它没有移回我的主片段(使用repalce它确实返回,但正如我所说的元素)

这是我的主要观点:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TabLayout tableLayout = findViewById(R.id.Tablayouting);
        final ViewPager viewPager = findViewById(R.id.ViewPager);
        PagerAdapter pagerAdapter = new 
        PagerAdapter(getSupportFragmentManager(),tableLayout.getTabCount());
        viewPager.setAdapter(pagerAdapter);


        tableLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }

}

这是片段:

public Fragment getCurrentFragment() {
        return mMainAdapter.getFragment(mPager.getCurrentItem());
    }
公共类编辑\u提醒\u片段扩展片段实现View.OnClickListener{
私人按钮取消按钮;
公共编辑\u提醒\u片段(){
//必需的空公共构造函数
}
/**
*使用此工厂方法创建的新实例
*使用提供的参数创建此片段。
*
*@return fragment edit_rements_fragment的新实例。
*/
公共静态编辑\u提醒\u片段newInstance(){
编辑_提醒_片段=新编辑_提醒_片段();
Bundle args=新Bundle();
fragment.setArguments(args);
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(getArguments()!=null){
}
}
@RequiresApi(api=Build.VERSION\u CODES.O)
public void onClick(View)//TODO:创建一个实用方法,用于在主\u活动\u片段上切换片段(请参见注释)。
{
开关(view.getId()){//识别按下的按钮
案例R.id.按钮取消提醒:
//区域
FragmentTransaction ft=getFragmentManager().beginTransaction();
Main_Activity_fragment maf=新的Main_Activity_fragment();
ft.replace(R.id.fragment_edit_提醒,maf).commit();
打破
//端区
}
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u edit\u rementer\u fragment,container,false);
cancelButton=view.findViewById(R.id.ButtonCancelReminder);
cancelButton.setOnClickListener(此);
返回视图;
}
}
我的pagerAdapted类:

public class PagerAdapter extends FragmentPagerAdapter {
    //https://www.youtube.com/watch?v=HHd-Fa3DCng&ab_channel=MasterCoding

    private int numOfTabs;

    public PagerAdapter(FragmentManager fm, int numOfTabs) {
        super(fm);
        this.numOfTabs = numOfTabs;
    }


    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new Main_Activity_fragment();
            case 1:
                return new key_words_fragment();
            case 2:
                return new groups_and_points_fragment();
            case 3:
                return new Fragment_Past_Reminders();
            case 4:
                return new edit_reminder_fragment();
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return numOfTabs;
    }
}
在图片中,我们看到主页片段,在其上有3个按钮(
取消
保存
添加子提醒
),它们保留在单击
添加新提醒
按钮时打开的片段中(在第二个片段中单击取消时,返回主页):


首先,尝试以下方法作为适配器:

 public class PagerAdapter extends 
FragmentPagerAdapter {
    
    private final ArrayList<Fragment> mFragments = new ArrayList<>();
    private final ArrayList<String> mFragmentTitle = new ArrayList<>();
    
    public PagerAdapter(FragmentManager mManager) {
        super(mManager);
    }
    
    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }
    
    public void addFragment(Fragment fragment, String title) {
        mFragments.add(fragment);
        mFragmentTitle.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitle.get(position);
    }

    public Fragment getFragment(int position) {
        if (position < mFragments.size() && position >= 0) {
            return mFragments.get(position);
        }
        return null;
    }
    
}
然后,私有方法setupContents()如下所示:

mMainAdapter.addFragment(new FragmentOne(), getResources().getString(R.string.tab_albums));
mMainAdapter.addFragment(new FragmentTwo(), getResources().getString(R.string.tab_songs));
mMainAdapter.addFragment(new FragmentThree(), getResources().getString(R.string.tab_playlists));
// you can add as many fragments as you wish 
//just follow the previous method @mMainAdapter.addFragment
mPager.setAdapter(mMainAdapter);
mTabs.setupWithViewPager(mPager);
要获取当前片段,请执行以下操作:

public Fragment getCurrentFragment() {
        return mMainAdapter.getFragment(mPager.getCurrentItem());
    }
要检查当前片段是否为FragmentOne,请执行以下操作:

private boolean isFragmentOne() {
        return getCurrentFragment() instanceof FragmentOne;
    }

你能包括你的PagerAdapter吗?我想问题在于你处理添加片段的方式。如果你在ViewPager中使用TabLayout,为什么要使用FragmentTransaction?我添加了我的view pager类,我使用FragmentTransaction,因为我发现这就是在片段之间移动的方式,有没有更好的方法?我现在尝试了,没有效果k、 同样的问题:\片段加载了吗?您显示的片段与viewpager中的片段不同吗?它们加载了,主要片段和元素保留的片段不同,我认为问题实际上是
替换
方法检查此链接,如果有帮助,请返回报告,以便删除我的答案。