java - 在单击菜单项时使用 viewpager 运行新的片段实例
问题描述
我有一个基于 Android Studio 的“选项卡式活动”项目结构的工作片段代码。但是,由于我动态创建了填充空间的内容,因此标准滑动不适用,我想在从菜单中选择项目时在片段之间切换。
这是我的片段代码:
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;
}
}
创建时:
@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
?还是有更好的方法来实现我正在寻找的东西?
解决方案
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 );
}
其他部分与片段中的活动相同
推荐阅读
- android - 是否可以在已经位于堆栈顶部的活动之下启动一项活动
- expo - 错误 ITMS-90045:“无效的代码签名权利
- wordpress - 菜单不为一项添加子类别,但适用于其他 Wordpress
- spring - H2 数据库未创建或访问
- r - 如何按多个类别重组数据框
- mysql - 在 Laravel eloquent 中执行“findManyOrCreate”需要最少的资源是什么?
- python - 使 Python 内置流包装器不关闭底层 BytesIO
- sql - 无法覆盖 Hive 表中的分区
- html - 无法在 iframe 中打开 wordpress 网站
- python - “has:()”和“not:()”伪类在 BeautifulSoup 中使用时表现不同