Android 在FragmentPagerAdapter中交换碎片
我已经为三个片段实现了默认的片段寻呼机适配器。它工作正常,但我想要的是从这三个片段中的一个内部交换片段(不是从活动)。我试图搜索ans,但找不到它 编辑: 我正在使用带滑块的默认tablayout活动。我没有使用自定义fragmentPagerAdapter。在主要活动中实现了以下类Android 在FragmentPagerAdapter中交换碎片,android,fragment,fragmentpageradapter,Android,Fragment,Fragmentpageradapter,我已经为三个片段实现了默认的片段寻呼机适配器。它工作正常,但我想要的是从这三个片段中的一个内部交换片段(不是从活动)。我试图搜索ans,但找不到它 编辑: 我正在使用带滑块的默认tablayout活动。我没有使用自定义fragmentPagerAdapter。在主要活动中实现了以下类 public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(Fragm
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
return new FragmentTest1();
case 1:
return new FragmentTest2();
case 2:
return new FragmentTest3();
default:
return null;
}}
@Override
public int getCount() {
return 3;
}
main活动
下面给出了主要活动的创建方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_slider);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
}
碎片测试1
从FragmentTest1,我想转换到另一个动作片段
public class FragmentTest1 extends android.support.v4.app.Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.tab_log, container, false);
Button button = rootView.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
return rootView;
}
}
我想将单击事件转换为另一个片段…我记不起执行此操作的确切代码,但这是可能的! 如果您通过片段访问片段父级(应该是片段管理器?),然后告诉片段管理器切换到片段x
我记得不久前在一个应用程序中这样做了。。虽然不漂亮,但它很管用!(如果它能工作,那就不傻了……或者是吗?我有相同的实现,我有一个
ViewPagerFragment
,它使用ImageAdapter
在片段之间交换,这是一个ImageFragment
,所以基本上你需要一个适配器
查看页面片段:
public class ViewPagerFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_viewpager, container, false);
ButterKnife.bind(this, view);
mAdapter = new ImageAdapter(getChildFragmentManager(), yourObjects);
mViewPager.setAdapter(mAdapter);
return view;
}
public class ImageAdapter extends FragmentStatePagerAdapter {
private ArrayList<YourObject> mYourObjects;
public ImageAdapter(FragmentManager fm, ArrayList<YourObject> yourObjects) {
super(fm);
mYourObjects = yourObjects;
}
@Override
public Fragment getItem(int position) {
return new ImageFragment().newInstance(position, mYourObjects);
}
@Override
public int getCount() {
return mYourObjects.size();
}
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_image, container, false);
ButterKnife.bind(this, view);
mClickedImagePosition = getArguments().getInt(POSITION_KEY);
mYourObject = getArguments().getParcelableArrayList(YOUR_OBJECT_KEY);
// set your objects here
return view;
}
public ImageFragment newInstance(int position, ArrayList<YourObject> yourObjects) {
ImageFragment fragment = new ImageFragment();
Bundle bundle = new Bundle();
bundle.putInt(POSITION_KEY, position);
bundle.putParcelableArrayList(YOUR_OBJECT_KEY, yourObjects);
fragment.setArguments(bundle);
return fragment;
}
图像适配器:
public class ViewPagerFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_viewpager, container, false);
ButterKnife.bind(this, view);
mAdapter = new ImageAdapter(getChildFragmentManager(), yourObjects);
mViewPager.setAdapter(mAdapter);
return view;
}
public class ImageAdapter extends FragmentStatePagerAdapter {
private ArrayList<YourObject> mYourObjects;
public ImageAdapter(FragmentManager fm, ArrayList<YourObject> yourObjects) {
super(fm);
mYourObjects = yourObjects;
}
@Override
public Fragment getItem(int position) {
return new ImageFragment().newInstance(position, mYourObjects);
}
@Override
public int getCount() {
return mYourObjects.size();
}
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_image, container, false);
ButterKnife.bind(this, view);
mClickedImagePosition = getArguments().getInt(POSITION_KEY);
mYourObject = getArguments().getParcelableArrayList(YOUR_OBJECT_KEY);
// set your objects here
return view;
}
public ImageFragment newInstance(int position, ArrayList<YourObject> yourObjects) {
ImageFragment fragment = new ImageFragment();
Bundle bundle = new Bundle();
bundle.putInt(POSITION_KEY, position);
bundle.putParcelableArrayList(YOUR_OBJECT_KEY, yourObjects);
fragment.setArguments(bundle);
return fragment;
}
公共类ImageAdapter扩展FragmentStatePagerAdapter{
私人ArrayList mYourObjects;
公共图像适配器(FragmentManager fm,ArrayList yourObjects){
超级(fm);
mYourObjects=您的对象;
}
@凌驾
公共片段getItem(int位置){
返回新的ImageFragment().newInstance(位置,myourObject);
}
@凌驾
public int getCount(){
返回mYourObjects.size();
}
}
最后是图像片段:
public class ViewPagerFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_viewpager, container, false);
ButterKnife.bind(this, view);
mAdapter = new ImageAdapter(getChildFragmentManager(), yourObjects);
mViewPager.setAdapter(mAdapter);
return view;
}
public class ImageAdapter extends FragmentStatePagerAdapter {
private ArrayList<YourObject> mYourObjects;
public ImageAdapter(FragmentManager fm, ArrayList<YourObject> yourObjects) {
super(fm);
mYourObjects = yourObjects;
}
@Override
public Fragment getItem(int position) {
return new ImageFragment().newInstance(position, mYourObjects);
}
@Override
public int getCount() {
return mYourObjects.size();
}
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_image, container, false);
ButterKnife.bind(this, view);
mClickedImagePosition = getArguments().getInt(POSITION_KEY);
mYourObject = getArguments().getParcelableArrayList(YOUR_OBJECT_KEY);
// set your objects here
return view;
}
public ImageFragment newInstance(int position, ArrayList<YourObject> yourObjects) {
ImageFragment fragment = new ImageFragment();
Bundle bundle = new Bundle();
bundle.putInt(POSITION_KEY, position);
bundle.putParcelableArrayList(YOUR_OBJECT_KEY, yourObjects);
fragment.setArguments(bundle);
return fragment;
}
@覆盖
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u图像,容器,错误);
ButterKnife.bind(这个,视图);
mClickedImagePosition=getArguments().getInt(位置键);
mYourObject=getArguments().getParcelableArrayList(您的\u对象\u键);
//在此处设置对象
返回视图;
}
公共ImageFragment newInstance(int位置,ArrayList对象){
ImageFragment=新ImageFragment();
Bundle=新Bundle();
bundle.putInt(位置\键,位置);
bundle.putParcelableArrayList(您的\u对象\u键,您的对象);
fragment.setArguments(bundle);
返回片段;
}
我省略了一些样板代码,比如膨胀视图,但这会起作用。如果您有任何问题,请告诉我。在这种情况下,片段只能通过viewpager访问(据我所知),要使viewpager成为子片段,必须在MainActivity中使viewpager保持静态。
publicstaticviewpager-ViewPager代码>
访问寻呼机
ParentActivity.viewPager.arrow滚动(View.FOCUS\u RIGHT)代码>
行动
ParentActivity.viewPager.arrow滚动(View.FOCUS\u左)代码>
参考资料:
我试过了,但没用。我附上下面的代码<代码>最终碎片事务ft=getFragmentManager().beginTransaction();ft.replace(R.id.container,new AppList(),“Log”);ft.addToBackStack(空);ft.commit()代码>谢谢,但我正在使用tablayout活动。我更新了我的问题。我也会尝试你的ans。我没有太多时间,所以我对重新实施tablayout活动犹豫不决。@khan你是用viewpagertablayout设置tablayout的吗。setupWithViewPager(viewpager)
?@khan我想你不必感到沮丧,我正在尽我所能帮助你,你需要提供更多的代码,因为我会继续猜测,就像你的viewpager片段,你的适配器在哪里使用,以及单页片段。我真的很感谢你的帮助,我一点也不沮丧。如果我听起来很沮丧,我很抱歉。我再次更新了我的问题。请看一看。再次感谢您的帮助…@khan别担心:)我自己也有点苛刻:)我相信在您的情况下,当您执行mSectionsPagerAdapter=new SectionsPagerAdapter(getSupportFragmentManager())
您需要传递getChildFragmentManager()
而不是getSupportFragmentManager()
,因为在处理viewpager中的嵌套片段时,内部片段由viewpager管理,而不是由活动管理。