我想从我的应用程序中删除ActionBarSherlock并将其替换为标准的ActionBarCompat。
答案 0 :(得分:70)
我做了一些迁移并写下了我遇到的所有问题。没有一个是严肃的,但花时间研究。在了解了所有这些之后,我能够在几个小时内迁移一个非常大的应用程序。这有助于加快迁移过程。
如何从ActionBarSherlock转换为ActionBarCompat?
注意:自支持库v22.1.0以来,不推荐使用ActionBarActivity类。您应该使用AppCompatActivity。请阅读此处以获取更多信息:What's the enhancement of AppCompatActivity over ActionBarActivity?
== 切换库 ==
转到app属性并删除ActionBarSherlock并添加ActionBarCompat。这需要存在v7 appcompat库,有关详细信息,请参阅http://developer.android.com/tools/support-library/setup.html。准确地按照说明操作,ActionBarCompat需要是一个库项目。
并行不起作用(很容易),因为两个库中有很多属性。
更换库后,不要因数百个错误而气馁。绝大多数人自动离开。
== 修复XML错误 ==
首先要修复所有XML错误以允许编译并查找其他错误。
用ActionBarCompat主题替换sherlock主题,例如
<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;
)
保存后,这可以大大减少活动中的错误。
首先修复菜单周围的错误并暂时忽略碎片错误,它们应该会在以后消失。
== 替换 ==
<强>进口:强>
代码替换:
SherlockListFragment - &gt; ListFragment;
getSupportMenuInflater - &gt; getMenuInflater
com.actionbarsherlock.widget.SearchView.OnQueryTextListener() - &gt; OnQueryTextListener(参见SearchView)
m.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); - &GT; MenuItemCompat.setShowAsAction(m,MenuItem.SHOW_AS_ACTION_ALWAYS);
ActionBarCompat的典型代码更改
== 片段 ==
该片段不适合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>
app:需要定义为与11之前的Android版本兼容。
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导航抽屉Sherlock包含所有原始代码(现在旨在支持库)和格式化。只有一些属性必须用类似的属性替换,因为它们仅从v11开始提供。
下载地址:https://github.com/GunnarBs/NavigationDrawerWithActionBarCompat
== 另见 ==
答案 1 :(得分:5)
值得一提的是,没有PreferenceActivity的支持版本,因此如果您使用的是SherlockPreferenceActivity,则需要重构支持PreferenceFragment。
更多信息:How to add Action Bar from support library into PreferenceActivity?