Làm cách nào để thay thế android.support.v4.app.ActionBarDrawerToggle


127

Hôm qua (17-10-2014) Tôi có bản cập nhật Android SDK và support-library-v4.jarApp của tôi, bây giờ tôi nhận được cảnh báo không dùng nữa liên quan đến ActionBarDrawerToggle, đọc các tài liệu có vẻ như tôi phải sử dụng ActionBarDrawerToggletrong support-library-v7.appcompact.jar.

Ở đây một số phần Hoạt động của tôi có thể liên quan:

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

}

Tôi đã cố gắng sao chép support-library-v7 và thay thế

import android.support.v4.app.ActionBarDrawerToggle;

với

 import android.support.v7.app.ActionBarDrawerToggle;

điều này đã gây ra vấn đề biên dịch trong

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

Vì vậy, tôi đã cố gắng để thay thế R.drawable.action_drawerbằng

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

điều này biên dịch nhưng sự cố tại Runtime với

 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)

Lưu ý rằng android-support-v7-appcompat.jarđược thêm chính xác trong phụ thuộc dự án nhập mô tả hình ảnh ở đây


1
Thay đổi nhập của bạn từ v4 sang v7 và nó đã hoạt động
Ahmed

Câu trả lời:


66

Chỉ thêm android-support-v7-appcompat.jarvào các phụ thuộc thư viện là không đủ, bạn cũng phải nhập vào dự án của mình mô-đun mà bạn có thể tìm thấy trong SDK của mình tại đường dẫn \android-sdk\extras\android\support\v7\appcompatvà sau đó thêm phụ thuộc mô-đun cấu hình cấu trúc dự án theo cách này

nhập mô tả hình ảnh ở đây

mặt khác, chỉ bao gồm các tệp lớp của thư viện hỗ trợ và ứng dụng không thể tải các tài nguyên khác gây ra lỗi.

Ngoài ra, reVerse đề nghị thay thế

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

với

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

Cảm ơn bạn làm việc! Tuy nhiên nút chuyển đổi ngăn kéo trở nên tối, làm thế nào có thể thay đổi màu sắc?
AndreaF

Cập nhật Ngăn kéo không được hiển thị trên Jelly Bean và các phiên bản trước
AndreaF


60

Bạn không cần phải sử dụng siêu cuộc gọi ActionBarDrawerToggleyêu cầu Thanh công cụ . Điều này có nghĩa là thay vì sử dụng hàm tạo sau:

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

Bạn nên sử dụng cái này:

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

Vì vậy, về cơ bản, điều duy nhất bạn phải làm là loại bỏ tùy chỉnh của mình drawable:

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

Thông tin thêm về ActionBarDrawerToggle "mới" trong Tài liệu (nhấp) .


Tôi đã cố gắng làm theo đề xuất của bạn nhưng gặp sự cố với vấn đề này: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

Bạn đang sử dụng Eclipse phải không? Bạn đã kiểm tra các android-support-v7-appcompat.jarthuộc tính dự án của mình -> Đường dẫn xây dựng Java -> Đặt hàng và xuất khẩu? Hơn nữa, nó có thể hữu ích để di chuyển v7-appcompat lên đầu.
Xác minh lại

Tôi sử dụng IntelliJ Tôi đã thêm các android-support-v7-appcompat.jarphụ thuộc của dự án theo cùng cách hỗ trợ-v4 (nếu không thậm chí không biên dịch)
AndreaF

1
Rất tiếc là tôi không quen với IntelliJ. Trong Android Studio, bạn chỉ cần thêm compile "com.android.support:appcompat-v7:21.0.0"vào build.gradletệp của mình và bạn đã sẵn sàng.
Xác minh lại

Tôi đã kiểm tra nhiều lần nếu phụ thuộc thư viện được cấu hình đúng, có một số lý do khác gây ra sự cố, tôi đã nghĩ rằng thư viện có thể bị hỏng nhưng tôi đã cố tải xuống và thêm lại từ trình quản lý SDK mà không có kết quả
AndreaF

27

bạn phải dùng import android.support.v7.app.ActionBarDrawerToggle;

và sử dụng hàm tạo

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

và nếu nút chuyển đổi ngăn kéo trở nên tối thì bạn phải sử dụng supportActionBar được cung cấp trong thư viện hỗ trợ.

Bạn có thể triển khai supportActionbar từ liên kết này: http://developer.android.com/training/basics/actionbar/setting-up.html


Cảm ơn, một nhập khẩu thủ công import android.support.v7.app.ActionBarDrawerToggle;làm việc cho tôi. Mặc dù tôi thường nhập tự động, nhưng cái đó không tự động nhập.
Azurespot

Và xóaimport android.support.v4.app.ActionBarDrawerToggle;
VikingGlen

8

Thay vì

drawer.setDrawerListener(toggle);

Bạn có thể dùng

drawer.addDrawerListener(toggle);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.