25

Я хотел бы удалить ActionBarSherlock из своего приложения и заменить его на стандартный ActionBarCompat.Каковы распространенные проблемы при переходе с ActionBarSherlock на ActionBarCompat?

  • Как реализовать ActionBarCompat?
  • Как перенести Activites?
  • Какой импорт заменяет импорт ActionBarSherlock?
  • Каковы типичные проблемы?
+1

Google сказал мне: [ссылка] (http://www.grokkingandroid.com/migrating-actionbarsherlock-actionbarcompat/) –

+0

да, не видел, что во времени. Смотрите мой более длинный ответ. –

ответ

65

Я сделал некоторые миграции и записал все проблемы, с которыми я столкнулся. Ни один из них не был серьезным, но уделил время исследованиям. Через пару часов я смог перенести довольно большое приложение, зная все это. Пусть это поможет ускорить процесс миграции.

Как мне преобразовать из ActionBarSherlock в ActionBarCompat?

Примечание: Начиная с версии библиотеки поддержки v22.1.0 класс ActionBarActivity устарел. Вместо этого вы должны использовать AppCompatActivity. Читайте здесь для получения дополнительной информации: What's the enhancement of AppCompatActivity over ActionBarActivity?

== Переключение библиотеки ==

Перейти к приложению свойства и удалить ActionBarSherlock и добавить ActionBarCompat вместо этого. Для этого требуется наличие библиотеки appcompat v7, см. http://developer.android.com/tools/support-library/setup.html. В точности следуйте инструкциям, ActionBarCompat должен быть проектом библиотеки.

Параллель не работает (легко), так как в обеих библиотеках множество атрибутов.

Не следует обескураживать сотни ошибок после замены библиотек. Подавляющее большинство уходит автоматически.

== исправить ошибки XML ==

Первая вещь, чтобы исправить все ошибки XML, чтобы позволить компиляции и найти другие ошибки.

Заменить тему sherlock с помощью темы ActionBarCompat, например.
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">

Удалить двойное attr, например. <attr name="buttonBarStyle" format="reference" />.

На данный момент удалите все стили отдельных стилей. См. Далее, как их обрабатывать.

== исправить ошибки построения ==

Выберите самые простые действия первой. ActionBarCompat не отличает Activity и FragmentActivity, оба теперь ActionBarActivity.

Удалить импорт ActionBarSherlock и распространяется на ActionBarActivity (import android.support.v7.app.ActionBarActivity;)

После сохранения, это должно значительно уменьшить количество ошибок в деятельности.

Исправьте ошибки вокруг меню и не обращайте внимания на ошибки фрагментов, они должны уйти позже.

== Замены ==

Импорт:

  • импорт com.actionbarsherlock.app.SherlockActivity; -> import android.support.v7.app.ActionBarActivity;
  • импорт com.actionbarsherlock.app.SherlockFragmentActivity; -> import android.support.v7.app.ActionBarActivity;
  • импорт com.actionbarsherlock.app.SherlockFragment; -> import android.support.v4.app.Fragment;
  • импорт com.actionbarsherlock.app.SherlockListFragment; -> import android.support.v4.app.ListFragment;
  • импорт com.actionbarsherlock.app.SherlockListActivity; -> import android.support.v7.app.ActionBarActivity; (см. ListActivity/SherlockListActivity)
  • import com.actionbarsherlock.view.Menu; -> import android.view.Menu;
  • импорт com.actionbarsherlock.view.MenuItem; -> import android.view.MenuItem;
  • импорт com.actionbarsherlock.view.MenuInflater; -> import android.view.MenuInflater;
  • импорт com.actionbarsherlock.view.Window; -> import android.view.Window;
  • импорт com.actionbarsherlock.widget.SearchView; -> import android.support.v7.widget.SearchView;
  • import com.actionbarsherlock.widget.SearchView.OnQueryTextListener -> import android.support.v7.widget.SearchView.OnQueryTextListener;

Код Замены:

  • SherlockActivity -> ActionBarActivity
  • SherlockFragmentActivity -> ActionBarActivity
  • SherlockListActivity -> ListActivity (см ListActivity/SherlockListActivity)
  • SherlockListFragment -> ListFragment;

  • getSupportMenuInflater -> getMenuInflater

  • getSherlockActivity() -> getActivity()
  • com.actionbarsherlock.widget.SearchView.OnQueryTextListener() -> OnQueryTextListener (см SearchView)

  • м. setShowAsAction (MenuItem.SHOW_AS_ACTION_ALWAYS); -> MenuItemCompat.setShowAsAction (m, MenuItem.SHOW_AS_ACTION_ALWAYS);

Типичные изменения кода для ActionBarCompat

  • getActionBar() -> getSupportActionBar()
  • invalidateOptionsMenu() -> supportInvalidateOptionsMenu()

== Фрагмент ==

Фрагмент не поддерживает функциональность ActionBarCompat. Это проблема при попытке вызвать getSupportActionBar.

Это может быть решена с помощью метода onAttach:

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    ((ActionBarActivity)activity).getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
} 

Обычно это лучше контролируется в FragmentActivity.

== SearchView ==

Это оказалось немного хлопот.

Заменить что-то вроде этого:

MenuItem searchItem = menu.findItem(R.id.action_search); 
SearchView searchView = (SearchView) searchItem.getActionView(); 

с

MenuItem searchItem = menu.findItem(R.id.action_search); 
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 

Вы также должны настроить меню:

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
<item 
    android:id="@+id/action_search" 
    android:actionViewClass="com.actionbarsherlock.widget.SearchView" 
    android:icon="@android:drawable/ic_menu_search" 
    android:orderInCategory="80" 
    android:showAsAction="always|collapseActionView" 
    android:title="@string/action_search"/> 
</menu> 

с

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" > 
<item 
    android:id="@+id/action_search" 
    android:icon="@android:drawable/ic_menu_search" 
    android:orderInCategory="80" 
    android:title="@string/action_search" 
    app:actionViewClass="android.support.v7.widget.SearchView" 
    app:showAsAction="always|collapseActionView"/> 
</menu> 

Приложение: должно быть определено, чтобы иметь совместимость с версиями android до 11.
SearchView должен быть классом поддержки v7.

== ListActivity/SherlockListActivity ==

ListActivity не поддерживается ActionBarCompat, поэтому важные функции ListActivity должны быть реализованы по эксплуатации, которая довольно проста:

private ListView mListView; 

protected ListView getListView() { 
    if (mListView == null) { 
    mListView = (ListView) findViewById(android.R.id.list); 
    } 
    return mListView; 
} 

protected void setListAdapter(ListAdapter adapter) { 
    getListView().setAdapter(adapter); 
} 

protected ListAdapter getListAdapter() { 
    ListAdapter adapter = getListView().getAdapter(); 
    if (adapter instanceof HeaderViewListAdapter) { 
     return ((HeaderViewListAdapter)adapter).getWrappedAdapter(); 
    } else { 
     return adapter; 
    } 
} 

= = Стили ==

Можно создать стилизованную панель действий, см. Оригинальную публикацию google: http://android-developers.blogspot.de/2013/08/actionbarcompat-and-io-2013-app-source.html

в стиле SearchView коробка сложнее:
Это работает:

MenuItem searchItem = menu.findItem(R.id.action_search); 
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
SearchView.SearchAutoComplete theTextArea = (SearchView.SearchAutoComplete) searchView.findViewById(R.id.search_src_text); 
theTextArea.setTextColor(getResources().getColor(R.color.yourColor)); 

Смотрите эти сообщения:

== Пример

Ящик Google Navigation с панелью действий Шерлок включает в себя весь исходный код (теперь он предназначен для поддержки библиотеки) и форматирования. Только некоторые атрибуты должны были быть заменены аналогичными, поскольку они доступны только начиная с версии v11.

Скачать на: https://github.com/GunnarBs/NavigationDrawerWithActionBarCompat

== См также ==

+0

- все функции поиска доступны на actionBarCompat тоже? например, свертывание/расширение, прослушивание текстовых изменений, ... –

+0

havent попробовал это еще, но выглядит очень всеобъемлющим и кажется, что он спасет меня совсем немного времени. upvote для хорошего ответа –

+1

Только что закончил миграцию в последнее время, ваш ответ помог. Добавление в список: мне пришлось изменить мое '<декларативное имя name =" Theme "' name на 'name =" AppTheme "' в моем файле 'attrs.xml', так как ActionBarCompat использует это пространство имен. Именование стилизованного '' name = Theme ''вызвало кучу конфликтных ошибок, которые не могли найти ресурс и т. Д. Также мне пришлось менять использование' onContentChanged' на 'onSupportContentChanged' в моих классах ActionBarActivity, так как' onContentChanged' является окончательным в библиотеке. – Robert

Смежные вопросы