8

Przeszedłem wiele odpowiedzi tutaj związanych z Toolbar, ale żadna z odpowiedzi nie mogła mi pomóc.Rozszerzony pasek narzędzi z niestandardowym widokiem nie wyświetlającym się z pełną szerokością

Co staram się osiągnąć, to mieć rozszerzony pasek narzędzi, który wyświetli logo, ewentualnie nazwę działania/aplikacji, będzie miał przycisk/szufladę z przełącznikiem w prawo, który wyświetli jak szuflada po prawej stronie, menu przepełnienia z innymi opcjami, takimi jak ustawienia, a także zakładka nawigacji u dołu, która pozwoli użytkownikowi poruszać się między różnymi fragmentami (różne dni w miesiącu).

Sposób, w jaki próbuję to osiągnąć, to pasek narzędzi. Najpierw utworzyłem pasek narzędzi i dodałem własny widok.

<?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_actionbar" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/min_double_toolbar_height" 
     app:theme="@style/ThemeOverlay.AppCompat.ActionBar" 
     android:minHeight="?attr/actionBarSize" 
     android:background="@color/primary" 

     app:contentInsetStart="0dp" 
     app:contentInsetEnd="0dp" 
     app:contentInsetLeft="0dp" 
     app:contentInsetRight="0dp" 
     android:clipToPadding="false" 
     > 
     <!-- ThemeOVerlay Makes sure the text and items are using solid colors--> 

     <include 
      android:layout_width="match_parent" 
      android:layout_height="72dp" 
      android:layout_gravity="bottom" 
      layout="@layout/day_navigation_tab" 
      /> 

    </android.support.v7.widget.Toolbar> 

day_navigation_tab jest tylko pozioma z dwóch widokach graficznych z wyściółką z 72dp (jako wytyczne) oraz widoku tekstu z masą układu ustawiony na 1, więc rozciąga się na całej dostępnej przestrzeni. I wysokość 72dp.

Teraz w moim BaseActivity XML I to pasek w Framelayout głównego kontekstu (inaczej pasek narzędzi objąłby cały ekran o nieznanej przyczynie mnie (zajęło mi wieki figre że obecnie))

<...ommited> 

    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <include 
      android:id="@+id/toolbar" 
      layout="@layout/app_bar" 
      /> 
    </FrameLayout> 

    <!-- android:layout_gravity="start" tells DrawerLayout to treat 
     this as a sliding drawer on the left side for left-to-right 
     languages and on the right side for right-to-left languages. 
     If you're not building against API 17 or higher, use 
     android:layout_gravity="left" instead. --> 
    <!-- The drawer is given a fixed width in dp and extends the full height of 
     the container. --> 
    <fragment android:id="@+id/navigation_drawer" 
       android:layout_width="@dimen/navigation_drawer_width" 
       android:layout_height="match_parent" 
       android:layout_gravity="right" 
       android:name="alterway.agency.timeentry.NavigationDrawerFragment" 
       tools:layout="@layout/fragment_navigation_drawer" 
       app:layout="@layout/fragment_navigation_drawer" 
    /> 


</android.support.v4.widget.DrawerLayout> 

Jednak, gdy używam paska narzędziowego, nadmuchuję menu na pasku akcji w menu onCreateOptions, mój widok niestandardowy ulega zmniejszeniu i nie rozszerza krawędzi tworzonych opcji. Poniższe zdjęcie pokazuje, że lepiej, To zrzut ekranu z Widoku projektu w Android Studio. Żółty prostokąt wskazuje, gdzie będą umieszczane pozycje opcji. Kolor fioletowy wskazuje oryginalny rozmiar w DesignView. Czarny wskazuje rozmiar podczas uruchamiania aplikacji.

Design View of the toolbar

Dziękuję za wszelką pomoc.

Podobne pytania, które mogą być przydatne dla każdego, kto jest po drugiej stronie tego chce rozwiązać podobny problem:

+0

Jak się dodanie pasek narzędzi do działania? Czy używasz 'setSupportActionBar (Toolbar)'? –

+0

@ Lady_ari: Tak, robię to. Czy istnieje inny sposób? Ponadto, jeśli chcę dodać tytuł i ikonę itp., Czy powinienem to zrobić przed ustawianiem paska narzędzi lub czy powinienem modyfikować obiekt, który otrzymam, gdy wywołuję funkcję getSupportActionBar()? –

+0

Myślę, że lepiej jest użyć 'getSupportActionBar()', aby zmodyfikować tytuł paska narzędzi, itp. –

Odpowiedz

16

Aby to osiągnąć i mieć pełną kontrolę nad dopełnieniem w pasek narzędzi utworzyłem dwa paski narzędzi.Pierwszy pasek narzędzi o standardowej wysokości 56dp i drugiej o wysokości 72dp, które razem tworzyły dwuwarstwowy pasek narzędzi określony przez projekt materiału.

A ponieważ nie pompuję żadnych pozycji menu na drugim pasku narzędzi, wszystkie moje widoki cusotm wewnątrz zachowują się zgodnie z oczekiwaniami.

Linie te muszą jeszcze zostać wykorzystane chociaż

app:contentInsetStart="0dp" 
    app:contentInsetEnd="0dp" 
    app:contentInsetLeft="0dp" 
    app:contentInsetRight="0dp" 
    android:clipToPadding="false" 

to rozwiązało mój problem, więc teraz jestem w tym dwóch pasków do mojego XML.

+0

To była jedyna rzecz, która zadziałała dla mnie. Dzięki za genialny pomysł - ustaw jeden pasek narzędzi jako supportActionBar() i użyj innego dla naszych niestandardowych układów. – Chaitanya

+0

Dzięki temu zaoszczędziłem czas ~ – SwordBearer

1

Z dokumentacji Toolbar:

Jeden lub więcej widoków niestandardowych. Aplikacja może dodawać dowolne widoki podrzędne do paska narzędzi. Pojawią się na tej pozycji w układzie . Jeśli pasek narzędzi Toolbar.LayoutParams w widoku podrzędnym wskazuje wartość Grawitacji CENTER_HORIZONTAL, widok podejmie próbę wyśrodkowania w obrębie dostępnego miejsca pozostałego na pasku narzędzi Toolbar po tym, jak wszystkie inne elementy zostaną zmierzone.

Z tego, jak wygląda, Twój niestandardowy widok zachowuje się tak, jak powinien. Menu opcji zajmuje pewną ilość miejsca na pasku narzędzi, więc pasek narzędzi mierzy pozostałą przestrzeń dla niestandardowego widoku, aby zmieścić się.

+0

Tak, w porządku. To ma sens. Pomyślałem o sposobie obejścia tego. Wypróbuję to i dam ci znać. I unf Nie mogę przegłosować w tej chwili, ponieważ nie mam dość rep:/ –

+0

To jest w porządku. Miło, że mogłem pomóc! –

+0

@JoeSovcik Byłaś w stanie zrozumieć ten problem. Od wielu godzin łamie mi głowę na ten problem! –

4

od wersji 23 bibliotek wspierających projekt jest znacznie prostszy sposób to zrobić przy użyciu android.support.design.widget.CoordinatorLayout

To jest przykład:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:popupTheme="@style/AppTheme.PopupOverlay">    
     </android.support.v7.widget.Toolbar> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="@color/project_light_green" 
      android:orientation="horizontal" 
      android:paddingLeft="@dimen/activity_horizontal_margin_half" 
      android:paddingRight="@dimen/activity_horizontal_margin_half" 
      android:paddingTop="@dimen/activity_vertical_margin_half"> 

      <ImageView 
       android:layout_width="24dp" 
       android:layout_height="24dp" 
       android:layout_margin="12dp" 
       android:src="@drawable/ic_search_24dp" /> 

      <EditText 
       android:id="@+id/search_field" 
       android:layout_width="0dp" 
       android:layout_height="48dp" 
       android:layout_weight="1" 
       android:background="@null" 
       android:hint="@string/autocomplete_hint" 
       android:singleLine="true" 
       android:textColor="@color/project_black" 
       android:textColorHint="@color/project_dark_gray"/> 

      <include layout="@layout/close_button" 
       android:id="@+id/clearButton"/> 

     </LinearLayout> 

    </android.support.design.widget.AppBarLayout> 

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

</android.support.design.widget.CoordinatorLayout> 

enter image description here

+0

Najbardziej przydatna odpowiedź. –