Como faço para converter de ActionBarSherlock para ActionBarCompat?
ota: desde a v22.1.0 da Biblioteca de Suporte, a classe ActionBarActivity está obsoleta. Você deve usar AppCompatActivity em vez disso. Leia aqui para obter mais informações: qual o aprimoramento do AppCompatActivity sobre ActionBarActivity?
== Mudar as bibliotecas ==
Vá para as propriedades do aplicativo e remova ActionBarSherlock e adicione ActionBarCompat em vez disso. Isso exige que a biblioteca do app7t da v7 esteja presente, veja http://developer.android.com/tools/support-library/setup.html para obter detalhes. Siga as instruções com precisão, o ActionBarCompat precisa ser um projeto de biblioteca.
Paralelo não funciona (facilmente), pois muitos dos atributos estão em ambas as bibliotecas.
Não seja desencorajado por centenas de erros após a substituição das bibliotecas. A grande maioria desaparece automaticamente.
== corrigir erros XML ==
A primeira coisa é corrigir todos os erros XML para permitir compilar e encontrar outros erros.
Substitua o tema sherlock pelo tema ActionBarCompat, por exemplo,
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
Remova attr duplo, eg
<attr name="buttonBarStyle" format="reference" />
.
Por enquanto, remova todos os seus estilos de barra de ação individuais. Veja mais abaixo como lidar com isso.
== corrigir erros de compilação ==
Escolha as atividades mais fáceis primeiro. ActionBarCompat não distingue Activity e FragmentActivity, ambos agora são ActionBarActivity.
Remova as importações do ActionBarSherlock e se estenda para ActionBarActivity (
import android.support.v7.app.ActionBarActivity;
)
Após salvar, isso deve reduzir drasticamente os erros na atividade.
Corrija os erros em torno dos menús primeiro e desconsidere os erros de fragmentos por enquanto, eles deveriam estar indo mais tarde.
== Substituições ==
Importações:
- 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; (see 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;
Substituições de código:
- SherlockActivity -> ActionBarActivity
- SherlockFragmentActivity -> ActionBarActivity
- SherlockListActivity -> ListActivity (veja ListActivity / SherlockListActivity)
- SherlockListFragment -> ListFragment;
- getSupportMenuInflater -> getMenuInflater
- getSherlockActivity () -> getActivity ()
- com.actionbarsherlock.widget.SearchView.OnQueryTextListener () -> OnQueryTextListener (veja SearchView)
- m.setShowAsAction (MenuItem.SHOW_AS_ACTION_ALWAYS); -> MenuItemCompat.setShowAsAction (m, MenuItem.SHOW_AS_ACTION_ALWAYS);
Alterações típicas do código para ActionBarCompat
- getActionBar () -> getSupportActionBar ()
- invalidateOptionsMenu () -> supportInvalidateOptionsMenu ()
== Fragment ==
O Fragment não atende a funcionalidade ActionBarCompat. Este é um problema ao tentar chamar getSupportActionBar.
Isso pode ser resolvido usando o método onAttach:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((ActionBarActivity)activity).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
Normalmente, isso é melhor controlado no FragmentActivity.
== SearchView ==
Isso resultou ser um pouco incomodo.
Substitua algo como isto:
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
com
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
Você também precisa ajustar seu menu:
<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>
com
<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>
aplicativo: precisa ser definido para ter compatibilidade com as versões do Android até 11.
SearchView precisa ser a classe de suporte v7.
SearchView precisa ser a classe de suporte v7.
== ListActivity / SherlockListActivity ==
O ListActivity não é suportado ActionBarCompat, portanto, as funções cruciais do ListActivity precisam ser implementadas manualmente, o que é bastante simples:
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;
}
}
== Estilos ==
Uma barra de ação de estilo pode ser alcançada, veja publicação original do google: http://android-developers.blogspot.de/2013/08/actionbarcompat-and-io-2013-app-source.html
Uma caixa de pesquisa de estilo é mais difícil:
isso funciona:
isso funciona:
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));
Veja estas postagens:
- Alterando a cor do cursor no SearchView sem ActionBarSherlock
- Altere o texto do SearchView da Appcompat e a cor da sugestão
== Exemplo ==
Gaveta de navegação do Google com barra de ação O Sherlock inclui todo o código original (agora com o objetivo de suportar a biblioteca) e formatação. Somente alguns atributos tiveram que ser substituídos por outros semelhantes, pois eles só estão disponíveis a partir do v11 em diante.
== Veja também ==
- 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/
Nenhum comentário:
Postar um comentário