Intereting Posts
Избегайте отмены уведомления об удалении приложения из списка последних приложений Android: Как настроить Margin / Padding в предпочтении? Как вы можете передать несколько примитивных параметров AsyncTask? Android и ActionBarCompat: как изменить видимость действий во время выполнения на устройствах до ICS? Скопируйте файлы из папки SD-карты в другую папку на SD-карте MVP для активности с несколькими фрагментами Facebook login Не удается передать разрешение на публикацию или управление (электронное письмо) на запрос авторизации на чтение Trivial: получите подтверждение по электронной почте, отправленное в android Как получить текущий уровень масштабирования GoogleMap? Неопределенная ссылка на `__android_log_print ' Библиотека файлового менеджера Android Выбрать + скопировать текст в TextView? Как отменить проект на Maven Зачем нам нужен 4-й конструктор для Lollipop? Android: изменение фонового цвета активности (основной вид)

Как заменить устаревший android.support.v4.app.ActionBarDrawerToggle

Вчера (17-10-2014) У меня есть обновление Android 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() } } } 

Я попытался скопировать поддержку-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); } 

Это компиляция, но сбой при Runtime с

  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 правильно добавлен в зависимости от проекта Введите описание изображения здесь

Solutions Collecting From Web of "Как заменить устаревший android.support.v4.app.ActionBarDrawerToggle"

android-support-v7-appcompat.jar добавить только зависимости 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); } 

Вам не нужно использовать супер-вызов 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 в Документах (щелкните) .

Вы должны использовать 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

Привлечен

 drawer.setDrawerListener(toggle); 

Вы можете использовать

 drawer.addDrawerListener(toggle);