当前位置: 首页 > 知识库问答 >
问题:

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

闽承望
2023-03-14

所以我得到了一个主活动,它有一个表格布局和一个视图页面来显示不同的片段。

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

我试图使用一个方法viewPager.setCurrentItem(0);在片段中从ft.replace(R.id.fragment_edit_reminder,new Main_Activity_fragment()).commit())的片段中返回主页,但它没有移回我的家庭片段(使用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 class edit_reminder_fragment extends Fragment implements View.OnClickListener {

    private Button cancelButton;

    public edit_reminder_fragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @return A new instance of fragment edit_reminder_fragment.
     */
    public static edit_reminder_fragment newInstance() {
        edit_reminder_fragment fragment = new edit_reminder_fragment();
        Bundle args = new Bundle();

        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {

        }
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void onClick(View view)//TODO: make a utility method for switching fragments on the main_activity_fragment(see note).
    {
        switch (view.getId()) {//recognizing what button was pushed

            case R.id.ButtonCancelReminder:
             //region
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                Main_Activity_fragment maf = new Main_Activity_fragment();
                ft.replace(R.id.fragment_edit_reminder, maf).commit();

                break;
            //endregion
        }

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_edit_reminder_fragment, container, false);

        cancelButton = view.findViewById(R.id.ButtonCancelReminder);
        cancelButton.setOnClickListener(this);

        return view;
    }
}

我的寻呼机适应类:

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个按钮(取消保存添加子提醒),这些按钮来自单击添加新提醒按钮时打开的片段(当单击第二个片段中的取消时,它会返回主页):

共有1个答案

闻人献
2023-03-14

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

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

然后在MainActivity的onCreate中,初始化以下内容:

mTabs = (TabLayout) findViewById(R.id.tabs);
mPager = (ViewPager) findViewById(R.id.view_pager);
mMainAdapter = new PagerAdapter( getSupportFragmentManager() );

setupContents();

然后私有方法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;
    }
 类似资料:
  • 这是我完整的logcat: 在Android.support.v4.app.backStackRecord.doaddop(backStackRecord.java:414)在Android.support.v4.app.backStackRecord.replace(backStackRecord.java:449)在Android.support.v4.app.backStackRecord.

  • 我试着从一个片段到主要片段。编译器不喜欢我的代码,但我不确定是什么问题。转换片段的最佳实践是什么? //这是我要导航到的主片段的xml 2019-07-12 17:49:45.091 959 4-9594/com.example.cribb E/AndroidRuntime:致命异常:主进程:com.example.cribb,PID:9594 Android.content.res.resour

  • 先生/女士,我想使用android JAVA将一个片段回调到另一个片段。我试图找到问题,但没有找到解决方案。若我使用接口,它会向活动发送回调响应,这是我不想要的。非常感谢。

  • 我已经完成了导航,现在进入第一个片段。在第一个片段中有两个按钮,我需要通过按下这些按钮来切换到一个新的活动。我不明白如何正确地实施它。我犯了一个错误。 代码,eror

  • 我需要一些暑期项目的帮助 这是我的事件片段 这是我的MyList片段 我正在使用RecyclerViewCardView显示事件。其想法是,用户可以单击每张卡片右侧的大加号,卡片将显示在MyList片段中。我想问一下,是否可以将一张卡直接从一个片段转移到另一个片段?而且,这两个片段都包含在同一个活动中,这使得它有点棘手(我还没有找到任何可用的解决方案)。 如果不可能,另一种方法是将CardView

  • 在我的中有5个片段(home、settings、newPost、notifications和profile)。 在中,我有一个,其中包含许多post视图,每个post都包含一个“open”按钮,该按钮应该打开一个。问题是,我只能在类和populateItemRows()方法中使用,所以当我不能使用... RecycerViewAdapter: