android-fragments - 带有 MVP 的 Android TabLayout 片段
问题描述
我正在实现一个 MVP 应用程序,其中视图是在活动中加载的片段。每个 Activity 有 1 个要显示的片段。我必须更改我的实现并添加现在将显示片段的 TabLayout。我尝试了将片段传递给适配器的不同方法,但都使我的应用程序崩溃并且我无法理解错误。我的最后一次尝试,我将片段的数组列表(现在为 1)传递给适配器。在基础上,我正在关注google samples MVP todo app,但我需要实现这个选项卡布局。拜托,这是我的主要项目,我到处找,这是我最后的手段。
public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Toolbar mHomeToolbar = (Toolbar) findViewById(R.id.toolbar); // Set to the corresponding Toolbar in the UI.
setSupportActionBar(mHomeToolbar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); // Set to the corresponding Drawer Layout in the UI.
ActionBarDrawerToggle mToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mHomeToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
mDrawerLayout.addDrawerListener(mToggle); // Set mToggle as Drawer's toggle button and listen to actions.
mToggle.syncState();
NavigationView mDrawerNavigationView = (NavigationView) findViewById(R.id.nav_view); // Set the corresponding Navigation View in the UI.
mDrawerNavigationView.setNavigationItemSelectedListener(this); // Add listener on Navigation's items.
HomeFragment homeFragment = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.Quests_Frame); // Set to corresponding Fragment View in the UI.
if (homeFragment == null) {
homeFragment = HomeFragment.newInstance();
FragmentLoader.loadFragmentInActivity(getSupportFragmentManager(), homeFragment, R.id.Quests_Frame); // Display fragment in Activity.
}
repo = QuestsRepository.getInstance(QuestsDataSource.getINSTANCE());
mHomePresenter = new HomePresenter(repo , homeFragment);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
TabPagerAdapter adapter = new TabPagerAdapter(getSupportFragmentManager());
adapter.addFragment(homeFragment);
viewPager.setAdapter(adapter);
}
适配器类:
public class TabPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final int tabCount = 3;
public TabPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
mFragmentList.get(position);
default:
return null;
}
}
public void addFragment(Fragment fragment) {
mFragmentList.add(fragment);
}
@Override
public int getCount() {
return tabCount;
}
}
解决方案
对于您想要实现的目标,您不会使用 FragmentLoader 类。删除它(仅用于选项卡活动)。和 getSupportFragmentManager 行。
在 Home Activity 中,你如何设置 tabLayout 和 Viewpager,就可以了。删除 addFragment 行。在 setAdapter 之后添加以下内容:
mTabLayout.setupWithViewPager(mViewPager);
在 tabPagerAdapter 中,只需在那里创建对象展示器和片段。在 getItem 方法中,案例 0,您可以:
HomeFragment homeFragment = HomeFragment.newInstance(); homePresenter = new HomePresenter(repo, homeFragment); 返回首页Fragment;
哦,在 TabPagerAdapter 中,您可以在那里传递您的 repo 参数来创建您的演示者。
我希望我很清楚。如果您有任何问题,请告诉我。
推荐阅读
- sql - Visual Studios 数据类型更改的问题
- python - 为什么我的代码不能访问 ENTER 或 STRAIGHT 文件夹或 .png 文件
- powershell - Power BI:延长通过 Get-PowerBIAccessToken 获取的访问令牌的过期时间
- c# - 如何在 Azure 函数 v2 中注入数据库上下文?
- python - python中的递减for循环
- java - 如何不允许类型推断并在方法调用上要求显式类型?
- angular - @angular-devkit/architect 没有导出成员 ArchitectHost
- android - 使用底部导航栏防止片段刷新
- python - 如何检查 7 00 和 18 00 之间的时间
- ruby-on-rails - 如何使用 ruby aws sdk 获取活跃的 lambda 工作人员的数量?