2014-10-18 44 views
123

昨天(17-10-2014)我已經更新了我的應用的Android SDK和support-library-v4.jar,現在我得到了有關ActionBarDrawerToggle的折舊警告,看起來the documentation似乎是我的使用support-library-v7.appcompact.jar中的ActionBarDrawerToggle如何替換棄用的android.support.v4.app.ActionBarDrawerToggle

這裏我活動的某些部分,可能是相關者:

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

} 

我試圖複製支持庫-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); 
      } 

所以我試圖與

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

+1

從V4到V7更改您的導入和它的工作 – Ahmed 2015-06-17 20:05:30

回答

65

android-support-v7-appcompat.jar添加到庫的依賴是不夠的,你也是在你的項目導入您可以在路徑\android-sdk\extras\android\support\v7\appcompat在SDK發現,之後添加模塊依賴性配置項目結構這樣的模塊

enter image description here

否則只包含支持庫的類文件,應用程序無法加載導致錯誤的其他資源。

此外反向建議更換此

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); 
     } 
+0

謝謝你的作品!但是,抽屜切換按鈕變暗,如何更改顏色? – AndreaF 2014-10-18 14:52:20

+0

更新抽屜不顯示果凍豆和以前的版本 – AndreaF 2014-10-18 16:37:58

+0

請參閱http://stackoverflow.com/questions/26442135/replace-deprecated-android-support-v4-app-actionbardrawertoggle-with-support-v7 – AndreaF 2014-10-18 16:43:55

59

有與

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

這個編譯但在運行時崩潰更換R.drawable.action_drawer不需要你使用超級電話的ActionBarDrawerToggle哪個r等同於Toolbar。這意味着,而是採用下面的構造:

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 in the Docs (click)

+0

我曾嘗試遵循你的建議,但與此問題崩潰:'java.lang.NoClassDefFoundError:失敗的解決方案:Landroid/support/v7/appcompat/R $ styleable; at android.support.v7.app.DrawerArrowDrawable。 (DrawerArrowDrawable.java:64) at android.support.v7.app.ActionBarDrawerToggle $ DrawerArrowDrawableToggle。 (ActionBarDrawerToggle.java:469) at android.support.v7.app.ActionBarDrawerToggle。 (ActionBarDrawerToggle.java:222) at android.support.v7.app.ActionBarDrawerToggle。 (ActionBarDrawerToggle.java:150)' – AndreaF 2014-10-18 13:24:17

+0

您使用的是Eclipse嗎?你是否在你的項目屬性 - > Java Build Path - > Order and Export?中檢查了「android-support-v7-appcompat.jar」此外,將v7-appcompat移到頂部可能會有所幫助。 – reVerse 2014-10-18 13:25:53

+0

我用的IntelliJ我已經加入了Android的'支持-V7-appcompat.jar'的項目依賴於支持-V4以同樣的方式(否則沒有按-T甚至編譯) – AndreaF 2014-10-18 13:28:21

26

必須使用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

+0

謝謝,手冊導入android.support.v7.app.ActionBarDrawerToggle;'爲我工作。即使我通常有自動導入,但那個沒有自動導入。 – Azurespot 2015-01-20 05:33:28

+0

並刪除'import android.support.v4.app.ActionBarDrawerToggle;' – VikingGlen 2015-11-17 05:16:25

6

drawer.setDrawerListener(toggle); 

insted的您可以使用

drawer.addDrawerListener(toggle); 
相關問題