从ActionBarSherlock移植到ActionBarCompat时常见的问题是什么?

我想从我的应用程序中删除ActionBarSherlock,并将其replace为标准的ActionBarCompat。

  • 我如何实现ActionBarCompat?
  • 我如何迁移Activites?
  • 哪个导入replace了ActionBarSherlock导入?
  • 典型的问题是什么?

Solutions Collecting From Web of "从ActionBarSherlock移植到ActionBarCompat时常见的问题是什么?"

我做了一些迁移,写下了我遇到的所有问题。 没有一个是严肃的,但花时间去研究。 知道了这一切之后,我能够在几个小时内迁移一个相当大的应用程序。 这可能有助于加快迁移过程。

我如何从ActionBarSherlock转换到ActionBarCompat?

注意:自支持库v22.1.0以来,不推荐使用类ActionBarActivity。 您应该使用AppCompatActivity。 请阅读此处获取更多信息: AppCompatActivity相比ActionBarActivity有什么改进?

== 切换库 ==

转到应用程序属性并删除ActionBarSherlock并添加ActionBarCompat。 这需要v7 appcompat库存在,详情请参阅http://developer.android.com/tools/support-library/setup.html 。 按照说明精确,ActionBarCompat需要是一个库项目。

并行不能(很容易),因为在这两个库中有很多属性。

更换库后,不要因为数百个错误而灰心丧气。 绝大多数自动消失。

== 修复XML错误 ==

首先是修复所有XML错误,以便编译和查找其他错误。

用ActionBarCompat Themereplacesherlock主题,例如
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">

删除两个attr,例如<attr name="buttonBarStyle" format="reference" />

现在删除所有您个人的操作栏样式。 进一步了解如何处理这些。

== 修复构build错误 ==

首先select最简单的活动。 ActionBarCompat不区分Activity和FragmentActivity,都是现在的ActionBarActivity。

删除ActionBarSherlock导入并扩展到ActionBarActivity( import android.support.v7.app.ActionBarActivity;

保存后,这应该大大减less活动中的错误。

首先修正菜单上的错误,并忽略片段错误,然后再离开。

== replace ==

import:

  • import com.actionbarsherlock.app.SherlockActivity; – > import android.support.v7.app.ActionBarActivity;
  • import com.actionbarsherlock.app.SherlockFragmentActivity; – > import android.support.v7.app.ActionBarActivity;
  • import com.actionbarsherlock.app.SherlockFragment; – > import android.support.v4.app.Fragment;
  • import com.actionbarsherlock.app.SherlockListFragment; – > import android.support.v4.app.ListFragment;
  • import com.actionbarsherlock.app.SherlockListActivity; – > import android.support.v7.app.ActionBarActivity; (请参阅ListActivity / SherlockListActivity)
  • import com.actionbarsherlock.view.Menu; – > import android.view.Menu;
  • import com.actionbarsherlock.view.MenuItem; – > import android.view.MenuItem;
  • import com.actionbarsherlock.view.MenuInflater; – > import android.view.MenuInflater;
  • import com.actionbarsherlock.view.Window; – > import android.view.Window;
  • import com.actionbarsherlock.widget.SearchView; – > import android.support.v7.widget.SearchView;
  • import com.actionbarsherlock.widget.SearchView.OnQueryTextListener – > import android.support.v7.widget.SearchView.OnQueryTextListener;

代码replace:

  • SherlockActivity – > ActionBarActivity
  • SherlockFragmentActivity – > 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()

== 片段 ==

该片段不满足ActionBarCompatfunction。 尝试调用getSupportActionBar时,这是一个问题。

这可以通过使用onAttach方法来解决:

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

通常这在FragmentActivity中被更好地控制。

== SearchView ==

事实certificate,这有点麻烦。

replace这样的东西:

 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> 

应用程序:需要被定义为与11之前的Android版本兼容。
SearchView需要支持类v7。

== ListActivity / SherlockListActivity ==

ListActivity不支持ActionBarCompat,因此ListActivity的关键function需要手动实现,这很简单:

 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; } } 

== 样式 ==

一个风格的行动栏可以实现,看到原来的谷歌发布: 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)); 

看到这些post:

  • 在没有ActionBarSherlock的情况下更改SearchView中的光标颜色
  • 更改appcompat的SearchView文本和提示颜色

== 例子 ==

谷歌导航抽屉与行动吧Sherlock包括所有原始代码(现在旨在支持库)和格式。 只有一些属性必须replace为类似的属性,因为它们只能从v11开始提供。

从以下url下载: https : //github.com/GunnarBs/NavigationDrawerWithActionBarCompat

== 另请参阅 ==

值得一提的是,PreferenceActivity没有支持版本,所以如果您使用的是SherlockPreferenceActivity,则需要重构为PreferenceFragment支持。

更多信息: 如何将Action Bar从支持库添加到PreferenceActivity中?