terça-feira, 28 de novembro de 2017

Como faço para converter de ActionBarSherlock para ActionBarCompat?

Eu fiz algumas migrações e anotei todos os problemas que encontrei. Nenhum foi grave, mas levou tempo para pesquisar. Eu consegui migrar um aplicativo bastante grande em algumas horas depois de saber tudo isso. Isso ajuda a acelerar o processo de migração.

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  ==
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.
== 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:
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:
== 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 ==

Nenhum comentário:

Postar um comentário