[android] Android appcompat v7 21 라이브러리에서 DrawerArrowToggle을 구현하는 방법

이제 Android 5.0이 출시되었으므로 애니메이션 작업 표시 줄 아이콘을 구현하는 방법이 궁금합니다.

이 라이브러리는 여기 구현은 나를 위해 미세하지만 APPCOMPAT V7 라이브러리 이후는 어떻게이 구현 될 수있다?

라이브러리는 themes.xml에서이를 참조합니다.

 <item name="drawerArrowStyle">@style/Widget.AppCompat.DrawerArrowToggle</item>

이 스타일로

 <style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">

최신 정보

v7 DrawerToggle을 사용하여 구현했습니다. 그러나 나는 그것을 스타일링 할 수 없습니다. 도와주세요

v7 styles_base.xml에서 스타일을 찾았습니다.

<style name="Base.Widget.AppCompat.DrawerArrowToggle" parent="">
    <item name="color">?android:attr/textColorSecondary</item>
    <item name="thickness">2dp</item>
    <item name="barSize">18dp</item>
    <item name="gapBetweenBars">3dp</item>
    <item name="topBottomBarArrowSize">11.31dp</item>
    <item name="middleBarArrowSize">16dp</item>
    <item name="drawableSize">24dp</item>
    <item name="spinBars">true</item>
</style>

나는 이것을 내 스타일에 추가했지만 작동하지 않았습니다. 내 attr.xml에도 추가되었습니다.

<declare-styleable name="DrawerArrowToggle">
    <!-- The drawing color for the bars -->
    <attr name="color" format="color"/>
    <!-- Whether bars should rotate or not during transition -->
    <attr name="spinBars" format="boolean"/>
    <!-- The total size of the drawable -->
    <attr name="drawableSize" format="dimension"/>
    <!-- The max gap between the bars when they are parallel to each other -->
    <attr name="gapBetweenBars" format="dimension"/>
    <!-- The size of the top and bottom bars when they merge to the middle bar to form an arrow -->
    <attr name="topBottomBarArrowSize" format="dimension"/>
    <!-- The size of the middle bar when top and bottom bars merge into middle bar to form an arrow -->
    <attr name="middleBarArrowSize" format="dimension"/>
    <!-- The size of the bars when they are parallel to each other -->
    <attr name="barSize" format="dimension"/>
    <!-- The thickness (stroke size) for the bar paint -->
    <attr name="thickness" format="dimension"/>
</declare-styleable>

그러나 그렇게 할 때 충돌하고 색상 유형 오류가 표시됩니다. 내가 무엇을 놓치고 있습니까?



답변

첫째, 이제 android.support.v4.app.ActionBarDrawerToggle가 더 이상 사용되지 않음을 알아야합니다 .

이를 android.support.v7.app.ActionBarDrawerToggle.

여기 내 예를 들어 내가 새를 사용 Toolbar를 교체 ActionBar.

MainActivity.java

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);
    DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
        this,  mDrawerLayout, mToolbar,
        R.string.navigation_drawer_open, R.string.navigation_drawer_close
    );
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    mDrawerToggle.syncState();
}

styles.xml

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

AndroidDocument # DrawerArrowToggle_spinBars 에서 문서를 읽을 수 있습니다.

이 속성은 메뉴-화살표 애니메이션을 구현하는 키입니다.

public static int DrawerArrowToggle_spinBars

전환하는 동안 막대가 회전 해야하는지 여부
“true”또는 “false”의 부울 값이어야합니다.

그래서 이것을 설정합니다 : <item name="spinBars">true</item>.

그런 다음 애니메이션을 표시 할 수 있습니다.

이것이 당신을 도울 수 있기를 바랍니다.


답변

탐색 창 만들기 교육 에서 제안한대로 지원 라이브러리에서 제공하는 DrawerLayout 을 사용하는 경우 새로 추가 된 android.support를 사용할 수 있습니다 . v7 .app.ActionBarDrawerToggle (참고 : 현재 지원 중단 된 android.support. v4 .app.ActionBarDrawerToggle과 다름 ) :

서랍이 닫히면 햄버거 아이콘이 표시되고 서랍이 열리면 화살표가 표시됩니다. 서랍이 열리면이 두 상태간에 애니메이션이 적용됩니다.

교육이 deprecation / new 클래스를 고려하도록 업데이트되지는 않았지만 거의 똑같은 코드를 사용할 수 있어야합니다. 구현에서 유일한 차이점은 생성자입니다.


답변

비슷한 기능을 가진 작은 응용 프로그램을 만들었습니다.

주요 활동

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

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

내 사용자 정의 도구 모음 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>

내 테마 스타일

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

가치 -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>


답변

질문의 업데이트 된 부분에 답하려면 서랍 아이콘 / 화살표의 스타일을 지정하려면 두 가지 옵션이 있습니다.

화살표 자체 스타일 지정

이렇게하려면 다음 drawerArrowStyle과 같이 테마를 재정의 합니다.

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="drawerArrowStyle">@style/MyTheme.DrawerArrowToggle</item>
</style>
<style name="MyTheme.DrawerArrowToggle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="color">@android:color/holo_purple</item>
    <!-- ^ this will make the icon purple -->
</style>

ActionBar 자체가 화살표와 일관된 스타일을 가져야하기 때문에 이것은 아마도 원하는 것이 아닐 것입니다 . 따라서 아마도 두 번째 옵션이 필요합니다.

ActionBar / Toolbar 테마

전역 애플리케이션 테마 의 android:actionBarTheme( actionBarThemefor appcompat) 속성을 다음과 같이 고유 한 테마 (에서 파생해야 함)로 재정의합니다 ThemeOverlay.Material.ActionBar/ThemeOverlay.AppCompat.ActionBar.

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="actionBarTheme">@style/MyTheme.ActionBar</item>
</style>
<style name="MyTheme.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="android:textColorPrimary">@android:color/white</item>
    <!-- ^ this will make text and arrow white -->
    <!-- you can also override drawerArrowStyle here -->
</style>

중요한 점은 여기에 사용자 정의 레이아웃을 사용하는 경우이다 Toolbar(당신이 사용하는 경우 예를 대신 재고의 액션 바의 구현 DrawerLayoutNavigationViewToolbar는이 반투명 상태 표시 줄에서 볼의 재질 스타일의 서랍 효과를 얻을 콤보를) actionBarTheme속성이 obviosly 아니다 자동으로 선택되므로 ( AppCompatActivity기본값 은에 의해 처리되기 때문에 ActionBar) 사용자 정의의 Toolbar경우 수동으로 테마를 적용하는 것을 잊지 마십시오.

<!--inside your custom layout with DrawerLayout
and NavigationView or whatever -->
<android.support.v7.widget.Toolbar
        ...
        app:theme="?actionBarTheme">

-이것은 AppCompat의 기본값 ThemeOverlay.AppCompat.ActionBar또는 파생 된 테마에 속성을 설정 한 경우 재정의로 확인됩니다.

추신 : drawerArrowStyle재정의 및 spinBars속성 에 대한 약간의 의견 -많은 출처 true가 서랍 / 화살표 애니메이션을 얻으려면 설정해야한다고 제안합니다 . 것이며, spinBars그것이 true 기본적으로 (아웃 확인 APPCOMPAT의 Base.Widget.AppCompat.DrawerArrowToggle.Common스타일)를 재정의 할 필요가 없습니다 actionBarTheme애니메이션 작업을 얻을 전혀. 애니메이션을 재정의하고 속성을로 설정해도 애니메이션을 얻을 수 있습니다 false. 여기서 중요한 ActionBarDrawerToggle것은를 사용하는 것입니다. 멋진 애니메이션 드로어 블을 가져 오는 것입니다.


답변

위의 코드를 조금 수정하고 싶습니다.

    public class MainActivity extends ActionBarActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
        DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
            this,  mDrawerLayout, mToolbar,
            R.string.navigation_drawer_open, R.string.navigation_drawer_close
        );
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
    }

다른 모든 것은 동일하게 유지됩니다 …

Drawerlayout툴바 오버레이에 문제가있는 분들을 위해

android:layout_marginTop="?attr/actionBarSize"서랍 내용의 루트 레이아웃에 추가


답변