У меня есть рабочий фрагмент кода, основанный на структуре проекта Android Studio "Tabbed Activity". Однако, поскольку я динамически создавал контент, заполняющий пространство, стандартное перелистывание неприменимо, и я хотел бы переключаться между фрагментами при выборе элемента из меню.
Это мой код для фрагментов:
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
public static class PlaceholderFragment extends Fragment {
private static final String ARG_SECTION_NUMBER = "section_number";
public PlaceholderFragment() {
}
public static PlaceholderFragment newInstance(int sectionNumber)
{
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup containerPager,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, containerPager, false);
TextView textView = (TextView) rootView.findViewById(R.id.temporary);
textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
return rootView;
}
}
// FRAGMENT 1 - First. This one should have a blank layout!
public static class FragmentFirst extends Fragment {
public static FragmentFirst newInstance(int sectionNumber) {
FragmentFirst fragment = new FragmentFirst();
return fragment;
}
public FragmentFirst() { }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup containerPager,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_first, containerPager, false);
return rootView;
}
}
// FRAGMENT 2 - Second
public static class FragmentSecond extends Fragment {
public static FragmentSecond newInstance(int sectionNumber) {
FragmentSecond fragment = new FragmentSecond();
return fragment;
}
public FragmentSecond() { }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup containerPager,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, containerPager, false);
return rootView;
}
}
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
switch (position) {
case 0:
return FragmentFirst.newInstance(position + 1);
case 1:
return FragmentSecond.newInstance(position + 1);
default:
//assume you only have 2
throw new IllegalArgumentException();
}
}
@Override
public int getCount() {
// Show 2 total pages.
return 2;
}
}
OnCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
ViewPager mViewPager = (ViewPager) findViewById(R.id.containerPager);
mViewPager.setAdapter(mSectionsPagerAdapter);
}
Кроме того, вот код для выбора конкретного пункта меню:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.change_fragment)
{
// Can I run/initiate the code at public Fragment getItem(int position) {}
// from here?
// The lines below do work, but rather than running the fragments' code,
// it simply overlaps with the current content.
ViewPager mViewPager = (ViewPager) findViewById(R.id.containerPager);
mViewPager.setCurrentItem(1, true);
return true;
}
return super.onOptionsItemSelected(item);
}
Я знаком с mViewPager.setCurrentItem(position, true)
, однако вместо того, чтобы применять фрагмент поверх текущего макета, я хотел бы вызвать код фрагмента, чтобы он мог меняться между макетами - в данном случае, на fragment_main
или FragmentSecond
.
Проблема:
Можно ли запустить код в public Fragment getItem(int position) {}
вне его класса SectionsPagerAdapter extends FragmentPagerAdapter
? Или есть лучший способ добиться того, что я ищу?