android两个导航抽屉动画

时间:2015-11-16 15:56:37

标签: android animation navigation toggle drawer

我正在尝试在我的应用中制作两个导航抽屉。它基于DrawerLayout Double Drawer (Left and Right Drawers simultaneously)。除了抽屉切换的动画之外,一切似乎都很好。我只想要左边的一个,它只适用于两者或两者都不适用。非常感谢!

以下是代码:

MainActivity(ProductsUI)

protected RecyclerView mProductsRecyclerView;
protected SearchView mSearchView;
protected ListView mRightDrawerView, mLeftDrawerView;
protected DrawerLayout mDrawerLayout;
protected ActionBarDrawerToggle mDrawerToggle;

@Override
protected void onCreate( Bundle savedInstanceState )
{
    super.onCreate(savedInstanceState);

    // Especificamos el layout 'products_grid.xml'
    setContentView( R.layout.products_grid );

    initActionBar();
    initRecyclerView();
    initNavigationDrawers();
}
private void initActionBar()
{
    // Cargamos la action bar personalizada
    getSupportActionBar().setDisplayOptions( ActionBar.DISPLAY_SHOW_CUSTOM );
    getSupportActionBar().setCustomView(R.layout.action_bar);

    // Cargamos el boton del left drawer
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
}
private void initNavigationDrawers()
{
    mRightDrawerView = ( ListView )findViewById( R.id.rightlistviewdrawer );
    mLeftDrawerView  = ( ListView )findViewById( R.id.leftlistviewdrawer );
    mDrawerLayout    = ( DrawerLayout )findViewById( R.id.drawer_layout );

    mRightDrawerView.setAdapter( menuAdapter );
    mLeftDrawerView.setAdapter( menuAdapter );

    initDrawerToggle();

    mDrawerLayout.setDrawerListener( mDrawerToggle );
}
private void initDrawerToggle()
{
    // Inicializamos el navigation drawer y el control en la action bar
    mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, R.string.open_drawer, R.string.close_drawer )
    {
        // Called when a drawer has settled in a completely closed state
        @Override
        public void onDrawerClosed( View drawerView )
        {
            if( drawerView.equals( mLeftDrawerView ) )
            {
                getSupportActionBar().setTitle( getTitle() );
                supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                mDrawerToggle.syncState();
            }
        }

        // Called when a drawer has settled in a completely open state
        @Override
        public void onDrawerOpened( View drawerView )
        {
            if( drawerView.equals( mLeftDrawerView ) )
            {
                getSupportActionBar().setTitle( getString( R.string.app_name ) );
                supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                mDrawerToggle.syncState();
            }
        }

        // Avoid normal indicator glyph behaviour. This is to avoid glyph movement when opening the right drawer
        @Override
        public void onDrawerSlide( View drawerView, float slideOffset )
        {
            if( drawerView == mLeftDrawerView ) // THIS DOES NOT WORK (neither with equals())
                super.onDrawerSlide( drawerView, slideOffset );
        }
    };
}
@Override
protected void onPostCreate( Bundle savedInstanceState )
{
    super.onPostCreate( savedInstanceState );
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged( Configuration newConfig )
{
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected( MenuItem item )
{
    if ( mDrawerToggle.onOptionsItemSelected( item ) )
        return true;

    // Funcionamiento del right drawer
    if ( item.getItemId() == R.id.right_drawer ) {
        if ( mDrawerLayout.isDrawerOpen( Gravity.RIGHT ) )
            mDrawerLayout.closeDrawer( Gravity.RIGHT );

        else
            mDrawerLayout.openDrawer( Gravity.RIGHT );

        return true;
    }

    return super.onOptionsItemSelected( item );
}

这是products_grid.xml

<?xml version="1.0" encoding="utf-8"?>

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ProductsUI"
        android:background="@color/backgroundColorDark">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/grid_recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginBottom="10dp"
            android:layout_marginTop="20dp"
            android:scrollbars="none"/>

    </LinearLayout>

    <include layout="@layout/right_navigation_drawer"/>

    <include layout="@layout/left_navigation_drawer"/>

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

这是正确的导航抽屉文件夹

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:layout_gravity="end">

    <ListView
        android:id="@+id/rightlistviewdrawer"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:choiceMode="singleChoice"
        android:dividerHeight="0dp"
        android:background="@color/backgroundColorDark"/>

</LinearLayout> 

最后左侧导航抽屉

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:layout_gravity="start">

    <ListView
        android:id="@+id/leftlistviewdrawer"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:choiceMode="singleChoice"
        android:dividerHeight="0dp"
        android:background="@color/backgroundColorDark"/>

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

您的if语句无法正常工作,因为您所包含的抽屉布局中的根ViewLinearLayout s,而View s您正在查找并且在您的代码中分配给mLeftDrawerViewmRightDrawerView的是ListView。各种侦听器方法中的drawerView将是包含的抽屉布局的根View;即LinearLayout s。这意味着drawerView == mLeftDrawerView永远不会成真。

解决方案是为XML中的LinearLayout分配ID,在代码中找到这些View,并将其分配给mLeftDrawerViewmRightDrawerView

例如,您的左抽屉布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/leftdrawer"
    ...
    >

    <ListView
        android:id="@+id/leftlistviewdrawer"
        ...
        />

</LinearLayout>

您可以使用正确的抽屉布局执行相同的操作。然后,在初始化中:

private void initNavigationDrawers() {
    mRightDrawerView = ( LinearLayout )findViewById( R.id.rightdrawer );
    mLeftDrawerView  = ( LinearLayout )findViewById( R.id.leftdrawer );
    mRightDrawerListView = ( ListView )findViewById( R.id.rightlistviewdrawer );
    mLeftDrawerListView  = ( ListView )findViewById( R.id.leftlistviewdrawer );

    mDrawerLayout = ( DrawerLayout )findViewById( R.id.drawer_layout );

    mRightDrawerListView.setAdapter( menuAdapter );
    mLeftDrawerListView.setAdapter( menuAdapter );

    initDrawerToggle();

    mDrawerLayout.setDrawerListener( mDrawerToggle );
}

您还需要将mLeftDrawerViewmRightDrawerView的声明类型更改为LinearLayout