打开抽屉时右侧推动活动

我已经实现了从右侧滑动的drawerlayout,但是它并没有像facebook那样移动这个活动(见下图)。 当用户点击opendrawerbutton时,如何将当前的活动推到右侧,如上图所示。目前它出现在活动的顶部,并放弃阴影。我真的很感激任何帮助。 提前致谢。

在这里输入图像说明

Solutions Collecting From Web of "打开抽屉时右侧推动活动"

我不认为你可以用DrawerLayout来实现它,但是可以使用SlidingMenu , 这里的GitHub SlidingMenu 应该解释你所需要的

虽然没有默认的方式来与导航抽屉一起滑动活动,但我们可以通过代码来完成。 正如上面mick88的回答所build议的,下面是我的项目的代码片段。

我的profile.xml文件

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:facebook="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- Framelayout to display Fragments --> <RelativeLayout android:id="@+id/mainView" android:layout_width="match_parent" android:layout_height="match_parent" > </RelativeLayout> <!-- Listview to display slider menu --> <RelativeLayout android:id="@+id/drawerView" android:layout_width="240dp" android:layout_height="wrap_content" android:layout_gravity="start" > <ListView android:id="@+id/list_slidermenu" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/list_background" android:divider="@color/list_divider" android:dividerHeight="1dp" /> </RelativeLayout> </android.support.v4.widget.DrawerLayout> 

现在在Activity

 public class ProfileActivity extends ActionBarActivity { .... private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mDrawerToggle; RelativeLayout drawerView; RelativeLayout mainView; .... @Override protected void onCreate(Bundle savedInstanceState) { ............. // .............// drawerView = (RelativeLayout) findViewById(R.id.drawerView); mainView = (RelativeLayout) findViewById(R.id.mainView); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.app_name, R.string.app_name) { public void onDrawerClosed(View view) { supportInvalidateOptionsMenu(); } public void onDrawerOpened(View drawerView) { supportInvalidateOptionsMenu(); } @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, slideOffset); mainView.setTranslationX(slideOffset * drawerView.getWidth()); mDrawerLayout.bringChildToFront(drawerView); mDrawerLayout.requestLayout(); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); } } 

这不被推荐,但你可以编程移动你的布局:

 @Override public void onDrawerSlide(View drawerView, float offset) { View container = findViewById(R.id.container); container.setTranslationX(offset * drawerView.getWidth()); } 

回答你的问题。 DrawerLayout的行为如预期。

您可以使用Slidingmenu(或Umano )与DrawerLayout(我)。

最后,关于你想要什么(以及Facebook做什么),谷歌本身并不希望你这样做。 他们希望您在Google音乐中使用抽屉(例如)

Google的一位联系人对我说:

  • 导航抽屉应遵循新的指南,并应使用DrawerLayout和ActionBarDrawerToggle来实现 。
  • 导航抽屉不应该移动操作栏,并应该显示为屏幕内容上方的叠加层。
  • 导航抽屉只能包含主要的导航元素。 避免在导航抽屉中显示通常放置在操作栏中的项目,例如“设置”或“search”。 大段引用

所以不要做Facebook做的事情。 (这是在其他任何情况下的好build议):)

这真的很有帮助。 把这个片段放在你的MainActivity.java中

 ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, slideOffset); containerFrame.setTranslationX(slideOffset * drawerView.getWidth()); drawerLayout.bringChildToFront(drawerView); drawerLayout.requestLayout(); //below line used to remove shadow of drawer drawerLayout.setScrimColor(Color.TRANSPARENT); }//this method helps you to aside menu drawer }; 

OP得到了答案。 但是对于想要这种效果的其他人,可以使用SlidingPaneLayout 。 它是为此目的而devise的。

在XML文件中:

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@id/mainFrame" style="@style/MP.mainFrame" > <!--****************************Right Pane ****************************--> <LinearLayout style="@style/searchLayout"> <android.support.v4.widget.NestedScrollView style="@style/MP"> <LinearLayout style="@style/MP.verticalLinearLayout"> </LinearLayout> </android.support.v4.widget.NestedScrollView> </LinearLayout> <!--****************************Right Pane ****************************--> <!--****************************Left Pane ****************************--> <FrameLayout style="@style/MP.mainLayout"> <LinearLayout android:id="@id/fragmentContainer" style="@style/MP.fragmentContainer"/> <android.support.v7.widget.Toolbar style="@style/toolbar"> <ir.tooskar.excomponents.ExtendedTextView android:id="@id/appTitle" style="@style/WC.appTitle"/> <ir.tooskar.excomponents.ExtendedTextView android:id="@id/appBarSearchIcon" style="@style/WC.appBarSearchIcon"/> </android.support.v7.widget.Toolbar> </FrameLayout> <!--****************************Left Pane ****************************--> 

有两个窗格,左右,粘在一起,因此一起移动。 对我来说,左侧窗格是主窗格,右侧隐藏着切换图标以显示它。 (id为appBarSearchIcon的视图)。

请记住,有一个名为SlidingPaneLayout的视图组只有两个孩子, 左边右边

活动中的重要部分:

  slidingPaneLayout = (SlidingPaneLayout) findViewById(R.id.mainFrame); // Sets a color for covering left pane(Main Pane) slidingPaneLayout.setSliderFadeColor(ContextCompat.getColor(context, R.color.searchPaneFadeColor)); // The listener for Opening the Right pane(Hidden pane) findViewById(R.id.appBarSearchIcon).setOnClickListener(new OnClickListener() { @Override public void onClick(View view){ slidingPaneLayout.openPane(); } }); 

正如导航抽屉一样,closures右窗格由API完成。