为什么片段不会出现在ViewPagerIndicator中

时间:2014-12-02 03:38:58

标签: android android-fragments android-viewpager viewpagerindicator

我有一个内容视图是片段的活动,我在此活动中添加了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)

1 个答案:

答案 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的子项放在上面之前。这有意义吗?