कैसे बदला गया android.support.v4.app.ActionBarDrawerToggle को प्रतिस्थापित करें


127

कल (17-10-2014) मेरे पास एंड्रॉइड एसडीके और support-library-v4.jarमेरे ऐप का अपडेट है , अब मुझे इससे संबंधित डेप्रिसिएशन चेतावनी मिलती है ActionBarDrawerToggle, डॉक्यूमेंटेशन पढ़ने से लगता है कि मुझे इसमें इस्तेमाल करना ActionBarDrawerToggleहै support-library-v7.appcompact.jar

मेरी गतिविधि के कुछ हिस्से जो प्रासंगिक हो सकते हैं:

import android.app.ActionBar;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;


public class MyActivity extends FragmentActivity {
    private ActionBar bar;
    private CustomActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawer;
    private ListView mDrawerList;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_infoviewer);

        bar = this.getActionBar();

        bar.setDisplayHomeAsUpEnabled(true);

        bar.setHomeButtonEnabled(true);
        bar.setDisplayShowTitleEnabled(false);
        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        mDrawer.setBackgroundColor(getResources().getColor(R.color.White));
        initNavMenu();
        try {
            mDrawerToggle = new CustomActionBarDrawerToggle(this, mDrawer);
        } catch (RuntimeException e) {
            e.printStackTrace();
        }

        mDrawer.setDrawerListener(mDrawerToggle);
    }

    ....

    private void initNavMenu() {
        NavMenuAdapter mAdapter = MyDrawers.getDefaultDrawer(MyActivity.this, true);
        mDrawerList = (ListView) findViewById(R.id.drawer);
        mDrawerList.setBackgroundColor(getResources().getColor(R.color.GreenMoneyDark));
        if (mDrawerList != null) mDrawerList.setAdapter(mAdapter);
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener(MyActivity.this, mDrawer, mDrawerList));
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle {

        public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout, R.drawable.action_drawer,
                    R.string.ns_menu_open, R.string.ns_menu_close);
        }

        @Override
        public void onDrawerClosed(View view) {
            bar.setTitle(getString(R.string.ns_menu_close));
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            bar.setTitle(getString(R.string.ns_menu_open));
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    }

}

मैंने समर्थन-पुस्तकालय-वी 7 की प्रतिलिपि बनाने और बदलने की कोशिश की है

import android.support.v4.app.ActionBarDrawerToggle;

साथ में

 import android.support.v7.app.ActionBarDrawerToggle;

इससे संकलन समस्या उत्पन्न हो गई है

 public CustomActionBarDrawerToggle(Activity mActivity,
                                               DrawerLayout mDrawerLayout) {
                super(mActivity, mDrawerLayout, R.drawable.action_drawer,
                        R.string.ns_menu_open, R.string.ns_menu_close);
            }

तो मैं बदलने के लिए कोशिश की है R.drawable.action_drawerसाथ

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout,new Toolbar(MyActivity.this) ,
                    R.string.ns_menu_open, R.string.ns_menu_close);
        }

यह संकलित करता है, लेकिन रनटाइम पर क्रैश होता है

 java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$attr;
            at android.support.v7.widget.Toolbar.<init>(Toolbar.java:190)
            at android.support.v7.widget.Toolbar.<init>(Toolbar.java:186)

ध्यान दें कि android-support-v7-appcompat.jarप्रोजेक्ट निर्भरता में सही तरीके से जोड़ा गया है यहाँ छवि विवरण दर्ज करें


1
अपने आयात को v4 से v7 में बदलें और इसने काम किया
अहमद

जवाबों:


66

केवल android-support-v7-appcompat.jarपुस्तकालय निर्भरता को जोड़ना पर्याप्त नहीं है, आपको अपने प्रोजेक्ट में उस मॉड्यूल को भी आयात करना होगा जिसे आप रास्ते में अपने एसडीके में पा सकते हैं \android-sdk\extras\android\support\v7\appcompatऔर उसके बाद मॉड्यूल निर्भरता को इस तरह से प्रोजेक्ट संरचना को कॉन्फ़िगर कर सकते हैं

यहाँ छवि विवरण दर्ज करें

अन्यथा समर्थन पुस्तकालय की केवल वर्ग फाइलें शामिल हैं और एप्लिकेशन त्रुटि पैदा करने वाले अन्य संसाधनों को लोड करने में सक्षम नहीं है।

इसके अलावा जैसा कि reVerse ने इसे प्रतिस्थापित करने का सुझाव दिया था

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout,new Toolbar(MyActivity.this) ,
                    R.string.ns_menu_open, R.string.ns_menu_close);
        }

साथ में

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);
        }

धन्यवाद काम करता है! हालांकि दराज टॉगल बटन अंधेरा हो जाता है, रंग कैसे बदल सकता है?
एंड्रियाफ

अद्यतन दराज जेली बीन और पिछले संस्करणों पर नहीं दिखाया गया है
एंड्रियाफ


60

आपको टूलबार कीActionBarDrawerToggle आवश्यकता वाले सुपर-कॉल का उपयोग करने की कोई आवश्यकता नहीं है । इसका मतलब है कि निम्न निर्माणकर्ता का उपयोग करने के बजाय:

ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes)

आपको इसका उपयोग करना चाहिए:

ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, int openDrawerContentDescRes, int closeDrawerContentDescRes)

तो मूल रूप से केवल एक चीज जो आपको करनी है वह है drawable:

super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);

डॉक्स में "नए" ActionBarDrawerToggle के बारे में अधिक (क्लिक करें)


मैंने आपके सुझाव का पालन करने की कोशिश की है, लेकिन इस मुद्दे के साथ दुर्घटनाग्रस्त हो जाता है:java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$styleable; at android.support.v7.app.DrawerArrowDrawable.<init>(DrawerArrowDrawable.java:64) at android.support.v7.app.ActionBarDrawerToggle$DrawerArrowDrawableToggle.<init>(ActionBarDrawerToggle.java:469) at android.support.v7.app.ActionBarDrawerToggle.<init>(ActionBarDrawerToggle.java:222) at android.support.v7.app.ActionBarDrawerToggle.<init>(ActionBarDrawerToggle.java:150)
एंड्रियाएफ

आप ग्रहण का सही उपयोग कर रहे हैं? क्या आपने android-support-v7-appcompat.jarअपने प्रोजेक्ट गुणों में जांच की -> जावा बिल्ड पाथ -> ऑर्डर और एक्सपोर्ट? इसके अलावा यह v7-appcompat को शीर्ष पर ले जाने में मददगार हो सकता है।
पुनर्मिलन

मैं IntelliJ का उपयोग करता हूं मैंने android-support-v7-appcompat.jar
समर्थन-

1
Mhkay दुर्भाग्य से मैं IntelliJ से परिचित नहीं हूं। एंड्रॉइड स्टूडियो में आपको बस compile "com.android.support:appcompat-v7:21.0.0"अपनी build.gradleफाइल में जोड़ना है और आप जाने के लिए अच्छे हैं।
पुनर्मिलन

मैंने कई बार जाँच की है यदि पुस्तकालय निर्भरता को सही तरीके से कॉन्फ़िगर किया गया है, तो कुछ और कारण है जो इस समस्या का कारण है, मैंने सोचा है कि लाइब्रेरी शायद दूषित है लेकिन मैंने एसडीके प्रबंधक से इसे फिर से डाउनलोड करने और जोड़ने का प्रयास किया है, जिसका कोई परिणाम नहीं है
AndreaF

27

तुम्हें अवश्य उपयोग करना चाहिए import android.support.v7.app.ActionBarDrawerToggle;

और कंस्ट्रक्टर का उपयोग करें

public CustomActionBarDrawerToggle(Activity mActivity,DrawerLayout mDrawerLayout)
{
    super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);
}

और अगर ड्रॉअर टॉगल बटन अंधेरा हो जाता है, तो आपको सपोर्ट लाइब्रेरी में दिए गए supportActionBar का उपयोग करना होगा।

आप इस लिंक से supportActionbar को लागू कर सकते हैं: http://developer.android.com/training/basics/actionbar/setting-up.html


धन्यवाद, import android.support.v7.app.ActionBarDrawerToggle;मेरे लिए काम का एक मैनुअल आयात । भले ही मेरे पास आमतौर पर ऑटो-आयात होता है, लेकिन किसी ने ऑटो-आयात नहीं किया।
Azurespot

और हटाएंimport android.support.v4.app.ActionBarDrawerToggle;
वाइकिंगग्लन

8

इसके बजाए

drawer.setDrawerListener(toggle);

आप उपयोग कर सकते हैं

drawer.addDrawerListener(toggle);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.