我在fragemnt中使用tablayout
,TabLayout有两个片段:一个片段显示日历,另一个片段只是简单的纯文本,我可以正确地在两个标签之间切换而不会触发任何错误,问题是内容(内部片段)没有显示,它们只是“不存在”!
我尝试研究StackoverFlow上具有相同问题的其他线程,但是其中大多数线程都面临NPE(空指针异常)错误的问题,这不是我的情况。
我尝试使用:getChildFragmentManager()
和getFragmentManager()
而不是getSupportFragmentManager()
请记住,我正在使用Nested fragments
(片段中的片段)
我正在使用AndroidHive的文档,但以前使用过,但是由于没有嵌套一个简单片段,所以效果很好
我尝试使用布局检查器工具。
问::我缺少什么,应该怎么做才能启动和运行?!
到目前为止,这是我的代码:
XML:MainFragment
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
app:tabGravity="fill"/>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_height="match_parent"
android:layout_width="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v4.view.ViewPager>
</LinearLayout>
XML:日历片段
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:animateLayoutChanges="true"
android:id="@+id/main_content"
tools:context=".Tabs.CalendarTab">
<com.github.sundeepk.compactcalendarview.CompactCalendarView
android:visibility="visible"
android:id="@+id/compact_calendar"
android:layout_width="match_parent"
android:paddingRight="6dp"
android:paddingLeft="6dp"
android:layout_height="250dp"
app:compactCalendarTargetHeight="250dp"
app:compactCalendarTextSize="12sp"
app:compactCalendarBackgroundColor="@color/colorWhite"
app:compactCalendarTextColor="@color/colorDarkGrey"
app:compactCalendarCurrentDayBackgroundColor="@color/color13"
app:compactCalendarMultiEventIndicatorColor="@color/textColor2"
app:compactCalendarShouldSelectFirstDayOfMonthOnScroll="true"
app:compactCalendarCurrentDayIndicatorStyle="fill_large_indicator"/>
</RelativeLayout>
XML列表片段
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="250dp"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".Tabs.FullListTab">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="You Are In Tab 2"
android:id="@+id/textView"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
MainFragment JAVA
private TabLayout tabLayout;
private ViewPager viewPager;
//onCreate Method:
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) view.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
/*** end onCreate() ***/
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.addFragment(new CalendarTab(), "Calendar");
adapter.addFragment(new FullListTab(), "List");
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);
}
}
答案 0 :(得分:2)
adapter.addFragment(new CalendarTab(), "Calendar"); adapter.addFragment(new FullListTab(), "List"); ... class ViewPagerAdapter extends FragmentPagerAdapter { private final List<Fragment> mFragmentList = new ArrayList<>();
不要这样做, 永远 。这可能会导致非常神秘的错误。您必须从getItem()
内部而不是其他任何地方返回新的Fragment实例。
关于您的实际问题,
XML: MainFragment <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content">
将其更改为match_parent
,match_parent
。
答案 1 :(得分:1)
我过去也有类似的问题。我通过将TabLayout
嵌套在ViewPager
中来解决它,如in the documentation所示:
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_height="match_parent"
android:layout_width="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
app:tabGravity="fill"/>
</android.support.v4.view.ViewPager>
</LinearLayout>
答案 2 :(得分:1)
我设法通过使用名为SPager
的第三方库来解决此问题,这里是Github link的完整文档。 SPager
不使用适配器,实现起来更容易,更快捷。
但是我仍然在寻找另一种无需使用第三方库的方式
这是我实际上所做的(如他们的Github中所述):
实施
implementation 'com.github.alfianyusufabdullah:spager:1.2.0'
在XML布局文件中
<com.alfianyusufabdullah.SPager
android:id="@+id/mPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在我的JAVA课堂上
private SPager myViewPager;
//...
myViewPager = view.findViewById(R.id.mPager);
//...
myViewPager.initFragmentManager(getChildFragmentManager());
myViewPager.addPages("Inner fragment 1", new IFragOne());
myViewPager.addPages("Inner fragment 2", new IFragTwo());
myViewPager.build();
如果,您正在使用tabLayout
,则可以将其与SPager
绑定,如下所示:
myViewPager.addTabLayout(tabLayout);
我还应该提到SPager
与 科特林
我决定发布帖子,这可能对其他人有用,对于我来说,这是一个临时解决方法,直到有人回答了这个问题!