Я сделал некоторые миграции и записал все проблемы, с которыми я столкнулся. Ни один из них не был серьезным, но уделил время исследованиям. Через пару часов я смог перенести довольно большое приложение, зная все это. Пусть это поможет ускорить процесс миграции.
Как мне преобразовать из 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
== См также ==
Google сказал мне: [ссылка] (http://www.grokkingandroid.com/migrating-actionbarsherlock-actionbarcompat/) –
да, не видел, что во времени. Смотрите мой более длинный ответ. –