2014-11-25 51 views
6

Przeprowadzam migrację do nowej funkcji paska narzędzi w aplikacji appcompat v21 z poprzedniego paska działań. Nadal chcę zachować logo w lewej górnej części paska akcji (pasek narzędzi). Do wykonania dodałem w moim układzie pasek narzędzi wsparcia i stworzyłem dla niego nowy.Pasek narzędzi AppCompat v21 zmieniający rozmiar logo

app:theme="@style/NewToolBarStyle" 

Dodaję logicznie programowo, ponieważ w aplikacji jest jakaś logika.

  actionBar.setLogo(R.drawable.myicon); 

Nawiązując do mojego nowego stylu (pusty na razie):

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

Jednak wynik jest wyświetlany obraz ten jest zbyt duży dla czego szukam, i zastanawiam się, jak zmniejszyć rozmiar ikony.

Czy jest jakiś sposób (styl, układ lub programowanie), że mogę zmniejszyć rozmiar logo?

Odpowiedz

5

W następstwie suggestiong dać przez @brightstar chciałbym dalej rozwijać odpowiedź.

Najlepszym sposobem kontrolowania rozmiaru i pozycji logo na nowym pasku narzędziowym jest jego nieużywanie. Koncepcja jest zupełnie inna, wystarczy utworzyć pasek narzędzi od podstaw. Musisz więc podjąć decyzję, albo użyjesz układu podanego przez actionBar, albo zawrzesz wszystko nowe, łącznie z tytułem.

Jeśli przestaniesz używać logo, ale nadal będziesz używać tego tytułu, w końcu zobaczysz, że logo znajduje się nad tytułem, tworząc i ood sytuacji.

więc przykładem tego, co zrobić, jest następujący:

<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> 

utworzyć ten plik jako my_toolbar.xml.Zwróć uwagę na następujące szczegóły:

  • Nie dodałem src do mojego ImageView, ponieważ zmieniam go dinamicznie. Ale działa dodając to.
  • Użyłem układu względnego, aby móc wyśrodkować ikonę i tekst.
  • Potrzebuję jeszcze dołączyć przycisk Strona główna.

Później, jak opisuje @brightstar, musisz uwzględnić w górnej części swoich układów przez włączanie, jednak .... pamiętaj, aby dodać identyfikator, aby można było odnieść wszystkie inne widoki do niego.

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

Jaki jest cel twojego zewnętrznego FrameLayout? W twoim układzie pasek narzędzi sam w sobie powinien wystarczyć. Ponadto identyfikator w uwzględnieniu jest potrzebny tylko wtedy, gdy chcesz przesłonić identyfikator przedmiotu, który dołączasz. Jedyny czas, który jest naprawdę potrzebny, to użycie go w układzie względnym i ustawienie innych elementów względem dołączonego elementu; jeśli tak, upewnij się, że zarówno identyfikator dołączania, jak i id elementu dołączonego są zgodne. –

+0

Moje uwzględnienie ma identyfikator, dzięki czemu mogę względnie pozycjonować inne pozycje. Zawarłem FrameLayout, ponieważ nie byłem w stanie uwzględnić zarówno względnego układu, jak i paska narzędzi w tym samym układzie. Czy masz kolejną propozycję? –

7

Brak ikony logo w materiale: http://www.google.com/design/spec/layout/structure.html#, więc przypuszczam, że nie jest to dobrze przetestowane scenerio - lub po prostu (zepsute) według projektu. Możesz dodać ImageView jako widżet podrzędny paska narzędzi i użyć go do wyświetlenia dowolnego obrazu. Zostanie wyświetlony po prawej stronie wszystkich innych wewnętrznych widgetów - takich jak spinner - ale tryb nawigacji po liście jest również przestarzały.

Jeśli nalegasz na posiadanie logo, moim sposobem obejścia tego problemu jest upewnienie się, że pasek narzędzi ma stałą wysokość - to dba o niewłaściwą wysokość ikony. Nawet po tym będziesz musiał ustawić właściwość setAdjustViewBounds na true na wewnętrznych belkach graficznych ImageView - w przeciwnym razie stworzy duże lewe i prawe wypełnienie.

To jest jak mój pasek narzędzi wygląda (wysokość ustawiona w ciekawy/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> 

odniesienie go wewnątrz układu działalności przy użyciu:

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

nie zmiany layout_height w to.

Drugim krokiem jest setAdjustViewBounds (prawda), logo ikony:

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

Dzięki za poradę. Chcę tylko zmienić rozmiar logo, utrzymując stały pasek akcji (zmniejszając logo w stosunku do paska akcji). Więc podążając za twoim pomysłem wziąłem iv2 (mój obraz logo) i próbowałem zmodyfikować parametry logo i to zmiażdżyć. Czy wiesz, czy mogę to zrobić? –

+0

@TrebiaProject. jeśli masz awarie, spójrz na logcat/wyjątki, ale to jest sposób na hackish, dlaczego nie dodasz ImageView jako widżetu podrzędnego paska narzędzi? – marcinj

+0

Ok ... Nie wiedziałem, że coś takiego jest możliwe. Ale to również oznacza zmianę tytułu na widok tekstowy. Co powiesz na przycisk strony głównej, czy wiesz, w jaki sposób mogę uzyskać jego rozmiar, aby obraz, który wprowadzam, nie nałożył się na niego? –

Powiązane problemy