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


127

昨日(17-10-2014)私は更新のAndroid SDKを持っているし、support-library-v4.jar私のアプリの、今私はに関連した非推奨警告が表示されますがActionBarDrawerToggle、読書のドキュメントは、私が使用する必要があることと思われるActionBarDrawerTogglesupport-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 2014年

ドロワーの更新は、Jelly Beanおよび以前のバージョンでは表示されません
AndreaF


60

ToolbarActionBarDrawerToggleを必要とするのスーパーコールを使用する必要はありません。つまり、次のコンストラクタを使用する代わりに:

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を一番上に移動すると役立つ場合があります。
2014年

私はIntelliJを使用しています。android-support-v7-appcompat.jarこれをsupport-v4と同じ方法でプロジェクトの依存関係に追加しました(それ以外の場合はコンパイルさえしません)
AndreaF

1
Mkkay残念ながら、IntelliJには慣れていません。Android Studioではcompile "com.android.support:appcompat-v7:21.0.0"build.gradleファイルに追加するだけでよいのです。
2014年

ライブラリの依存関係が正しく構成されているかどうかを何度も確認しましたが、問題を引き起こす他の理由があります。ライブラリが破損している可能性があると思いましたが、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 2015年

そして削除import android.support.v4.app.ActionBarDrawerToggle;
VikingGlen 2015年

8

の本能

drawer.setDrawerListener(toggle);

使用できます

drawer.addDrawerListener(toggle);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.