从ActionBarSherlock迁移到ActionBarCompat时有哪些常见问题?

Gun*_*ein 27 android actionbarsherlock android-actionbar android-actionbar-compat

我想从我的应用程序中删除ActionBarSherlock并将其替换为标准的ActionBarCompat.

  • 我如何实现ActionBarCompat?
  • 如何迁移活动?
  • 哪些导入替换ActionBarSherlock导入?
  • 什么是典型问题?

Gun*_*ein 71

我做了一些迁移并写下了我遇到的所有问题.没有一个是严肃的,但花时间研究.在了解了所有这些之后,我能够在几个小时内迁移一个非常大的应用程序.这有助于加快迁移过程.

如何从ActionBarSherlock转换为ActionBarCompat?

注意:自支持库的v22.1.0起,不推荐使用ActionBarActivity类.您应该使用AppCompatActivity.阅读此处获取更多信息:AppCompatActivity与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;)

保存后,这应该可以大大减少活动中的错误.

首先修复菜单周围的错误并忽略片段错误,它们应该稍后消失.

== 替换 ==

进口:

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

代码替换:

  • 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()

== 片段 ==

该片段不适合ActionBarCompat功能.尝试调用getSupportActionBar时出现问题.

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

@Override
public void onAttach(Activity activity) {
  super.onAttach(activity);
  ((ActionBarActivity)activity).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
Run Code Online (Sandbox Code Playgroud)

通常在FragmentActivity中可以更好地控制它.

== SearchView ==

事实证明这有点麻烦.

替换这样的东西:

MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
Run Code Online (Sandbox Code Playgroud)

MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
Run Code Online (Sandbox Code Playgroud)

您还必须调整菜单:

<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>
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

== 样式 ==

可以实现风格化的操作栏,请参阅原始谷歌帖子: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));
Run Code Online (Sandbox Code Playgroud)

看这些帖子:

== 示例 ==

带操作栏的Google导航抽屉Sherlock包含所有原始代码(现在旨在支持库)和格式化.只有一些属性必须用类似的属性替换,因为它们仅从v11开始提供.

下载地址:https://github.com/GunnarBs/NavigationDrawerWithActionBarCompat

== 另见 ==


Hei*_*sch 5

值得一提的是,没有PreferenceActivity的支持版本,因此如果您使用的是SherlockPreferenceActivity,则需要重构支持PreferenceFragment.

更多信息:如何将支持库中的操作栏添加到PreferenceActivity中?


归档时间:

查看次数:

8307 次

最近记录:

10 年,6 月 前