Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在ViewPager中启动新片段_Android_Android Fragments_Android Viewpager_Android Tablayout - Fatal编程技术网

Android 在ViewPager中启动新片段

Android 在ViewPager中启动新片段,android,android-fragments,android-viewpager,android-tablayout,Android,Android Fragments,Android Viewpager,Android Tablayout,我快要失去它了。任何能帮我解决这个问题的人都将永远得到大量的编码道具 我的主要活动中有一个包含3个选项卡的列表。每个选项卡都包含自己的片段(任务、日历、联系人)。在主活动中有一个FAB按钮,它位于所有片段的顶部,并根据我当前所在的选项卡执行特定的操作 我的主要问题是,当我在Tab1中,单击Fab时,我需要用另一个名为AddContact的片段替换Tasks片段 几个小时来我一直在研究如何解决这个问题,最后终于找到了一个来自 问题是,我不太明白他们是如何做到的 我的理解是,片段的交换应该由视图寻呼

我快要失去它了。任何能帮我解决这个问题的人都将永远得到大量的编码道具

我的主要活动中有一个包含3个选项卡的列表。每个选项卡都包含自己的片段(任务、日历、联系人)。在主活动中有一个FAB按钮,它位于所有片段的顶部,并根据我当前所在的选项卡执行特定的操作

我的主要问题是,当我在Tab1中,单击Fab时,我需要用另一个名为AddContact的片段替换Tasks片段

几个小时来我一直在研究如何解决这个问题,最后终于找到了一个来自

问题是,我不太明白他们是如何做到的

我的理解是,片段的交换应该由视图寻呼机适配器中的getItem方法来管理。在我的主要活动中,ViewPagerAdapter和buttonClicked操作之间应该存在一个侦听器,它告诉它执行

问题是我无法建立这个链接。我试过很多方法,但都没有成功。下面是我的MainActivity类和ViewPagerAdapter类。如果有人能向我解释如何在ViewPager中用AddContacts片段替换Tasks片段,我将不胜感激

主要活动:

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

    }
}}
public类MainActivity扩展了AppCompatActivity{
私有折叠工具栏布局折叠工具栏布局;
私人视页机视页机;
私有ArrayList片段=新ArrayList();
私有ArrayList titles=新ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
CollasingToolbarLayout=(CollasingToolbarLayout)findViewById(R.id.collasing\u工具栏);
设置支持操作栏(工具栏);
fragments.addAll(Arrays.asList(新任务()、新日历()、新联系人());
titles.addAll(Arrays.asList(getResources().getString)(R.string.fragment\u task\u title),
getResources().getString(R.string.fragment\u cal\u title),getResources().getString(R.string.fragment\u contacts\u title));
TabLayout TabLayout=(TabLayout)findViewById(R.id.tabs);
最终FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
viewPager=(viewPager)findViewById(R.id.container);
ViewPagerAdapter ViewPagerAdapter=新的ViewPagerAdapter(getSupportFragmentManager(),片段,标题);
viewPager.setAdapter(viewPagerAdapter);
viewPager.setCurrentItem(1);
tabLayout.setupWithViewPager(viewPager);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
fabAction();
}
});
}
公共行动{
int current=viewPager.getCurrentItem();
开关(电流){
案例0:{
//需要在这里以某种方式指示片段交换。通过侦听器?
打破
}
}
}}
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();
}
public类ViewPagerAdapter扩展了FragmentPagerAdapter{
阵列列表片段;
数组列表标题;
私有片段MFFragmentTPOS0;
public ViewPagerAdapter(FragmentManager格式、ArrayList片段、ArrayList标题){
超级(fm);
this.fragments=片段;
this.titles=标题;
}
@凌驾
公共片段getItem(int位置){
如果(位置==0)
{
if(MFFragmentAtPos0==null)
{
//在这里使用下面的侦听器处理片段的更改?但我没有掌握逻辑
//关于如何实施这一点。
}
}
返回碎片。获取(位置);
}
@凌驾
public int getCount(){
返回fragments.size();
}
@凌驾
公共字符序列getPageTitle(int位置){
返回标题。获取(位置);
}
//从课程中获取-允许VIEWPAGER在启动时更改其视图并附加新片段
@凌驾
public int getItemPosition(对象)
{
if(任务的对象实例&&MFFragmentAtPos0 AddContact的对象实例)
返回位置\无;
返回位置_不变;
}
//从课程中获取。一个监听器,但我不确定在何处以及如何实现它。在主要活动中应该在何处执行此操作
//GO?它如何与适配器通信?
公共接口FirstPageFragmentListener
{
void onSwitchToNextFragment();
}

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

从您的描述来看,听起来您并不是在实际更改片段,更像是在更新数据。如果是这样,请更新您的data并调用notifyDataSetChanged()无论是
FragmentPagerAdapter
还是
FragmentStatePagerAdapter
都不能很好地处理这种情况。我建议不要更改选项卡中的片段类型,或者使用。