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

2024-04-01

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

  • 如何实现 ActionBarCompat?
  • 如何迁移活动?
  • 哪些导入替代了 ActionBarSherlock 导入?
  • 典型问题有哪些?

我做了一些迁移并写下了我遇到的所有问题。没有一个是认真的,但需要时间进行研究。了解这一切后,我能够在几个小时内迁移一个相当大的应用程序。希望这有助于加快迁移过程。

如何从 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/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 ActionBarSherlock 迁移到 ActionBarCompat 时有哪些常见问题? 的相关文章

随机推荐

  • 如何使某些 JavaFX TreeView 节点不可选择?

    我想在我的 JavaFX 中创建 文件夹 节点TreeView可展开和折叠但是不可选择 I found 这次讨论 https community oracle com thread 2346878并调查了EventFilter 但似乎没有任
  • 在 UISearchController iOS 11 上使用背景图片

    我正在实施一个UISearchController to my UITableView但我在 iOS 11 的定制方面遇到了困难 我的导航栏使用渐变图像背景 我希望搜索控制器能够匹配它 但我还没有找到设置背景图像的方法UISearchCon
  • 如何使用 AJAX 接收 JSON 文件并使用 javascript 解析它?

    我正在尝试解析 foursquare 给我的这个又长又复杂的 JSON 这是我的 AJAX 请求 ajax url https api foursquare com v2 venues explore dataType json data
  • 通用2D游戏资产和绝对节点定位

    我有一个关于通用游戏资产 and 绝对定位 of a SKNodes in Sprite Kit iOS 8 我将尝试通过如下示例来展示我的问题 想象一个2D自上而下游戏 with a SKSpriteNode它代表一座房子 一个房子有多个
  • 从我的应用程序发送电子邮件时如何避免延迟?

    我有一个小型控制台应用程序 它检查一些设置 做出一些决定 然后发送电子邮件 问题是 在我的申请完成之前 电子邮件实际上并未发送 我希望发送电子邮件的方法完成后立即发送电子邮件 最初 我只是创建了一个 MailMessage 并调用 Send
  • Caliburn.Micro 在 WPF 中拖放文件

    我已经使用 Caliburn Micro 2 0 1 创建了桌面应用程序 现在我需要添加拖放行为 用户将从 Windows 资源管理器中拖动文件 我需要获取它的路径 但是我正在搜索两天了 我没有找到任何关于如何为 Caliburn Micr
  • JPA 关系映射概念

    我有几个关于双向映射的问题 我有这些实体 员工 1 1 Parking Lot 员工 1 部门 员工 1 项目 上述关系的源实体和目标实体是什么 业主有何用ManyToOne关系 我想知道楼主是 多个实体还是一个实体 Do mappedBy
  • 如何解析一个巨大的 JSON 文件而不将其加载到内存中

    我有一个很大的 JSON 文件 2 5MB 包含大约 80000 行 它看起来像这样 a 123 b 0 26 c HUGE irrelevant object d 32 我只想为键存储整数值a b and d并忽略 JSON 的其余部分
  • 连接到 wsdl 时出错?

    I do base64string base64 encodestring s s userid passwd replace n authenticationHeader Authorization Basic s base64strin
  • Kill - 它会立即终止进程吗?

    什么是kill到底是怎么做的 我有一个父进程 它正在一个接一个地创建 100 个 作为示例 子进程 在任何孩子的工作结束时 我都会杀死孩子kill pid of child SIGKILL 我看不到ps输出 但是如果父进程出现问题并且我退出
  • Java - 获取泛型类的名称

    我有以下两个课程 class Generic
  • 为什么 React Native 中“Enter”键不触发 onKeyPress?

    我已在文本输入中添加了一个 onKeyPress 事件侦听器 以便当用户在手机键盘上单击 完成 或 转到 或 输入 时 它将调用我的 searchProducts 函数 我希望有一个 onSubmit 类型的事件侦听器选项 但无法找到类似的
  • 如何在意图中添加.apk文件

    我想在意图中添加 apk 文件 我想创建一个 共享 按钮 它将通过蓝牙或任何其他能够发送应用程序的应用程序共享整个应用程序 如果可以通过其他方式完成此操作 请告诉我 谢谢 List ApplicationInfo mAppList getP
  • 如何配置 gradle 仅使用 logback-classic 进行 Android 中的单元测试?

    我有一个使用 slf4j logback 的 Android 应用程序 Gradle 文件如下所示 compile com github tony19 logback android core 1 1 1 6 exclude group c
  • Android PreferenceFragment 找不到片段 id 的视图

    所以我正在制作一个android应用程序 我开始处理首选项 当我简单地使用 PreferenceActivity 时 一切都很完美 但是 如果我将它与 PreferenceFragment 一起使用 那么在我单击调用意图到 Settings
  • 表单身份验证添加附加信息以及 ReturnUrl

    使用表单身份验证 当应用程序需要重定向到登录页面时 是否有一个事件或任何可扩展点可以让我在重定向到登录页面之前对请求执行其他工作 我想在查询字符串中发送附加信息 这些信息可能会有所不同 因此无法将其静态嵌入到 web config 中的 l
  • 在 Android 上解析 DNS SRV 记录的轻量级方法

    在 Android 上进行 SRV 记录查找最节省资源的方法是什么 例如在 XMPP 客户端中 例如yaxim https github com pfleidi yaxim 我知道 JNDI http docs oracle com jav
  • 安装 play 框架 mongodb morphia 模块

    我正在使用以 mongodb 作为后端的 play 框架进行应用程序开发 我已经在我的 ubuntu 和 windows 上成功安装了 mongodb 和 playframework 但是如果我想使用 mongodb 我需要 play 框架
  • MacOS 更喜欢 /bin/sh 还是 /bin/bash?

    我想与某人共享一个脚本 但不确定在 MacOS 上首选哪个 哪一个最好支持 This bin sh echo Here goes my simple script that changes some settings do some stu
  • 从 ActionBarSherlock 迁移到 ActionBarCompat 时有哪些常见问题?

    我想从我的应用程序中删除 ActionBarSherlock 并将其替换为标准 ActionBarCompat 如何实现 ActionBarCompat 如何迁移活动 哪些导入替代了 ActionBarSherlock 导入 典型问题有哪些