2014-11-25 2 views
6

Я перехожу к новой панели инструментов в appcompat v21 из предыдущей панели действий. Я все еще хочу сохранить логотип в левой верхней части панели действий (панель инструментов). Для этого я добавил в свой макет панель инструментов поддержки, и я создал для нее новую.AppCompat v21 Изменение размера логотипа на панели инструментов

app:theme="@style/NewToolBarStyle" 

Я добавляю журнал программно, поскольку для этого есть некоторая логика в приложении.

  actionBar.setLogo(R.drawable.myicon); 

Ссылаясь на мой новый стиль (пустой на данный момент):

<style name="NewToolBarStyle" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
</style> 

Однако результат показывает изображение на слишком большой для того, что я ищу, и мне интересно, как уменьшите размер значка.

Есть ли способ (стиль, макет или программирование), что я могу уменьшить размер логотипа?

ответ

5

Вслед за suggestiong дать по @brightstar Я хотел бы дальше развивать ответ.

Лучший способ управления размером и расположением логотипа на новой панели инструментов - фактически не использовать его. Концепция совершенно другая, вам нужно создать панель инструментов с нуля. Поэтому вам нужно принять решение, либо вы используете макет, заданный actionBar, либо включаете все новое, включая заголовок.

Если вы прекратите использовать логотип, но продолжаете использовать заголовок, вы, наконец, увидите, что логотип над созданием заголовка и информацией о местонахождении.

Итак, пример того, что нужно сделать, это следующее:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
<android.support.v7.widget.Toolbar 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/my_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/action_bar_background" 
     app:theme="@style/NewToolBarStyle" 
     android:minHeight="?attr/actionBarSize" /> 
<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView 
     android:id="@+id/text_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_marginLeft="17dp" 
     android:textSize="20sp" 
     android:layout_toRightOf="@+id/logo_image" 
     android:text="@string/app_name" 
     android:textColor="@color/white" /> 

    <ImageView 
     android:id="@+id/logo_image" 
     android:layout_width="45dp" 
     android:layout_height="45dp" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:scaleType="centerInside" /> 

</RelativeLayout> 
</FrameLayout> 

Вы можете создать этот файл как my_toolbar.xml.Обратите внимание на следующие данные:

  • У меня не было src моего ImageView, потому что я меняю его динамически. Но работы добавляются.
  • Я использовал относительную компоновку для возможности центровки значка и текста.
  • Мне еще нужно включить кнопку «Домой».

Позже, как описано в @brightstar, вам нужно включить в верхнюю часть ваших макетов с помощью include, однако .... не забудьте добавить идентификатор, чтобы вы могли ссылаться на все свои другие Представления.

<include layout="@layout/toolbar_sharemup" 
    android:id="@+id/including" /> 
+0

Какова цель вашего внешнего FrameLayout? В вашем макете панели инструментов должно быть достаточно. Кроме того, идентификатор в include необходим только в том случае, если вы хотите переопределить идентификатор элемента, который вы включаете. Единственный раз, когда это действительно необходимо, это использовать его в относительной компоновке, и вы хотите поместить другие элементы относительно включенного элемента; если да, то удостоверьтесь, что оба идентификатора include и идентификатор включенного элемента совпадают. –

+0

My include имеет идентификатор, чтобы я мог позиционировать другие элементы относительно. Я включил FrameLayout, поскольку мне не удалось включить как относительный макет, так и панель инструментов вместе в том же макете. Есть ли у вас другое предложение? –

7

В дизайне материалов нет логотипа: http://www.google.com/design/spec/layout/structure.html#, поэтому я предполагаю, что это не очень хорошо проверено scenerio - или просто (сломанное) по дизайну. Вы можете добавить ImageView в качестве дочернего виджета вашей панели инструментов и использовать его для отображения любого изображения. Он будет отображаться справа от всех других внутренних виджетов - например, spinner - но режим навигации списка также устарел.

Если вы настаиваете на том, чтобы иметь логотип, тогда мой обходной путь заключается в том, чтобы убедиться, что панель инструментов имеет фиксированную высоту - это заботится о неправильной высоте значка. Даже после этого вам нужно будет установить setAdjustViewBounds в true на панелях инструментов внутреннего логотипа ImageView - иначе он создаст большое левое и правое заполнение.

Это как моя панель выглядит (высота устанавливается на атр/actionBarSize?):

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:layout_height="?attr/actionBarSize" 
    android:layout_width="match_parent" 
    android:minHeight="?attr/actionBarSize" 
    android:background="?attr/colorPrimary" 
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> 
</android.support.v7.widget.Toolbar> 

ссылка его в макете деятельности с использованием:

<include layout="@layout/toolbar_actionbar"/> 

Dont изменения layout_height в включают.

Второго шаг заключается в setAdjustViewBounds (истина) на логотип значке:

Drawable logo = getDrawable(iconRes); 
    toolbar.setLogo(logo); 
    for (int i = 0; i < toolbar.getChildCount(); i++) { 
     View child = toolbar.getChildAt(i); 
     if (child != null) 
     if (child.getClass() == ImageView.class) { 
      ImageView iv2 = (ImageView) child; 
      if (iv2.getDrawable() == logo) { 
      iv2.setAdjustViewBounds(true); 
      } 
     } 
    } 
+0

Благодарим за консультацию. Я хочу просто изменить размер логотипа, сохраняя постоянную панель действий (делая логотип меньше по сравнению с панелью действий). Поэтому, следуя вашей идее, я взял iv2 (мое изображение с логотипом), и я попытался изменить параметры логотипа и его раздавить. Вы знаете, могу ли я это сделать? –

+0

@TrebiaProject. если у вас есть сбои, посмотрите в logcat/exceptions, но это способ взломать, почему вы не добавляете ImageView в качестве дочернего виджета панели инструментов? – marcinj

+0

Хорошо ... Я не знал, что такое возможно. Но это будет означать изменение названия в текстовом виде. Что происходит с кнопкой «домой», знаете ли вы, как я могу получить ее размер, поэтому изображение, которое я представляю, не будет перекрывать его? –

Смежные вопросы