我有一个内容视图是片段的活动,我在此活动中添加了viewpager和viewpagerindicator。我为寻呼机创建了一个FragmentPagerAdapter,该适配器构造了三个片段以显示三个选项卡。但是当我运行该项目时,只能看到寻呼机标题出现。为什么这三个片段不显示?
我在创建活动生命周期时创建了寻呼机和指示器。
public class BrowserActivity extends SherlockFragmentActivity
implements ReposFragment.OnFileSelectedListener, StarredFragment.OnStarredFileSelectedListener, OnBackStackChangedListener {
super.onCreate(savedInstanceState);
setContentView(R.layout.seadroid_main);
adapter = new SeafileTabsAdapter(getSupportFragmentManager());
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);
TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
indicator.setViewPager(pager);
indicator.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(final int position) {
currentPosition = position;
supportInvalidateOptionsMenu();
disableUpButton();
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
});
适配器构造三个片段以显示三个选项卡视图
class SeafileTabsAdapter extends FragmentPagerAdapter implements
IconPagerAdapter {
public SeafileTabsAdapter(FragmentManager fm) {
super(fm);
}
private ReposFragment reposFragment = null;
private ActivitiesFragment activitieFragment = null;
private StarredFragment starredFragment = null;
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
if (reposFragment == null) {
reposFragment = new ReposFragment();
}
return reposFragment;
case 1:
if (starredFragment == null) {
starredFragment = new StarredFragment();
}
return starredFragment;
case 2:
if (activitieFragment == null) {
activitieFragment = new ActivitiesFragment();
}
return activitieFragment;
default:
return new Fragment();
}
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getString(R.string.tabs_library).toUpperCase();
case 1:
return getString(R.string.tabs_starred).toUpperCase();
case 2:
return getString(R.string.tabs_activity).toUpperCase();
default:
return null;
}
}
@Override
public int getIconResId(int index) {
return ICONS[index];
}
@Override
public int getCount() {
return ICONS.length;
}
}
布局文件seadroid_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.viewpagerindicator.TabPageIndicator
android:id="@+id/indicator"
android:layout_height="wrap_content"
android:layout_width="match_parent"
/>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
更新
我发现ViewPager教程使用LineaLayout作为根容器。所以有必要在这里将FragmentLayout更改为LineaLayout。当我更改为LineaLayout时,应用程序崩溃,日志为
12-02 07:01:13.636: E/AndroidRuntime(3807): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.seafile.seadroid2/com.seafile.seadroid2.ui.activity.BrowserActivity}: android.view.InflateException: Binary XML file line #21: Error inflating class LineaLayout
12-02 07:01:13.636: E/AndroidRuntime(3807):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
答案 0 :(得分:0)
尝试将XML中的根视图切换为LinearLayout。现在你正在使用FrameLayout,它具有将你的ViewPager置于TabPageIndicator之上的效果。此外,由于layout_height为0,因此您不会看到您的片段。我怀疑这是你的问题 - 显然你打算使用LinearLayout。
另外,请注意SeafileTabsAdapter类。现在它正在缓存片段,当我开始使用FragmentPagerAdapter时,这对我来说似乎合乎逻辑。但是,FragmentPagerAdapter也会缓存碎片,因此使用此方法可能会导致内存泄漏。如果你想直接调用getItem,而不是每次都自动创建一个片段,那么你可以先调用findFragmentByTag来查看片段是否存在。可以在源代码中找到Android用于标记的字符串,也可以在此SO问题中找到: Replace Fragment inside a ViewPager
希望这会有所帮助。我对你的代码仍然有点困惑,因为在描述中你说你在一个片段中有一个ViewPager,但是发布的代码似乎在你的活动中显示了一个ViewPager。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.viewpagerindicator.TabPageIndicator
android:id="@+id/indicator"
android:layout_height="wrap_content"
android:layout_width="match_parent"
/>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
</LinearLayout>
我希望这能在你的评论中回答你的问题。如果您反而意味着sherlock代码期望FrameLayout作为根视图(这会让我感到惊讶,虽然我还没有使用它),那么您需要做的就是将LinearLayout作为您拥有的FrameLayout的子项放在上面之前。这有意义吗?