在ViewPager中启动新的Fragment

时间:2017-03-13 22:08:19

标签: android android-fragments android-viewpager android-tablayout

我即将失去它。任何可以帮助我解决这个问题的人都会被永久性的编码道具所吸引。

我的主要活动中有一个包含3个标签的Tablayout。每个选项卡都包含自己的片段(任务,日历,联系人)。主活动中有一个FAB按钮,它位于所有碎片之上,并根据我当前所处的标签执行特定操作。

我的主要问题是,当我在Tab1中并点击了Fab时,我需要用一个名为AddContact的不同片段替换任务片段。

我一直在寻找如何解决这个问题几个小时,并最终确定了this stack post的早期答案

问题是,我不太了解他们是如何做到的。

我的理解是,应该通过View Pager Adapter中的getItem方法管理片段的交换。并且ViewPagerAdapter和我的主要活动中的buttonClicked操作之间应该存在一个监听器,告诉它执行。

问题在于我无法建立此链接。我尝试过很多东西,但没有运气。下面我包括了我的MainActivity类和我的ViewPagerAdapter类。如果有人可以向我解释如何在ViewPager中使用AddContacts Fragment替换我的任务片段,我将非常感激

主要活动:

public class MainActivity extends AppCompatActivity {
private CollapsingToolbarLayout collapsingToolbarLayout;
private ViewPager viewPager;
private ArrayList<Fragment> fragments = new ArrayList<>();
private ArrayList<String> titles = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    collapsingToolbarLayout = (CollapsingToolbarLayout)findViewById(R.id.collapsing_toolbar);
    setSupportActionBar(toolbar);

    fragments.addAll(Arrays.asList(new Tasks(),new Calendar(),new Contacts()));
    titles.addAll(Arrays.asList(getResources().getString(R.string.fragment_task_title),
            getResources().getString(R.string.fragment_cal_title),getResources().getString(R.string.fragment_contacts_title)));
    TabLayout tabLayout = (TabLayout)findViewById(R.id.tabs);
    final FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab);

    viewPager = (ViewPager)findViewById(R.id.container);
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(),fragments,titles);
    viewPager.setAdapter(viewPagerAdapter);
    viewPager.setCurrentItem(1);

    tabLayout.setupWithViewPager(viewPager);

    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            fabAction();
        }
    });

}

public void fabAction(){
    int current = viewPager.getCurrentItem();

    switch (current){
        case 0:{
            //Need to indicate Fragment Swap here somehow. Through Listener?
            break;
        }

    }
}}

ViewPagerAdapter类:

public class ViewPagerAdapter extends FragmentPagerAdapter {
ArrayList<Fragment> fragments;
ArrayList<String> titles;
private Fragment mFragmentAtPos0;

public ViewPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments, ArrayList<String>titles) {
    super(fm);
    this.fragments = fragments;
    this.titles = titles;
}

@Override
public Fragment getItem(int position) {
    if (position == 0)
    {
        if (mFragmentAtPos0 == null)
        {
            //HANDLES THE CHANGING OF FRAGMENTS IN HERE USING THE LISTENER BELOW? BUT I'M NOT GRASPING THE LOGIC
            //ON HOW TO IMPLEMENT THIS.
        }
    }

    return fragments.get(position);
}

@Override
public int getCount() {
    return fragments.size();
}

@Override
public CharSequence getPageTitle(int position) {

    return titles.get(position);
}

//GOT FROM LESSON - ALLOWS VIEWPAGER TO CHANGE IT'S VIEW AND ATTACH NEW FRAGMENT WHEN LAUNCHED
@Override
public int getItemPosition(Object object)
{
    if (object instanceof Tasks && mFragmentAtPos0 instanceof AddContact)
        return POSITION_NONE;
    return POSITION_UNCHANGED;
}

//GOT FROM LESSON. A LISTENER BUT I'M NOT SURE WHERE AND HOW TO IMPLEMENT IT. WHERE IN THE MAIN ACTIVITY SHOULD THIS
//GO? HOW DOES IT COMMUNICATE BACK TO THE ADAPTER?
public interface FirstPageFragmentListener
{
    void onSwitchToNextFragment();
}

我所指的帖子或课程也来自5年前,所以我不知道是否有更简单的方法来实现这一点,在这种情况下我很乐意听到它。非常感谢。

0 个答案:

没有答案