2013-10-24 2 views
31

Я реализовал drawerlayout, который скользит справа, но не сдвигает активность, как это делает facebook (см. Ниже изображение). Как подтолкнуть текущую активность к правой стороне, когда пользователь нажимает кнопку opendrawer, как показано на рисунке выше. В настоящее время он появляется поверх активности и оставляет shadow.I действительно ценю любую помощь. Заранее спасибо.нажатие на действие справа при открытии выдвижного ящика

enter image description here

+1

Вот как работает [ящик андроида] (http://developer.android.com/design/patterns/navigation-drawer.html). Он не поддерживает скольжение, как вы этого хотите. Используйте [slidemenu] (https://github.com/jfeinstein10/SlidingMenu) для этого – sromku

+0

Могу ли я встроить его в горизонтальное прокрутку, а затем поместить его в папку drawerlayout? – jason

ответ

7

Чтобы ответить на ваш вопрос. DrawerLayout ведет себя как ожидалось.

Вы можете использовать Slidingmenu (или Umano) в сочетании с DrawerLayout (я).

Наконец, в отношении того, что вы хотите (и что делает Facebook), Google сам не хочет, чтобы вы это делали. Они хотят, чтобы использовать выдвижной ящик так, как они используют его в Google Music (например)

Контакт Google сказал именно это мне:

  • Навигационная ящик должна следовать новому guidelines и должна be implemented с использованием DrawerLayout и ActionBarDrawerToggle.
  • Навигационный ящик не должен перемещать панель действия и должен отображаться как надпись над содержимым экрана.
  • Навигационный ящик должен содержать только первичные навигационные элементы. Избегайте отображения элементов в навигационном ящике, которые обычно помещаются в панель действий, например «Настройки» или «Поиск». Blockquote

Так что не делать то, что делает Facebook. (Это хороший совет в любом другом контексте) :)

19

Это не рекомендуется, но вы можете переместить макет программно:

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

Хотя нет по умолчанию способ не скользить активности наряду с навигацией ящик можно сделать с помощью кода. Как было предложено в приведенном выше ответе mick88, следующий фрагмент кода из моего проекта.

мой 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> 

сейчас в деятельности

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); 

    } 

} 
+2

намного лучше, чем добавление другой зависимости –

+0

Спасибо за помощь! Я знал, что это возможно, без использования библиотеки :) –

+0

Отлично работает, спасибо :) – Kartheek

2

Это действительно полезно. Поместите этот фрагмент в 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 
}; 
0

OP получил ответ. Но для кого-то, кто хочет этого эффекта, можно использовать SlidingPaneLayout. Он предназначен для этой цели.

В файле 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 ****************************--> 

Есть две панели, справа и слева, склеиваются и, таким образом, двигаться вместе. Для меня левая панель является главной панелью, а справа скрывается значок переключения, чтобы отобразить ее. (Вид с идентификатором appBarSearchIcon).

Помните, что есть один ViewGroup имени, SlidingPaneLayout, что есть только два ребенка, The Left и правой.

И важную роль в деятельности:

 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(); 
      } 
     }); 

Закрытие правой панели осуществляется с помощью API, так же, как панель навигации.

Смежные вопросы