アプリケーションからActionBarSherlockを削除し、標準のActionBarCompatに置き換えたいと思います。
私はいくつかの移行を行い、遭遇したすべての問題を書き留めました。深刻なものはありませんでしたが、調査に時間がかかりました。これらすべてを知った後、私は数時間で非常に大きなアプリケーションを移行することができました。これが移行プロセスのスピードアップに役立つことを願っています。
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;
)
保存後、これによりアクティビティのエラーが大幅に減少します。
最初にメニュー周辺のエラーを修正し、今のところフラグメントエラーを無視します。後でなくなるはずです。
==交換==
インポート:
コードの置換:
SherlockListFragment-> ListFragment;
getSupportMenuInflater-> getMenuInflater
com.actionbarsherlock.widget.SearchView.OnQueryTextListener()-> OnQueryTextListener(SearchViewを参照)
m.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); -> MenuItemCompat.setShowAsAction(m、MenuItem.SHOW_AS_ACTION_ALWAYS);
ActionBarCompatの一般的なコード変更
==フラグメント==
このフラグメントは、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
==関連項目==
PreferenceActivityのサポートバージョンがないことは言及する価値があります。したがって、SherlockPreferenceActivityを使用している場合は、サポートPreferenceFragmentにリファクタリングする必要があります。