我有一个基于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)
很熟悉,但是,我不想触发该片段而不是将其应用于当前布局,而是希望触发该片段代码,以便它可以在布局之间进行更改-在这种情况下,更改为{{1} }或fragment_main
。
问题:
是否可以在类FragmentSecond
之外的public Fragment getItem(int position) {}
中运行代码?还是有更好的方法来实现我想要的?
答案 0 :(得分:0)
public Fragment getItem(int position) {
switch(position)
{
case 0:
FragmentMain tab1 = new FragmentMain ();
return tab1;
case 1:
FragmentSecond tab2 = new FragmentSecond ();
return tab2;
default:
return null;
}
我用它来切换片段
答案 1 :(得分:0)
XML:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:background="@color/colorPrimary"
app:tabGravity="fill"
app:tabIndicatorColor="@color/black"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/black"
app:tabTextAppearance="@style/buttonThemePrimaryHolo1"
app:tabTextColor="#fff" />
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/tabs">
</android.support.v4.view.ViewPager>
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
活动中:
TabLayout tabLayout;
ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_main );
viewPager = findViewById ( R.id.viewpager );
setupViewPager ( viewPager );
tabLayout = findViewById ( R.id.tabs );
tabLayout.setupWithViewPager ( viewPager );
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter ( getSupportFragmentManager () );
adapter.addFragment ( new Fragment1 (), "Fragment1 " );
adapter.addFragment ( new Fragment2 (), "Fragment2 " );
adapter.addFragment ( new Fragment3 (), "Fragment3 " );
adapter.addFragment ( new Fragment4 (), "Fragment4 " );
viewPager.setAdapter ( adapter );
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List <Fragment> mFragmentList = new ArrayList <> ();
private final List <String> mFragmentTitleList = new ArrayList <> ();
public ViewPagerAdapter(FragmentManager manager) {
super ( manager );
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get ( position );
}
@Override
public int getCount() {
return mFragmentList.size ();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add ( fragment );
mFragmentTitleList.add ( title );
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get ( position );
}
}
片段
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter ( getChildFragmentManager() );
adapter.addFragment ( new Fragment1 (), "Fragment1 " );
adapter.addFragment ( new Fragment2 (), "Fragment2 " );
adapter.addFragment ( new Fragment3 (), "Fragment3 " );
adapter.addFragment ( new Fragment4 (), "Fragment4 " );
viewPager.setAdapter ( adapter );
}
其他部分与片段中的活动相同