【问题标题】:Pass data from Activity to Fragment of ViewPager via FragmentPagerAdapter通过 FragmentPagerAdapter 将数据从 Activity 传递到 ViewPager 的 Fragment
【发布时间】:2018-01-11 04:57:05
【问题描述】:

如何通过FragmentPagerAdapter 将数据从Activity 发送到ViewPagerFragment

谢谢!

AppCompatActivity

public class UnitDetailsActivity extends AppCompatActivity {

  private ViewPager viewPager;

   @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_unit_details);


 viewPager = (android.support.v4.view.ViewPager)findViewById(R.id.container);

  // Getting unitID  via and pass it to Fragment ???
  int unitID = getIntent().getStringExtra("SelectedUnitDeviceId");
  // And how to pass it to Fragment?      

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {                
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        adapter = new ViewPagerUnitDetailsAdapter(this.getSupportFragmentManager());
        fragmentReportHauls = new FragmentReportHauls();
        fragmentReportsDowntime = new FragmentReportsDowntime();

        adapter.addFragment(fragmentReportHauls);
        adapter.addFragment(fragmentReportsDowntime);

        viewPager.setAdapter(adapter);

}
}

FragmentPagerAdapter

public class ViewPagerUnitDetailsAdapter extends FragmentPagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();

    public ViewPagerUnitDetailsAdapter (FragmentManager manager) {
        super(manager);
    }

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

    public void addFragment(Fragment fragment) {
        mFragmentList.add(fragment);
    }

    @Override
    public Fragment getItem(int position) {
        if(position == 0){
            // How to pass here unitID ???
            return FragmentReportHauls.newInstance(????);
        }
        else {
            return FragmentReportsDowntime.newInstance(???);
        }
    }

    @Override
    public CharSequence getPageTitle(int position) {
        if(position == 0){
            return FragmentReportHauls.PAGE_TITLE;
        }
        else {
            return FragmentReportsDowntime.PAGE_TITLE;
        }
    }
}

ViewPager 片段

public class FragmentReportHauls extends Fragment {

    public static final String PAGE_TITLE = "Shift";

    private final String unitID;

    public FragmentReportHauls() {
    }

    // Here I want to get unitID
    public static FragmentReportHauls newInstance(String unitID) {
        FragmentReportHauls fragment = new FragmentReportHauls();
        this.unitID = unitID;
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_fragment_report_hauls, container, false); 


        return view;
    }
}
}

【问题讨论】:

  • 您是否尝试过使用接口。 ?
  • 您想在滚动或特定片段期间传递关于哪个片段意味着的数据?为什么通过 FragmentPagerAdapter ?为了方便您使用界面。
  • 您可以像这样使用Yourfragment.newInstance(String xyz) 在片段的构造函数中简单地传递您想要的数据,或者您可以实现interface 回调以发送和接收数据。
  • 在视图寻呼机适配器中创建另一个构造函数并通过构造函数将数据传递给它,并从视图寻呼机适配器通过捆绑参数将数据发送到片段
  • @HemantParmar 我想将数据unitID 传递给两个片段。

标签: java android android-fragments android-activity


【解决方案1】:

这是一个示例,我通过 viewpager 适配器将一个 int 值从 Activity 发送到片段

 public class MyJobsHistoryServiceProviderPagerAdapter extends FragmentPagerAdapter {

    int type;

public MyJobsHistoryServiceProviderPagerAdapter(FragmentManager fm) {
    super(fm);
}

public MyJobsHistoryServiceProviderPagerAdapter(FragmentManager fm,int type) {
    super(fm);
    this.type=type;
   }

  @Override
public Fragment getItem(int position) {

    MyJobsHistoryFragment fragment = new MyJobsHistoryFragment();
    Bundle bundle = new Bundle();
    bundle.putInt(Constants.POSITION, status);
    bundle.putInt(Constants.TYPE,type);
    fragment.setArguments(bundle);

    return fragment;
}
}

设置 ViewPager 适配器

pagerAdapter = new MyJobsHistoryServiceProviderPagerAdapter(getSupportFragmentManager(), Constants.USER_TYPE_SERVICE_PROVIDER);
  mViewPager.setAdapter(pagerAdapter);

在片段中

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    status = getArguments().getInt(Constants.POSITION, 0);
    type = getArguments().getInt(Constants.TYPE, 0);
    return inflater.inflate(R.layout.fragment_myjobs_history, container, false);

}

【讨论】:

    【解决方案2】:

    好的。我找到了解决方案。

    AppCompatActivity

    public class UnitDetailsActivity extends AppCompatActivity {
    
      private ViewPager viewPager;
    
       @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_unit_details);
    
    
     viewPager = (android.support.v4.view.ViewPager)findViewById(R.id.container);
    
      // Getting unitID  via and pass it to Fragment ???
      int unitID = getIntent().getStringExtra("SelectedUnitDeviceId");
      // And how to pass it to Fragment?      
    
            viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {                
                }
    
                @Override
                public void onPageSelected(int position) {
    
                }
    
                @Override
                public void onPageScrollStateChanged(int state) {
    
                }
            });
    
            adapter = new ViewPagerUnitDetailsAdapter(this.getSupportFragmentManager());
            fragmentReportHauls = new FragmentReportHauls();
            fragmentReportsDowntime = new FragmentReportsDowntime();
    
            adapter.addFragment(fragmentReportHauls, unitID);
            adapter.addFragment(fragmentReportsDowntime, unitID);
    
            viewPager.setAdapter(adapter);
    
    }
    }
    

    FragmentPagerAdapter

    public class ViewPagerUnitDetailsAdapter extends FragmentPagerAdapter {
    
         private final String unitID;
    
        private final List<Fragment> mFragmentList = new ArrayList<>();
    
        public ViewPagerUnitDetailsAdapter (FragmentManager manager) {
            super(manager);
        }
    
        @Override
        public int getCount() {
            return mFragmentList.size();
        }
    
        public void addFragment(Fragment fragment, String unitID) {
            mFragmentList.add(fragment);
            this.unitID = unitID;
        }
    
        @Override
        public Fragment getItem(int position) {
            if(position == 0){           
                return FragmentReportHauls.newInstance(this.unitID);
            }
            else {
                return FragmentReportsDowntime.newInstance(this.unitID);
            }
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            if(position == 0){
                return FragmentReportHauls.PAGE_TITLE;
            }
            else {
                return FragmentReportsDowntime.PAGE_TITLE;
            }
        }
    }
    

    ViewPager 片段

    public class FragmentReportHauls extends Fragment {
    
        public static final String PAGE_TITLE = "Shift";
    
        private final String unitID;
    
        public FragmentReportHauls() {
        }
    
        // Here I want to get unitID
        public static FragmentReportHauls newInstance(String unitID) {
            FragmentReportHauls fragment = new FragmentReportHauls();
            this.unitID = unitID;
            return fragment;
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_fragment_report_hauls, container, false); 
    
    
            return view;
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 2021-01-07
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多