더 이상 사용되지 않는 android.support.v4.app.ActionBarDrawerToggle을 바꾸는 방법


127

어제 (17-10-2014) 내가 업데이 트 안드로이드 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로 변경하면 효과가 있습니다.
Ahmed

답변:


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

업데이트 서랍이 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 빌드 경로-> 주문 및 내보내기 를 확인 했습니까 ? 또한 v7-appcompat를 맨 위로 이동하는 것이 도움이 될 수 있습니다.
reVerse

IntelliJ를 사용하고 있습니다. android-support-v7-appcompat.jar support-v4와 같은 방식으로 프로젝트 종속성에 (그렇지 않으면 컴파일조차
안됨

1
안타깝게도 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

8

대신해서

drawer.setDrawerListener(toggle);

당신이 사용할 수있는

drawer.addDrawerListener(toggle);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.