web-dev-qa-db-ja.com

非推奨のAndroid.support.v4.app.ActionBarDrawerToggleを置き換える方法

昨日(17-10-2014)私は自分のAppのAndroid SDKとsupport-library-v4.jarをアップデートしました。今度はActionBarDrawerTogglename__に関連した非推奨の警告が出ますので、 を読んでくださいsupport-library-v7.appcompact.jar内のActionBarDrawerTogglename__。

ここに私の活動のいくつかの部分が関連している可能性があります。

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がプロジェクトの依存関係に正しく追加されていることに注意してください。 enter image description here

126
AndreaF

ライブラリの依存関係にAndroid-support-v7-appcompat.jarを追加するだけでは不十分で、SDKのパス\Android-sdk\extras\Android\support\v7\appcompatで見つけることができるモジュールをプロジェクトにインポートする必要があります。その後、このようにプロジェクト構造を構成するモジュール依存関係を追加します。

enter image description here

それ以外の場合はサポートライブラリのクラスファイルのみが含まれ、アプリはエラーの原因となっている他のリソースをロードできません。

さらに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);
        }
66
Silverstorm

ツールバー を必要とする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についての詳細 ドキュメント内(クリック)

60
reVerse

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

27
Abhi1227

の代わりに

drawer.setDrawerListener(toggle);

あなたが使用することができます

drawer.addDrawerListener(toggle);
6
erluxman