移动主要内容以显示抽屉

时间:2015-11-07 20:24:33

标签: android

我想创建一个导航抽屉效果,但不是从左边滑出抽屉,它必须是"后面"主视图,所以滑动的项目是视图本身(即向右) - 抽屉根本不移动,但是显示"通过滑动主视图。手指轻扫(并点击汉堡包图标)动作与抽屉相同,只是显示效果不同。

主视图的移动方式与此处可实现的方式相同

How to move main content with Drawer Layout left side

但在我的情况下,我想要"抽屉"静止地留在主视图下面。

我通过叠加视图和使抽屉透明来达到预期效果 - 当然这意味着抽屉不再用于导航;只是为了效果。使用上面链接中的代码

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/whole_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- everything here is now the new "drawer" -->
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="BOO I am hiding!"
    android:id="@+id/tv2"
    android:layout_gravity="left|top" />
<!-- /everything here is now the new "drawer" -->

<android.support.v4.widget.DrawerLayout

android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<!-- The This is the main content frame -->
<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimary">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="MOOOOOO!"
        android:id="@+id/textView"
        android:layout_gravity="left|top" />
</FrameLayout>


<!-- The see-through navigation drawer -->
<RelativeLayout
    android:layout_width="280dp"
    android:layout_height="match_parent"
    android:id="@+id/left_drawer"
    android:clickable="false"
    android:background="@drawable/transparent_bg" <!-- #00FFFFFF -->
    android:layout_gravity="start">

</RelativeLayout>

</android.support.v4.widget.DrawerLayout>

一切都很完美,除了当&#34;抽屉&#34;时,id / tv2(或该层上的其他项目)不可点击。打开了。

我试过了:

1) 使上面的布局不可点击(drawer_layout,content_frame和left_drawer setClickable(false)没有效果)。

2) 上面链接中的代码移动了X轴上的content_frame而不是drawyer_layout - 我尝试移动drawer_layout而不是框架 - 这不能正常工作,因为您无法再点击最右边再次关闭抽屉。

3) 将drawer_layout的android:layout_width更改为fill_parent,但这仍然是一个问题,因为它不是被移开的层。

我的猜测是DrawerLayout(android.support.v4.widget.DrawerLayout)并不意味着高于另一个布局,我可能需要创建自己的抽屉以达到预期的效果 - 任何想法或建议都会很棒。

1 个答案:

答案 0 :(得分:6)

我相信我已经找到了一个相对简单的解决方案。以下DrawerLayout设置非常标准 - 即内容ViewGroup首先,抽屉View最后,使用标准属性等。此外,一种类似于您发布的链接中显示的技术用于使用抽屉滑动内容。

示例中的技巧是抽屉本身的设置。我们将使用两个嵌套ViewGroup s - 外部的是常规滑动抽屉View;内部,实际抽屉内容ViewGroup。然后,我们使用ViewGroup(在我们的示例中为DrawerListener)将内容ActionBarDrawerToggle与抽屉滑动方向相对滑动,使抽屉显示为静态在左侧。

示例DrawerLayoutmain.xml。请注意drawer_container ViewGroup上设置的标准抽屉属性:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000">

    <FrameLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#cccccc" />

    <FrameLayout
        android:id="@+id/drawer_container"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start">

        <LinearLayout
            android:id="@+id/drawer_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/image"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:src="@drawable/ic_launcher" />

            ...

        </LinearLayout>

    </FrameLayout>

</android.support.v4.widget.DrawerLayout>

此示例Activity显示了我们需要添加到常规导航抽屉设置的额外几行。除了获取对View的引用之外,主要位在ActionBarDrawerToggle&#39; onDrawerSlide()方法中:

public class MainActivity extends Activity  {

    ActionBarDrawerToggle toggle;
    DrawerLayout drawerLayout;
    View drawerContainer;
    View drawerContent;
    View mainContent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawerContainer = findViewById(R.id.drawer_container);
        drawerContent = findViewById(R.id.drawer_content);
        mainContent = findViewById(R.id.main_content);

        toggle = new ActionBarDrawerToggle(...) {
            @Override
            public void onDrawerSlide(View drawer, float slideOffset) {
                super.onDrawerSlide(drawer, slideOffset);

                drawerContent.setTranslationX(drawerContainer.getWidth() * (1 - slideOffset));
                mainContent.setTranslationX(drawerContainer.getWidth() * slideOffset);
            }
        };

        drawerLayout.addDrawerListener(toggle);
    }
}

请注意,DrawerLayout会在Activity重新创建期间恢复抽屉打开/关闭状态,因此您可能需要考虑这一点,例如,在方向更改期间等等。