Android appcompat v7 21 लाइब्रेरी से DrawerArrowToggle कैसे लागू करें


97

तो अब जब एंड्रॉइड 5.0 जारी किया गया था, तो मैं सोच रहा था कि एनिमेटेड एक्शनबार आइकन कैसे लागू किया जाए।

यह पुस्तकालय यहाँ मेरे लिए ठीक लागू करता है लेकिन जब से appcompat v7 पुस्तकालय में है, इसे कैसे लागू किया जा सकता है?

पुस्तकालय इसे theme.xml में संदर्भित करता है

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

इस शैली के तहत

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

अपडेट करें

मुझे यह v7 दराज का उपयोग करके कार्यान्वित किया गया। हालाँकि मैं इसे स्टाइल नहीं कर सकता। कृपया सहायता कीजिए

मुझे v7 स्टाइल_बेस / एक्सएमएल में इसके लिए स्टाइल मिला

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

लेकिन क्रैश और ऐसा करते समय रंग प्रकार त्रुटि कहते हैं। मैं क्या खो रहा हूँ?

जवाबों:


243

पहले, आपको पता होना चाहिए कि अब 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 पर दस्तावेज़ पढ़ सकते हैं

यह विशेषता मेनू-टू-एरो एनीमेशन को लागू करने की कुंजी है।

सार्वजनिक स्थैतिक int DrawerArrowToggle_spinBars

संक्रमण के दौरान सलाखों को घूमना चाहिए या नहीं
, यह बूलियन मान होना चाहिए, या तो "सही" या "गलत"।

तो, आप इसे सेट करते हैं <item name="spinBars">true</item>:।

फिर एनीमेशन प्रस्तुत किया जा सकता है।

आशा है इससे आपको सहायता मिलेगी।


12
मैं हैमबर्गर आइकन दिखाने के लिए मुद्दों में भाग गया। कॉलिंग mDrawerToggle.syncState();तय हो गई।
अंहुर्मान

1
मेरे लिए getSupportActionBar () रिटर्न अशक्त .. क्या कारण हो सकता है?
रमेश_डाल

2
एंड्रॉयड स्टूडियो का कहना है Cannot resolve method setSupportActionBar(android.widget.Toolbar)। मैंने भी कोशिश की है android.support.v7.toolbar। क्या किसी को पता है यह क्यों होता है?
pez

1
मैंने उपयोग किया setSupportActionBar(mToolbar);और परिभाषित भी किया <item name="spinBars">true</item>लेकिन एनीमेशन काम नहीं कर रहा था
स्वीटविशर '

2
यदि आप टूलबार को अपनी गतिविधि के ActionBar के रूप में सेट कर रहे हैं, तो ActionBarDrawerToggle (गतिविधि, DrawerLayout, int, int) का उपयोग करना चाहिए।
पीटर झाओ

24

यदि आप समर्थन लाइब्रेरी का उपयोग कर रहे हैं , तो एक नेविगेशन ड्रावर प्रशिक्षण बनाने में सुझाए गए ड्रॉयरलैट का उपयोग करें, आप नए जोड़े गए एंड्रॉइड .support का उपयोग कर सकते हैं v7 .app.ActionBarDrawerToggle (नोट: अब हटाए गए android .। v4 .app.ActionBarDrawerToggle से अलग ):

दराज बंद होने पर एक हैम्बर्गर आइकन दिखाता है और दराज खुला होने पर एक तीर। ड्रॉअर खुलते ही यह इन दोनों राज्यों के बीच का अंतर बनाता है।

हालांकि प्रशिक्षण को अपडेट / नई कक्षा को ध्यान में रखने के लिए अद्यतन नहीं किया गया है, आपको इसे लगभग समान कोड का उपयोग करने में सक्षम होना चाहिए - इसे लागू करने में एकमात्र अंतर कंस्ट्रक्टर का है।


मैं अपने ऐप bc में v4 का उपयोग कर रहा हूं। मुझे एपीआई 15 से पहले उपकरणों का समर्थन करने की आवश्यकता नहीं है। इसलिए यदि मैं यह काम करना चाहता हूं तो मुझे v7 एक्शनबार दराज टॉगल का उपयोग करना होगा? अगर मैंने ऐसा किया तो मुझे अपनी सभी शैलियों को AppCompat और टुकड़ा करने की गतिविधियों को एक्शनबार और अन्य गतिविधियों में नहीं बदलना पड़ेगा? या मैं v7 से सिर्फ दराज टॉगल लागू कर सकता हूं। अभी मैं कार्ड व्यू के लिए v7 का उपयोग करता हूं। अगर 15 से नीचे एपी का समर्थन नहीं कर रहा हूं तो क्या मुझे भी v4 का उपयोग करना चाहिए? और मुझे लगता है कि मुझे कार्ड के विचारों के लिए v7 की आवश्यकता है।
बिग्नदाद

सामग्री डिज़ाइन के लिए समर्थन लाइब्रेरी संगतता के सभी v7-appcompat में कार्यान्वित किए जाते हैं और यह अनुशंसा की जाती है कि आप इन 5.0 उपकरणों पर उस स्टाइल का समर्थन करना चाहते हैं। AppCompat का निर्माण किया गया है और इसे v4 की आवश्यकता है इसलिए यदि आप AppCompat का उपयोग करना चाहते हैं तो यह वास्तव में ऊपर है। यदि आप पहले से ही FragmentActivity का उपयोग कर रहे हैं, तो आप पहले से ही बहुत करीब हैं - स्टाइल में अंतर अब बहुत छोटा है (ज्यादातर सिर्फ एंड्रॉइड को बदलना है: गैर-नाम वाले विशेषताओं के साथ विशेषता)।
इयानहनीबेलके

इस सवाल का अद्यतन करें यदि आप एक नज़र रखना पसंद नहीं करेंगे
Bignadad

यह वास्तव में स्टाइल पर एक अलग सवाल है। मैं उस भाग को एक अन्य प्रश्न के रूप में प्रस्तुत करने का सुझाव देता हूँ (बेझिझक एक टिप्पणी इसमें लिंक के साथ जोड़ने के लिए)।
atहनुनीबालक

1
@mraviator - yep: XML बदलें, फिर v7 बनाएं और संलग्न करें ActionBarDrawerToggleविहित जवाब AppCompat के निर्माता से एक पूर्ण उदाहरण अपनी XML संरचित किया जाना चाहिए है।
१६:३६ पर अयनांशनिबलेक

17

मैंने एक छोटा अनुप्रयोग बनाया जिसमें समान कार्यक्षमता थी

मुख्य गतिविधि

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>

1
यह सही काम करता है, लेकिन मैं शीर्षक का उपयोग नहीं करना चाहता, तो मैं इसे कैसे संभाल सकता हूं? क्योंकि अगर मैं Theme.AppCompat.Light.NoActionBar का उपयोग करता हूं , तो यह निश्चित रूप से मुझे NULL at getSupportActionBar
SweetWisher

मैंने कोड के ऊपर इस्तेमाल किया। मुझे अपवाद मिला: इस गतिविधि में पहले से ही सेट कूपोर्टेक्शनबार (टूलबार) लाइन में विंडो सजावट द्वारा आपूर्ति की गई एक बार है। मैंने getSupportActionBar () का उपयोग किया। छिपाना (); SetContentView (R.layout.activity_main) से पहले; अब यह काम कर रहा है।
तिरुमलवलवन

setSupportActionBar (उपकरण पट्टी); टिप्पणी भी की।
तिरुमलवलवन

9

अपने प्रश्न के अपडेट किए गए भाग का उत्तर देने के लिए: दराज के आइकन / तीर को स्टाइल करने के लिए, आपके पास दो विकल्प हैं:

तीर को ही स्टाइल करें

ऐसा करने के लिए, 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 में तीर के साथ सुसंगत स्टाइल होना चाहिए, इसलिए, संभवतः, आप विकल्प दो चाहते हैं:

एक्शनबार / टूलबार को थीम दें

अपने स्वयं के विषय के साथ वैश्विक अनुप्रयोग थीम की विशेषता android:actionBarTheme( actionBarThemeappcompat के लिए) को ओवरराइड करें (जो कि आपको संभवतः प्राप्त करना चाहिए 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स्टॉक एक्शनबेर कार्यान्वयन के बजाय कस्टम लेआउट का उपयोग करते समय (जैसे कि यदि आप उपयोग कर रहे हैं DrawerLayout- NavigationView- Toolbarसामग्री-शैली दराज प्रभाव को प्राप्त करने के लिए कॉम्बो जहां यह पारभासी स्थिति के तहत दिखाई दे रहा है), actionBarThemeविशेषता नहीं है। स्वचालित रूप से उठाया गया (क्योंकि इसका मतलब AppCompatActivityडिफ़ॉल्ट के लिए देखभाल करना है ActionBar), इसलिए आपके रिवाज के Toolbarलिए मैन्युअल रूप से अपनी थीम लागू करना न भूलें:

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

- ThemeOverlay.AppCompat.ActionBarयदि आप अपनी व्युत्पन्न थीम में विशेषता सेट करते हैं, तो यह या तो AppCompat के डिफ़ॉल्ट या आपके ओवरराइड को हल करेगा ।

PSdrawerArrowStyle ओवरराइड और spinBarsविशेषता के बारे में थोड़ी टिप्पणी करें - जो कि बहुत सारे स्रोतों का सुझाव है trueकि दराज / तीर एनीमेशन प्राप्त करने के लिए सेट किया जाना चाहिए । बात spinBarsयह है, यह AppCompat में true डिफ़ॉल्ट रूप से है ( Base.Widget.AppCompat.DrawerArrowToggle.Commonस्टाइल देखें), आपको actionBarThemeएनीमेशन को काम करने के लिए बिल्कुल भी ओवरराइड नहीं करना होगा। आप एनीमेशन करते हैं भले ही आप इसे ओवरराइड करते हैं और इसके लिए विशेषता सेट करते हैं false, यह सिर्फ एक अलग, कम ट्विरली एनीमेशन है। यहां महत्वपूर्ण बात ActionBarDrawerToggleयह है कि इसका उपयोग करना है , यह फैंसी एनिमेटेड ड्रिबल में खींचता है।


2

मैं उपरोक्त कोड को थोड़ा कम करना चाहता हूं

    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"दराज सामग्री के रूट लेआउट में जोड़ें


getSupportActionBar()जब आप सिर्फ विस्तार करते हैं तो आप कैसे उपयोग करते हैं Activity?
वजीबा

बस आप नहीं कर सकते, आप से होना चाहिएActionBarActivity
नितिन मिश्रा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.