如何将ViewPager限制在片段中而不是占据整个屏幕?

时间:2014-02-17 08:51:56

标签: android android-fragments android-viewpager master-detail

我正在处理的应用程序的布局是经典的双窗格主从细节布局。在左窗格菜单中,在右窗格中显示由于按下菜单项而显示的片段。其中一个菜单项启动ViewPager滑动结构。此ViewPager结构由ScreenSlideActivity和ScreenSlidePageFragment类组成。标准的第一个类包含一个指向ViewPager对象的指针,即使用getItem和getFragment等基本方法的适配器(ScreenSlidePagerAdapter)。

一切正常,但ViewPager占据了整个屏幕,而不是右侧面板。

问题:如何让ViewPager将自己限制在正确的面板上,而不是占据整个屏幕?

这是在生成主 - 详细信息模板项目时由Eclipse自动生成的two_pane的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:baselineAligned="false"
    android:divider="?android:attr/dividerHorizontal"
    android:orientation="horizontal"
    android:showDividers="middle"
    tools:context=".ItemListActivity" >

    <!--
    This layout is a two-pane layout for the Items
    master/detail flow. See res/values-large/refs.xml and
    res/values-sw600dp/refs.xml for an example of layout aliases
    that replace the single-pane version of the layout with
    this two-pane version.

    For more on layout aliases, see:
    http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
    -->

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/item_list"
        android:name="com.company.ItemListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        tools:layout="@android:layout/list_content" />

        <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dip"
        android:layout_marginRight="20dip"
        android:layout_marginTop="10dip"
        android:layout_marginBottom="20dip"
        android:src="@drawable/icon" />

    </LinearLayout>
    <FrameLayout
        android:id="@+id/item_detail_container"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3" />

</LinearLayout>

启动ViewPager的菜单项执行此操作:

Intent intent = new Intent(this, ScreenSlideNewActivity.class);
startActivity(intent);

我找到了来自an old post here的解决方案的提示,但这是基于已弃用的ActivityGroup(底部的解决方案)。

1 个答案:

答案 0 :(得分:2)

不推荐使用ActivityGroup或在其他活动中使用活动的任何其他方式。

您需要将ViewPager结构封装在Fragment中,而不是封装在Activity中。

从那里开始你的活动而不是用Intent开始你的活动,你只需用一个简单的

弹出你的片段代替你的R.id.item_detail_container
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
ScreenSlideNewFragment fragment = new ScreenSlideNewFragment();
transaction.replace(R.id.item_detail_container, fragment);
transaction.commit();

将活动转换为片段是直截了当的,因为生命周期非常相似。