2014-10-20 66 views
33

Tôi đang sử dụng android.support.v7.widget.Toolbar với android.support.v4.widget.DrawerLayout. Nó hoạt động tốt, biểu tượng Burger được hiển thị khi Ngăn Điều hướng được đóng lại, và biểu tượng Mũi tên sẽ hiển thị khi Ngăn mở đang mở. Tôi muốn vô hiệu hóa ngăn kéo và tạo hiệu ứng biểu tượng Burger vào Mũi tên trên một số sự kiện trong ứng dụng. Tôi đã cố gắng để thiết lập chế độ khóa để đóng cửa, nhưng v7.app.ActionBarDrawerToggle vẫn hiển thị Burger và nó sẽ mở ngăn kéo.Làm thế nào animate Burger to Arrow với Appcompat v7 21, Thanh công cụ và DrawerLayout

mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

Bất kỳ ý tưởng nào? Cảm ơn!

Cập nhật:

Không, tôi có thể thay đổi trạng thái của biểu tượng và tôi có thể bật/tắt các ngăn kéo, nhưng các hình ảnh động không làm việc với phương pháp này:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    Toolbar toolbar = (Toolbar) findViewById(R.id.application_toolbar); 
    setSupportActionBar(toolbar); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.string1, R.string.string2) { 
     public void onDrawerClosed(View view) { 
      super.onDrawerClosed(view); 
     } 

     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
     } 
    }; 

    //mDrawerLayout.setDrawerListener(mDrawerToggle); // not needed 
    ... 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case android.R.id.home: 
      if (mDrawerLayout.getDrawerLockMode(GravityCompat.START) == LOCK_MODE_UNLOCKED) { 
       showDrawer(); 
      } else { 
       handleBackButtonPress(); // On this stage the home button is a <- 
      } 
    } 
    ... 
} 

private void setDrawerState(boolean isEnabled) { 
    if (isEnabled) { 
     mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
     mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED); 
     mDrawerToggle.syncState(); 

    } else { 
     mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
     mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
     mDrawerToggle.syncState(); 
    } 
} 

Các ngăn kéo đến ở trên cùng của Thanh công cụ.

Trả lời

36

Hãy xem ở đây, nó mô tả cách bạn giải quyết nó.

https://stackoverflow.com/a/26447144

Các phần thiết yếu như sau:

<style name="AppTheme" parent="Theme.AppCompat.Light"> 
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
</style> 

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
    <item name="spinBars">true</item> 
    <item name="color">@android:color/white</item> 
</style> 
+0

hãy để lại một lời giải thích của mã của bạn .. – Haris

+1

Cảm ơn nhưng tôi nghĩ bạn hiểu sai câu hỏi của tôi. Tôi muốn tắt hoàn toàn ngăn điều hướng (vào thời gian chạy) và hiển thị biểu tượng mũi tên thay vì bánh burger. – user2298916

+0

Tôi có cùng một vấn đề với bất kỳ ý tưởng nào không? –

29

Tôi tạo ra một ứng dụng nhỏ trong đó có chức năng tương tự

MainActivity

public class MyActivity extends ActionBarActivity { 

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

     DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer); 
     android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar); 
     ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(
       this, 
       drawerLayout, 
       toolbar, 
       R.string.open, 
       R.string.close 
     ) 

     { 
      public void onDrawerClosed(View view) 
      { 
       super.onDrawerClosed(view); 
       invalidateOptionsMenu(); 
       syncState(); 
      } 

      public void onDrawerOpened(View drawerView) 
      { 
       super.onDrawerOpened(drawerView); 
       invalidateOptionsMenu(); 
       syncState(); 
      } 
     }; 
     drawerLayout.setDrawerListener(actionBarDrawerToggle); 

     //Set the custom toolbar 
     if (toolbar != null){ 
      setSupportActionBar(toolbar); 
     } 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     actionBarDrawerToggle.syncState(); 
    } 
} 

XML của tôi về Hoạt động rằng

<android.support.v4.widget.DrawerLayout 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" 
    tools:context=".MyActivity" 
    android:id="@+id/drawer" 
    > 

    <!-- The main content view --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
     <include layout="@layout/toolbar_custom"/> 
    </FrameLayout> 
    <!-- The navigation drawer --> 
    <ListView 
     android:layout_marginTop="?attr/actionBarSize" 
     android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" 
     android:background="#457C50"/> 


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

My Tuỳ chỉnh Thanh công cụ XML

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

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/toolbar" 
    android:background="?attr/colorPrimaryDark"> 
    <TextView android:text="U titel" 
     android:textAppearance="@android:style/TextAppearance.Theme" 
     android:textColor="@android:color/white" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 
</android.support.v7.widget.Toolbar> 

My Theme Phong cách

<resources> 
    <style name="AppTheme" parent="Base.Theme.AppCompat"/> 

    <style name="AppTheme.Base" parent="Theme.AppCompat"> 
     <item name="colorPrimary">@color/primary</item> 
     <item name="colorPrimaryDark">@color/primaryDarker</item> 
     <item name="android:windowNoTitle">true</item> 
     <item name="windowActionBar">false</item> 
     <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
    </style> 

    <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
     <item name="spinBars">true</item> 
     <item name="color">@android:color/white</item> 
    </style> 

    <color name="primary">#457C50</color> 
    <color name="primaryDarker">#580C0C</color> 
</resources> 

Styles của tôi trong các giá trị-v21

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="AppTheme" parent="AppTheme.Base"> 
     <item name="android:windowContentTransitions">true</item> 
     <item name="android:windowAllowEnterTransitionOverlap">true</item> 
     <item name="android:windowAllowReturnTransitionOverlap">true</item> 
     <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> 
     <item name="android:windowSharedElementExitTransition">@android:transition/move</item> 
    </style> 
</resources> 
+2

Ah, tôi yêu bạn. Tôi đã đấu tranh để có được hoạt hình mũi tên chết tiệt. Tuy nhiên, nhìn thấy mã của bạn tôi thấy tôi đã thiếu dòng này: drawerLayout.setDrawerListener (actionBarDrawerToggle); Bây giờ nó hoạt động như một sự quyến rũ! – Kenneth

+2

plus One, để có mã chi tiết ... –

+0

Có cần thiết phải mở rộng từ ActionBarActivity không? – Skynet

Các vấn đề liên quan