[英]Android - ViewPager is not showing the fragments
我在一個tablayout
使用tablayout,TabLayout有兩個片段:一個是顯示日歷,另一個是簡單的純文本,我可以正確切換選項卡而不會觸發任何錯誤,問題是內容(內部片段) )沒有顯示,他們只是“不在那里”!
我嘗試在StackoverFlow上查找具有相同問題的其他線程,但是大多數線程都面臨NPE(空指針異常)錯誤的問題,這不是我的情況。
我嘗試使用: getChildFragmentManager()
和getFragmentManager()
而不是getSupportFragmentManager()
請記住,我正在使用Nested fragments
(片段中的片段)
我正在使用AndroidHive的文檔,我之前使用過它,但是沒有嵌套的簡單片段,它完美地工作
我嘗試使用Layout Inspector工具。
問:我錯過了什么,我該怎么做才能讓它運行起來?!
到目前為止,這是我的代碼:
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);
}
}
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
。
我過去也遇到過類似的問題。 我解決它通過嵌套TabLayout
在ViewPager
,所看到的文件中 :
<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>
我設法通過使用名為SPager
的第三方庫解決了這個問題,這里是完整文檔的Github鏈接 。 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
綁定, SPager
所示:
myViewPager.addTabLayout(tabLayout);
我還應該提到SPager
與Kotlin兼容
我決定發帖,這可能對其他人有用,對於我的情況,這是一個臨時修復,直到有人回答這個帖子!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.