Bagaimana cara mengganti android.support.v4.app.ActionBarDrawerToggle yang sudah usang

127

Kemarin (17-10-2014) saya telah memperbarui Android SDK dan support-library-v4.jardari Aplikasi saya, sekarang saya mendapatkan peringatan penghentian terkait ActionBarDrawerToggle, membaca dokumentasi sepertinya saya harus menggunakan ActionBarDrawerTogglein support-library-v7.appcompact.jar.

Berikut beberapa bagian dari Aktivitas saya yang dapat menjadi relevan:

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()
        }
    }

}

Saya telah mencoba menyalin dukungan-library-v7 dan mengganti

import android.support.v4.app.ActionBarDrawerToggle;

dengan

 import android.support.v7.app.ActionBarDrawerToggle;

ini telah menyebabkan masalah kompilasi di

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

Jadi saya sudah coba ganti R.drawable.action_drawerdengan

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

ini mengkompilasi tetapi macet di Runtime dengan

 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)

Catatan yang android-support-v7-appcompat.jarditambahkan dengan benar dalam dependensi proyek masukkan deskripsi gambar di sini

AndreaF
sumber
1
Ubah impor Anda dari v4 ke v7 dan itu berhasil
Ahmed

Jawaban:

66

Menambahkan hanya android-support-v7-appcompat.jarke dependensi perpustakaan tidak cukup, Anda juga harus mengimpor dalam proyek Anda modul yang dapat Anda temukan di SDK Anda di jalan \android-sdk\extras\android\support\v7\appcompatdan setelah itu menambahkan dependensi modul mengkonfigurasi struktur proyek dengan cara ini

masukkan deskripsi gambar di sini

jika tidak disertakan hanya file kelas pustaka dukungan dan aplikasi tidak dapat memuat sumber daya lain yang menyebabkan kesalahan.

Selain itu sebagai reVerse disarankan ganti ini

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

dengan

public CustomActionBarDrawerToggle(Activity mActivity,
                                           DrawerLayout mDrawerLayout) {
            super(mActivity, mDrawerLayout, R.string.ns_menu_open, R.string.ns_menu_close);
        }
Silverstorm
sumber
Terima kasih bekerja! Namun tombol sakelar laci menjadi gelap, bagaimana bisa mengubah warnanya?
AndreaF
pembaruan Drawer tidak diperlihatkan di Jelly Bean dan versi sebelumnya
AndreaF
60

Anda tidak perlu menggunakan panggilan super ActionBarDrawerToggleyang membutuhkan Bilah Alat . Ini berarti alih-alih menggunakan konstruktor berikut:

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

Anda harus menggunakan ini:

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

Jadi pada dasarnya satu-satunya hal yang harus Anda lakukan adalah menghapus kebiasaan Anda drawable:

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

Lebih lanjut tentang ActionBarDrawerToggle "baru" di Documents (klik) .

balik
sumber
Saya telah mencoba mengikuti saran Anda tetapi 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)
gagal
Anda menggunakan Eclipse, kan? Apakah Anda memeriksa android-support-v7-appcompat.jarproperti proyek Anda -> Java Build Path -> Order and Ekspor? Selain itu mungkin membantu untuk memindahkan v7-appcompat ke atas.
Kembalikan
Saya menggunakan IntelliJ Saya telah menambahkan android-support-v7-appcompat.jarke dependensi proyek dengan cara yang sama dukungan-v4 (jika tidak bahkan tidak mengkompilasi)
AndreaF
1
Mhkay sayangnya saya tidak terbiasa dengan IntelliJ. Di Android Studio Anda hanya perlu menambahkan compile "com.android.support:appcompat-v7:21.0.0"ke build.gradlefile Anda dan Anda siap melakukannya.
kembalikan
Saya telah memeriksa berkali-kali jika ketergantungan perpustakaan dikonfigurasi dengan benar, ada beberapa alasan lain yang menyebabkan masalah ini, saya berpikir bahwa perpustakaan mungkin rusak tetapi saya telah mencoba mengunduh dan menambahkannya lagi dari manajer SDK tanpa hasil
AndreaF
27

kamu harus menggunakan import android.support.v7.app.ActionBarDrawerToggle;

dan gunakan konstruktor

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

dan jika tombol sakelar laci menjadi gelap maka Anda harus menggunakan supportActionBar yang disediakan di perpustakaan dukungan.

Anda dapat menerapkan supportActionbar dari tautan ini: http://developer.android.com/training/basics/actionbar/setting-up.html

Abhi1227
sumber
Terima kasih, impor manual import android.support.v7.app.ActionBarDrawerToggle;berhasil untuk saya. Meskipun saya biasanya mengimpor otomatis, yang itu tidak impor otomatis.
Azurespot
Dan hapusimport android.support.v4.app.ActionBarDrawerToggle;
VikingGlen
8

Insted dari

drawer.setDrawerListener(toggle);

Kamu bisa memakai

drawer.addDrawerListener(toggle);
erluxman
sumber