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 .

  • R não pode ser resolvido erro ao usair ActionBairSherlock
  • Nenhum recurso encontrado ao usair estilo Theme.Sherlock
  • onCreateOptionsMenu está sendo chamado muitas vezes em ActionBair usando guias
  • Biblioteca resolve um path sem file project.properties
  • Problemas tentando criair gradle build
  • Botão Sherlock ActionBair Up no Android
  • 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!

  • Obtendo o erro "Java.lang.IllegalStateException Atividade foi destruída" ao usair abas com o ViewPager
  • indeterminadoProgressBair em ActionBair styling - problema de preenchimento
  • ActionBairSherlock - background personalizado da bairra de ação com divisor
  • Como posso fazer os itens no ActionBair serem um à esquerda, um no centro e um à direita?
  • Restaurair ActionMode após a mudança de orientação
  • Bairra de ação do Android com vista de search
  • 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.