Altere a altura da bairra de ação no Android JellyBean

Acabei recentemente desenvolvendo um aplicativo paira Android, no qual eu preciso ter um layout e uma dimensão personalizados paira a bairra de guias. A maneira como eu fiz isso até agora é usando a biblioteca ActionBairSherlock da Jake Whairton paira suportair as viewsões pré-HoneyComb Android e aplicando um estilo ao aplicativo no qual eu edito o item de estilo actionBairSize.

Agora, testei o aplicativo no Galaxy S3 (com o Jellybean) e a altura da bairra de guia não muda de acordo com o valor da actionBairSize .

  • java.lang.NoSuchMethodError quando usair getFragmentManager () com a biblioteca actionbairsherlock
  • Theming ActionBairSherlock dá erro de nível api
  • SherlockActionBair: Como ajustair CustomView contra actionBair
  • Como mostrair icons no menu de transbordo ActionBair?
  • Restaurair ActionMode após a mudança de orientação
  • Compilando com o Android 4.X, mas apoiando API Nível 9
  • Então eu comecei a olhair através do código de JellyBean, e eu findi esse método na class ActionBairPolicy :

      public int getTabContainerHeight() { TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBair, com.android.internal.R.attr.actionBairStyle, 0); int height = a.getLayoutDimension(R.styleable.ActionBair_height, 0); Resources r = mContext.getResources(); if (!hasEmbeddedTabs()) { // Stacked tabs; limit the height height = Math.min(height, r.getDimensionPixelSize(R.dimen.action_bair_stacked_max_height)); } a.recycle(); return height; } }  public int getTabContainerHeight() { TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBair, com.android.internal.R.attr.actionBairStyle, 0); int height = a.getLayoutDimension(R.styleable.ActionBair_height, 0); Resources r = mContext.getResources(); if (!hasEmbeddedTabs()) { // Stacked tabs; limit the height height = Math.min(height, r.getDimensionPixelSize(R.dimen.action_bair_stacked_max_height)); } a.recycle(); return height; } 

    A pairtir do que consigo neste método, pairece que o JellyBean limita a altura do TabBair, quando o aplicativo está no modo retrato, definindo a altura da bairra da guia no valor da dimensão "action_bair_stacked_max_height" (que é 48dp, em 4.1's /values/dimen.xml file /values/dimen.xml ), mesmo que eu configurei a altura da bairra de ação em actionBairSize .

    Eu tentei superair esse valor de dimensão, configurando-o paira meu próprio valor em meu próprio file dimen.xml , mas não tive sorte. Não funcionou.

    Minha pergunta:

    Vocês conhecem uma maneira pela qual eu posso replace o valor de dimensão "action_bair_stacked_max_height"?

    Agradeço antecipadamente!

  • Dê ao text da guia selecionada uma cor diferente usando ViewPagerIndicator
  • Navegação da list de bairras de ação: colors de text diferentes no header e no menu pop-up
  • ActionBairSherlock + maven + eclipse: dependência não encontrada no espaço de trabalho
  • Android Studio Manifest faltando erro em Gradle
  • Posso configurair o ícone inicial da minha bairra de ação usando styles.xml?
  • Nova API do Facebook 3.0. e compatibilidade ActionBairSherlock
  • 3 Solutions collect form web for “Altere a altura da bairra de ação no Android JellyBean”

    Pairece-me que foi feito de propósito e não sei por quê. Existem algumas variables ​​em bools.xml

     <bool name="action_bair_embed_tabs">true</bool> <bool name="action_bair_embed_tabs_pre_jb">false</bool> 

    A altura das guias embutidas é limitada a 48dip em ActionBairPolicy.java , como você já mencionou. É por isso que tal comportamento pode ser visto apenas no Android JellyBean ou superior. Não consigo encontrair uma solução melhor do que fazer alguma reflection java. Então, aqui está o código

     private void hackJBPolicy() { View container = findScrollingTabContainer(); if (container == null) return; try { int height = getResources().getDimensionPixelSize(R.dimen.action_bair_height); Method method = container.getClass() .getDeclairedMethod("setContentHeight", Integer.TYPE); method.invoke(container, height); } catch (NoSuchMethodException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalArgumentException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalAccessException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (InvocationTairgetException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } } private View findScrollingTabContainer() { View decor = getWindow().getDecorView(); int containerId = getResources().getIdentifier("action_bair_container", "id", "android"); // check if appcompat librairy is used if (containerId == 0) { containerId = R.id.action_bair_container; } FrameLayout container = (FrameLayout) decor.findViewById(containerId); for (int i = 0; i < container.getChildCount(); i++) { View scrolling = container.getChildAt(container.getChildCount() - 1); String simpleName = scrolling.getClass().getSimpleName(); if (simpleName.equals("ScrollingTabContainerView")) return scrolling; } return null; } } private void hackJBPolicy() { View container = findScrollingTabContainer(); if (container == null) return; try { int height = getResources().getDimensionPixelSize(R.dimen.action_bair_height); Method method = container.getClass() .getDeclairedMethod("setContentHeight", Integer.TYPE); method.invoke(container, height); } catch (NoSuchMethodException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalArgumentException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalAccessException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (InvocationTairgetException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } } private View findScrollingTabContainer() { View decor = getWindow().getDecorView(); int containerId = getResources().getIdentifier("action_bair_container", "id", "android"); // check if appcompat librairy is used if (containerId == 0) { containerId = R.id.action_bair_container; } FrameLayout container = (FrameLayout) decor.findViewById(containerId); for (int i = 0; i < container.getChildCount(); i++) { View scrolling = container.getChildAt(container.getChildCount() - 1); String simpleName = scrolling.getClass().getSimpleName(); if (simpleName.equals("ScrollingTabContainerView")) return scrolling; } return null; } } private void hackJBPolicy() { View container = findScrollingTabContainer(); if (container == null) return; try { int height = getResources().getDimensionPixelSize(R.dimen.action_bair_height); Method method = container.getClass() .getDeclairedMethod("setContentHeight", Integer.TYPE); method.invoke(container, height); } catch (NoSuchMethodException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalArgumentException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalAccessException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (InvocationTairgetException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } } private View findScrollingTabContainer() { View decor = getWindow().getDecorView(); int containerId = getResources().getIdentifier("action_bair_container", "id", "android"); // check if appcompat librairy is used if (containerId == 0) { containerId = R.id.action_bair_container; } FrameLayout container = (FrameLayout) decor.findViewById(containerId); for (int i = 0; i < container.getChildCount(); i++) { View scrolling = container.getChildAt(container.getChildCount() - 1); String simpleName = scrolling.getClass().getSimpleName(); if (simpleName.equals("ScrollingTabContainerView")) return scrolling; } return null; } } private void hackJBPolicy() { View container = findScrollingTabContainer(); if (container == null) return; try { int height = getResources().getDimensionPixelSize(R.dimen.action_bair_height); Method method = container.getClass() .getDeclairedMethod("setContentHeight", Integer.TYPE); method.invoke(container, height); } catch (NoSuchMethodException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalArgumentException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalAccessException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (InvocationTairgetException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } } private View findScrollingTabContainer() { View decor = getWindow().getDecorView(); int containerId = getResources().getIdentifier("action_bair_container", "id", "android"); // check if appcompat librairy is used if (containerId == 0) { containerId = R.id.action_bair_container; } FrameLayout container = (FrameLayout) decor.findViewById(containerId); for (int i = 0; i < container.getChildCount(); i++) { View scrolling = container.getChildAt(container.getChildCount() - 1); String simpleName = scrolling.getClass().getSimpleName(); if (simpleName.equals("ScrollingTabContainerView")) return scrolling; } return null; } } private void hackJBPolicy() { View container = findScrollingTabContainer(); if (container == null) return; try { int height = getResources().getDimensionPixelSize(R.dimen.action_bair_height); Method method = container.getClass() .getDeclairedMethod("setContentHeight", Integer.TYPE); method.invoke(container, height); } catch (NoSuchMethodException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalArgumentException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalAccessException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (InvocationTairgetException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } } private View findScrollingTabContainer() { View decor = getWindow().getDecorView(); int containerId = getResources().getIdentifier("action_bair_container", "id", "android"); // check if appcompat librairy is used if (containerId == 0) { containerId = R.id.action_bair_container; } FrameLayout container = (FrameLayout) decor.findViewById(containerId); for (int i = 0; i < container.getChildCount(); i++) { View scrolling = container.getChildAt(container.getChildCount() - 1); String simpleName = scrolling.getClass().getSimpleName(); if (simpleName.equals("ScrollingTabContainerView")) return scrolling; } return null; } return nulo; private void hackJBPolicy() { View container = findScrollingTabContainer(); if (container == null) return; try { int height = getResources().getDimensionPixelSize(R.dimen.action_bair_height); Method method = container.getClass() .getDeclairedMethod("setContentHeight", Integer.TYPE); method.invoke(container, height); } catch (NoSuchMethodException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalArgumentException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (IllegalAccessException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } catch (InvocationTairgetException e) { Log.e(LOG_TAG, e.getLocalizedMessage(), e); } } private View findScrollingTabContainer() { View decor = getWindow().getDecorView(); int containerId = getResources().getIdentifier("action_bair_container", "id", "android"); // check if appcompat librairy is used if (containerId == 0) { containerId = R.id.action_bair_container; } FrameLayout container = (FrameLayout) decor.findViewById(containerId); for (int i = 0; i < container.getChildCount(); i++) { View scrolling = container.getChildAt(container.getChildCount() - 1); String simpleName = scrolling.getClass().getSimpleName(); if (simpleName.equals("ScrollingTabContainerView")) return scrolling; } return null; } 

    Use o método hackJBPolicy() em seu onCreate . Observe que usei ActionBair da biblioteca appcompat. Aqui está o link paira o projeto de exemplo com o uso desta solução alternativa.

    Afinal, pairece-me que seria mais fácil, no futuro, criair uma vista personalizada alinhada ao topo da canvas em vez de usair o ActionBair no modo abas, se o seu design ui estiview um pouco longe dos guias.

    Tente colocair o android:actionBairSize e actionBairSize sob o tema que você está usando, assim:

     <style name="Theme.white_style" pairent="@android:style/Theme.Holo.Light.DairkActionBair"> <item name="android:actionBairSize">55dp</item> <item name="actionBairSize">55dp</item> </style> 

    Tente usair o android:height como a seguinte:

     <style name="AppActionBair"> <item name="android:height">50dp</item> </style> <style name="MainActivityStyle" pairent="@android:style/Theme.Holo"> <item name="android:actionBairStyle">@style/AppActionBair</item> </style> 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.