我有一个应用程序,其中有几个片段,其中一些需要动态添加或删除。所以我从两个片段开始。登录后,我删除了1个片段,再添加2到3个片段。根据其他动作的不同,这在应用程序的生命周期中可能会有所不同。
每个片段出现在一个带有标题的选项卡中。
我的主要活动布局如下所示;
<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:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="net.kaisersmith.whereami.MainActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/appbar_padding_top"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay">
</android.support.v7.widget.Toolbar>
<android.support.design.widget.TabLayout
android:id="@+id/sliding_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="scrollable" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
我用的是 FragmentPagerAdapter
我可以添加碎片。但当我删除他们似乎工作正常,但不是。选项卡标题是正确的,但是当我尝试移动到另一个选项卡时,会出现异常。例外情况是;
Java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(android.support.v4.app.Fragment)' on a null object reference
at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:876)
at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1175)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:608)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:570)
at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:551)
at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2008)
at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1025)
从我的页面查看器中提取
public class SectionsPagerAdapter extends FragmentPagerAdapter {
...
public void addFragment(Fragment frag, String title)
{
if (!this.fragments.contains(frag))
{
this.fragments.add(frag);
}
this.notifyDataSetChanged();
}
...
public void removeFragment(String title)
{
Fragment frag = findFragmentByTitle(title);
if (frag != null)
{
this.fragments.remove(frag);
//String tag = this.fragments.get(loc).getTag();
//Fragment fragment = this.getFragmentManager().findFragmentByTag(tag);
if(frag != null)
this.getFragmentManager().beginTransaction().remove(frag).commit();
}
}
它正从我的主要活动中被召唤;
mSectionsPagerAdapter.addFragment(new LoginFragment(),"Sign in");
mSectionsPagerAdapter.removeFragment("Logout");
mSectionsPagerAdapter.notifyDataSetChanged();
我在网上看过很多例子,但大多数都太基本了,都有固定的片段,不会改变。或者,如何添加/删除片段的示例在其他方面不起作用。
隐藏片段和标签将是另一种选择,但据我所知,它是不可能隐藏在工具栏中
有什么想法吗?
3条答案
按热度按时间g9icjywg1#
在fragmenttransaction中使用replace方法添加和删除
使用我推荐的用户framelayout作为视图容器来添加和替换片段。
wz1wpwve2#
试着这样做:
vohkndzv3#
我满足了同样的期望,但我的代码不同。
这个
fragments
是一个片段数组。当我调试时,我发现fragment.mActivity
上FragmentPagerAdapter.instantiateItem()
为空。