Java 当从一个片段移动到另一个片段时,前者的元素会停留在屏幕上
所以我有一个主要的活动,它有一个表格和一个显示不同片段的浏览页面 当我使用Tablayout在片段之间移动时,一切都很好,但是如果我使用按钮打开片段,当返回到前一个片段时(通过按下取消按钮),我留下的片段元素会留在屏幕上(如图所示) 我尝试使用方法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
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中的片段不同吗?它们加载了,主要片段和元素保留的片段不同,我认为问题实际上是替换方法检查此链接,如果有帮助,请返回报告,以便删除我的答案。