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

  • 如何实现ActionBarCompat?
  • 如何迁移 Activity ?
  • 哪些导入替换了ActionBarSherlock导入?
  • 典型的问题是什么?
  • 最佳答案

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

    如何从ActionBarSherlock转换为ActionBarCompat?

    注意:从支持库的v22.1.0版本开始,不赞成使用ActionBarActivity类。您应该改用AppCompatActivity。在这里阅读更多信息:What's the enhancement of AppCompatActivity over ActionBarActivity?

    == 切换库 ==

    转到应用程序属性,然后删除ActionBarSherlock并添加ActionBarCompat。这要求存在v7 appcompat库,有关详细信息,请参见http://developer.android.com/tools/support-library/setup.html。严格按照说明进行操作,ActionBarCompat必须是一个库项目。

    并行不起作用(很容易),因为两个库中都有很多属性。

    替换库后,不要因成百上千的错误而气disc。绝大多数自动消失。

    == 修复XML错误 ==

    第一件事是修复所有XML错误,以允许编译和查找其他错误。

    将Sherlock主题替换为ActionBarCompat主题,例如<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    删除双attr,例如<attr name="buttonBarStyle" format="reference" />

    现在,删除所有单独的操作栏样式。进一步了解如何处理这些问题。

    == 修复构建错误 ==

    首先选择最简单的 Activity 。 ActionBarCompat不能区分Activity和FragmentActivity,它们现在都是ActionBarActivity。

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

    保存后,这将大大减少 Activity 中的错误。

    请先修复菜单周围的错误,然后暂时忽略片段错误,然后再消除它们。

    == 替换 ==

    导入:

  • import com.actionbarsherlock.app.SherlockActivity; ->导入android.support.v7.app.ActionBarActivity;
  • import com.actionbarsherlock.app.SherlockFragmentActivity; ->导入android.support.v7.app.ActionBarActivity;
  • import com.actionbarsherlock.app.SherlockFragment; ->导入android.support.v4.app.Fragment;
  • import com.actionbarsherlock.app.SherlockListFragment; ->导入android.support.v4.app.ListFragment;
  • import com.actionbarsherlock.app.SherlockListActivity; ->导入android.support.v7.app.ActionBarActivity; (请参阅ListActivity/SherlockListActivity)
  • import com.actionbarsherlock.view.Menu; ->导入android.view.Menu;
  • import com.actionbarsherlock.view.MenuItem; ->导入android.view.MenuItem;
  • import com.actionbarsherlock.view.MenuInflater; ->导入android.view.MenuInflater;
  • import com.actionbarsherlock.view.Window; ->导入android.view.Window;
  • import com.actionbarsherlock.widget.SearchView; ->导入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);
    }
    

    通常,这可以在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));
    

    看到这些帖子:
  • Changing the cursor color in SearchView without ActionBarSherlock
  • Change appcompat's SearchView text and hint color

  • == 示例 ==

    带有Action Bar Sherlock的Google导航抽屉包含所有原始代码(现在旨在支持库)和格式。因为只有从v11开始才可用,所以仅需将某些属性替换为相似的属性。

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

    == 另请参阅 ==
  • 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://www.grokkingandroid.com/migrating-actionbarsherlock-actionbarcompat/
  • 关于android - 从ActionBarSherlock迁移到ActionBarCompat时常见的问题是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20933944/

    10-10 03:48