วิธีแทนที่ android.support.v4.app.ActionBarDrawerToggle ที่เลิกใช้แล้ว


127

เมื่อวานนี้ (17-10-2014) ฉันได้อัปเดต Android SDK และ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()
        }
    }

}

ฉันได้พยายามคัดลอก support-library-v7 และแทนที่

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การอ้างอิงไลบรารีนั้นไม่เพียงพอคุณยังต้องนำเข้าโมดูลที่คุณสามารถพบใน SDK ของคุณที่พา ธ\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);
        }

ขอบคุณผลงาน! อย่างไรก็ตามปุ่มสลับลิ้นชักกลายเป็นสีเข้มจะเปลี่ยนสีได้อย่างไร?
AndreaF

การอัปเดต Drawer ไม่แสดงใน Jelly Bean และเวอร์ชันก่อนหน้า
AndreaF


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

คุณใช้ Eclipse ใช่ไหม คุณตรวจสอบandroid-support-v7-appcompat.jarคุณสมบัติโปรเจ็กต์ของคุณ -> Java Build Path -> Order and Export หรือไม่? นอกจากนี้การย้าย v7-appcompat ไปด้านบนอาจเป็นประโยชน์
reVerse

ฉันใช้ IntelliJ ฉันได้เพิ่มandroid-support-v7-appcompat.jarไปยังการอ้างอิงโปรเจ็กต์ด้วยวิธีเดียวกับ support-v4 (มิฉะนั้นจะคอมไพล์ไม่ได้)
AndreaF

1
Mhkay น่าเสียดายที่ฉันไม่คุ้นเคยกับ IntelliJ ใน Android Studio คุณต้องเพิ่มลงcompile "com.android.support:appcompat-v7:21.0.0"ในbuild.gradleไฟล์ของคุณเท่านี้ก็พร้อมใช้งานได้แล้ว
reVerse

ฉันได้ตรวจสอบหลายครั้งหากกำหนดค่าการพึ่งพาไลบรารีอย่างถูกต้องมีสาเหตุอื่นที่ทำให้เกิดปัญหาฉันคิดว่าไลบรารีอาจเสียหาย แต่ฉันได้พยายามดาวน์โหลดและเพิ่มอีกครั้งจากตัวจัดการ SDK โดยไม่มีผลลัพธ์
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;
VikingGlen

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.