web-dev-qa-db-ja.com

ActionBarSherlockからActionBarCompatに移行する際の一般的な問題は何ですか?

アプリケーションからActionBarSherlockを削除し、標準のActionBarCompatに置き換えたいと思います。

  • ActionBarCompatを実装するにはどうすればよいですか?
  • Activitesを移行するにはどうすればよいですか?
  • ActionBarSherlockのインポートを置き換えるインポートはどれですか?
  • 典型的な問題は何ですか?
27

私はいくつかの移行を行い、遭遇したすべての問題を書き留めました。深刻なものはありませんでしたが、調査に時間がかかりました。これらすべてを知った後、私は数時間で非常に大きなアプリケーションを移行することができました。これが移行プロセスのスピードアップに役立つことを願っています。

ActionBarSherlockからActionBarCompatに変換するにはどうすればよいですか?

注:サポートライブラリのv22.1.0以降、クラスActionBarActivityは非推奨になりました。代わりにAppCompatActivityを使用する必要があります。詳細については、こちらをお読みください: ActionBarActivityに対するAppCompatActivityの拡張機能は何ですか?

==ライブラリを切り替えます==

アプリのプロパティに移動し、ActionBarSherlockを削除して、代わりにActionBarCompatを追加します。これには、v7 appcompatライブラリが存在する必要があります。詳細については、 http://developer.Android.com/tools/support-library/setup.html を参照してください。指示に正確に従ってください。ActionBarCompatはライブラリプロジェクトである必要があります。

多くの属性が両方のライブラリにあるため、Parallelは(簡単に)機能しません。

ライブラリを交換した後、何百ものエラーに落胆しないでください。大多数は自動的に消えます。

==XMLエラーを修正==

まず、すべてのXMLエラーを修正して、コンパイルを許可し、他のエラーを見つけることです。

シャーロックテーマを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;

保存後、これによりアクティビティのエラーが大幅に減少します。

最初にメニュー周辺のエラーを修正し、今のところフラグメントエラーを無視します。後でなくなるはずです。

==交換==

インポート:

  • インポート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をインポートします。
  • 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>

アプリ: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

==関連項目==

71

PreferenceActivityのサポートバージョンがないことは言及する価値があります。したがって、SherlockPreferenceActivityを使用している場合は、サポートPreferenceFragmentにリファクタリングする必要があります。

詳細: サポートライブラリからPreferenceActivityにアクションバーを追加する方法は?

5
Heinrisch