我做了一些迁移并写下了我遇到的所有问题。没有一个是认真的,但需要时间进行研究。了解这一切后,我能够在几个小时内迁移一个相当大的应用程序。希望这有助于加快迁移过程。
如何从 ActionBarSherlock 转换为 ActionBarCompat?
注意:自支持库 v22.1.0 起,ActionBarActivity 类已被弃用。您应该使用 AppCompatActivity 来代替。阅读此处了解更多信息:AppCompatActivity 相对于 ActionBarActivity 有何增强? https://stackoverflow.com/questions/29797172/whats-the-enhancement-of-appcompatactivity-over-actionbaractivity
== 切换库 ==
转到应用程序属性并删除 ActionBarSherlock 并添加 ActionBarCompat。这需要 v7 appcompat 库存在,请参阅http://developer.android.com/tools/support-library/setup.html http://developer.android.com/tools/support-library/setup.html了解详情。严格按照说明进行操作,ActionBarCompat 需要是一个库项目。
并行并不(容易)工作,因为两个库中都有很多属性。
更换库后,不要因数百个错误而气馁。绝大多数会自动消失。
== 修复 XML 错误 ==
首先是修复所有 XML 错误以允许编译并查找其他错误。
将 sherlock 主题替换为 ActionBarCompat 主题,例如
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
删除双重属性,例如<attr name="buttonBarStyle" format="reference" />
.
现在删除所有单独的操作栏样式。进一步了解如何处理这些。
== 修复构建错误 ==
首先选择最简单的活动。 ActionBarCompat不区分Activity和FragmentActivity,现在都是ActionBarActivity。
删除 ActionBarSherlock 导入并扩展到 ActionBarActivity (import android.support.v7.app.ActionBarActivity;
)
保存后,这应该会大大减少活动中的错误。
首先修复菜单周围的错误,暂时忽略片段错误,它们应该稍后就会消失。
== 替换品 ==
Imports:
- 导入com.actionbarsherlock.app.SherlockActivity; -> 导入 android.support.v7.app.ActionBarActivity;
- 导入 com.actionbarsherlock.app.SherlockFragmentActivity; -> 导入 android.support.v7.app.ActionBarActivity;
- 导入 com.actionbarsherlock.app.SherlockFragment; -> 导入android.support.v4.app.Fragment;
- 导入 com.actionbarsherlock.app.SherlockListFragment; -> 导入 android.support.v4.app.ListFragment;
- 导入 com.actionbarsherlock.app.SherlockListActivity; -> 导入 android.support.v7.app.ActionBarActivity; (参见ListActivity / SherlockListActivity)
- 导入com.actionbarsherlock.view.Menu; -> 导入 android.view.Menu;
- 导入 com.actionbarsherlock.view.MenuItem; -> 导入 android.view.MenuItem;
- 导入 com.actionbarsherlock.view.MenuInflater; -> 导入 android.view.MenuInflater;
- 导入 com.actionbarsherlock.view.Window; -> 导入 android.view.Window;
- 导入 com.actionbarsherlock.widget.SearchView; -> 导入 android.support.v7.widget.SearchView;
- 导入 com.actionbarsherlock.widget.SearchView.OnQueryTextListener -> 导入 android.support.v7.widget.SearchView.OnQueryTextListener;
代码替换:
- Sherlock 活动 -> ActionBarActivity
- Sherlock FragmentActivity -> ActionBarActivity
- SherlockListActivity -> ListActivity(参见 ListActivity / SherlockListActivity)
SherlockListFragment -> ListFragment;
getSupportMenuInflater -> getMenuInflater
- getSherlockActivity() -> getActivity()
com.actionbarsherlock.widget.SearchView.OnQueryTextListener() -> OnQueryTextListener (参见 SearchView)
m.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); -> MenuItemCompat.setShowAsAction(m, MenuItem.SHOW_AS_ACTION_ALWAYS);
ActionBarCompat 的典型代码更改
- getActionBar() -> getSupportActionBar()
- invalidateOptionsMenu() -> supportInvalidateOptionsMenu()
== Fragment ==
该片段不满足 ActionBarCompat 功能。当尝试调用 getSupportActionBar 时,这是一个问题。
可以使用onAttach方法解决这个问题:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((ActionBarActivity)activity).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
通常这在 FragmentActivity 中可以更好地控制。
== 搜索视图 ==
结果这有点麻烦。
替换这样的东西:
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
with
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>
with
<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>
app:需要定义兼容11之前的android版本。
SearchView 需要支持类 v7。
== 列表活动 / Sherlock列表活动 ==
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;
}
}
== Styles ==
可以实现样式化的操作栏,请参阅Google原始帖子:http://android-developers.blogspot.de/2013/08/actionbarcompat-and-io-2013-app-source.html 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));
请参阅这些帖子:
- 在没有 ActionBarSherlock 的情况下更改 SearchView 中的光标颜色 https://stackoverflow.com/questions/18705185/changing-the-cursor-color-in-searchview-without-actionbarsherlock
- 更改appcompat的SearchView文本和提示颜色 https://stackoverflow.com/questions/18259707/change-appcompats-searchview-text-and-hint-color?rq=1
== Example ==
带操作栏 Sherlock 的 Google 导航抽屉包含所有原始代码(现在旨在支持库)和格式。只有一些属性必须替换为类似的属性,因为它们仅从 v11 开始可用。
下载地址:https://github.com/GunnarBs/NavigationDrawerWithActionBarCompat https://github.com/GunnarBs/NavigationDrawerWithActionBarCompat
== See also ==
- http://android-developers.blogspot.de/2013/08/actionbarcompat-and-io-2013-app-source.html http://android-developers.blogspot.de/2013/08/actionbarcompat-and-io-2013-app-source.html
- http://developer.android.com/reference/android/support/v7/app/ActionBar.html http://developer.android.com/reference/android/support/v7/app/ActionBar.html
- http://www.grokkingandroid.com/migration-actionbarsherlock-actionbarcompat/ http://www.grokkingandroid.com/migrating-actionbarsherlock-actionbarcompat/