How to center toolbar back button?
Asked Answered
L

9

44

I'm having a problem trying to center the back button on the support toolbar. I'm using it inside an ActionBarActivity.

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

And set the up navigation inside the Activity's onCreate() like this:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

getSupportActionBar().setTitle(R.string.title_activity_scanner);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

However, what I'm getting is this:

As you can see the back button is misplaced

Edit: The problem seems to lie in a custom value for ?attr/actionBarSize set to 40dp, however, it turns out now, that it's the title that is misplaced instead.

Lift answered 27/4, 2015 at 8:35 Comment(4)
One of the action I think disable that back button and put a button widget inside and align it as you want. Hope it helps!!!Blasted
can you remove minHeight tag and add height as "?attr/actionBarSize" instead of "wrap_content"Chivaree
@Viren I would like to avoid rediscovering the wheel if possibleLift
@RiyazAhamed please check updated question, it's actually the title that make the toolbar grow, but the back button should adapt as wellLift
L
102

From the developer.android.com :

Toolbar supports a more focused feature set than ActionBar. From start to end, a toolbar may contain a combination of the following optional elements:

A navigation button. This may be an Up arrow, navigation menu toggle, close, collapse, done or another glyph of the app's choosing. This button should always be used to access other navigational destinations within the container of the Toolbar and its signified content or otherwise leave the current context signified by the Toolbar. The navigation button is vertically aligned within the Toolbar's minimum height, if set.

So if you set minHeight attribute the same as your toolbar height (layout_height ), the back arrow will be centered vertically.

Linkage answered 21/6, 2015 at 12:7 Comment(3)
I was using a custom toolbar:theme so my problem was solved by removing <item name="android:actionBarSize">@android:/abc_action_bar_stacked_max_height</item> from my toolbar's themeBobbette
If use support v7 before 24,we can set maxButtonHeight equal android:minHeight make a vertical center effect. After v7 version >=24+,we can set attr buttonGravity .Disinterested
Had to add android:minHeight="@null" to cancel out the minHeight coming from the toolbar style style="@style/Widget.MaterialComponents.Toolbar"Porphyritic
B
15

(2020)

In case you have a non-standard toolbar height, to center the back button nowadays (2k20) with androidx Toolbar you can just use the buttonGravity property.

This allows you to use wrap_content instead of a specific height (minHeight doesn't allow you to do so):

<androidx.appcompat.widget.Toolbar
   app:buttonGravity="center_vertical"
   android:layout_height="wrap_content"
   ... />
Bagley answered 25/6, 2020 at 12:0 Comment(2)
Wow, thank you! I wonder if there's a minimum API version for this?Shanta
@Shanta I haven't seen any specific requirements for the Toolbar itself, I think it's safe to assume that androidx.widget.* work on API 14+ (Android 4.0) -- AFAIK, that was the requirement of the pre-androix support lib.Bagley
R
2

Inside ActionBarActivity

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  setSupportActionBar(toolbar);
  getSupportActionBat().setTitle("Hello World"); 
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  getSupportActionBar().setHomeButtonEnabled(true);

Layout code :

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/primary"
        app:theme="@style/ToolbarTheme"
        app:popupTheme="@style/Theme.AppCompat"/>

And style :

 <style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primaryDark</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="windowActionBar">false</item>
</style>

<style name="AppTheme" parent="AppTheme.Base">

Remember that toolbar is just viewgroup, so u can style it in any way u like. Here is image link : Toolbar sample

Hope it helps.

Righteous answered 27/4, 2015 at 9:35 Comment(0)
H
1

Best way to achieve this is remove regular Back button from the toolbar and add a custom ImageButton in your XML layout and set image to it. You can place this ImageButtton wherever you want on the toolbar.

Your activity layout code should be something like this.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

    <ImageButton
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:id="@+id/button"
        android:src="@drawable/attach_icon"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>
Hoick answered 27/4, 2015 at 9:17 Comment(0)
P
0

Piggybacking off of @Rick Sanchez answer - if you know the size of the Toolbar's minHeight attribute you can then use:

android:gravity="top"
app:titleMarginTop="@dimen/margin_to_center"

in the Toolbar to center the text. If you are using android:minHeight="?actionBarSize" then this would be about 13p

Pya answered 28/9, 2015 at 19:59 Comment(0)
T
0

For me, none of the solutions worked. In my case the problem was the margin I applied:

 <android.support.v7.widget.Toolbar
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     ... >

     <View
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp" />

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

After applying it to the toolbar directly, the button was centered vertically:

 <android.support.v7.widget.Toolbar
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_marginBottom="10dp"
     android:layout_marginTop="10dp"
     ... >

     <View
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

 </android.support.v7.widget.Toolbar>
Terpene answered 23/4, 2016 at 15:23 Comment(0)
D
0

@Rick Sanchez answer is work,setup Toolbar's layout_height the same as minHeight

I found in Toolbar constructor have a field can setup button gravity, mButtonGravity = a.getInteger(R.styleable.Toolbar_buttonGravity, Gravity.TOP);

,but v7 support Toolbar can not setup, mButtonGravity = Gravity.TOP;

Disinterested answered 25/4, 2017 at 5:2 Comment(0)
O
0

make your button size 56dp and set scaleType to center with no margins on Appbar Make sure your icon is 24x24 dimensions

Onshore answered 15/12, 2018 at 12:40 Comment(0)
P
0

I was using

  <style name="MyActionBar" parent="@style/Widget.AppCompat.ActionBar">

when I should've been using

 <style name="MyActionBar" parent="@style/Widget.AppCompat.Toolbar">
Parasitic answered 25/3, 2021 at 14:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.