Riempimento tra l'icona home e il titolo di ActionBar


110

Qualcuno sa come impostare la spaziatura interna tra l'icona home di ActionBar e il titolo?


13
Benvenuto nel mondo degli hack: Android . Questa semplice cosa avrebbe dovuto essere trovata da chiunque (anche un principiante) se ne avessimo bisogno in altre tecnologie dell'interfaccia utente e nella programmazione dell'applicazione. Tuttavia, in Android, è davvero misterioso. Nascondono intenzionalmente la funzionalità, la rendono complicata e solo per rendere Android un mondo di hack . Non so quale sia il loro scopo finale.
King King

1
Questa domanda e le risposte consentono di ottenere ciò con gli attributi all'interno della barra degli strumenti (supporto v7)
Elisabeth

Android fa schifo anche più di iOS.
Borzh

Risposte:


69

Ho adattato la risposta di Cliffus e ho assegnato il logo disegnabile nella definizione dello stile della mia barra delle azioni, ad esempio in res / style.xml:

<item name="android:actionBarStyle">@style/MyActionBar</item>

<style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">#3f51b5</item>
        <item name="android:titleTextStyle">@style/ActionBar.TitleText</item>
        <item name="android:textColor">#fff</item>
        <item name="android:textSize">18sp</item>
        <item name="android:logo">@drawable/actionbar_space_between_icon_and_title</item>
</style>

Il drawable assomiglia a quello di Cliffus (qui con l'icona di avvio delle app predefinita) in res / drawable / actionbar_space_between_icon_and_title.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/ic_launcher"
        android:right="20dp"/>
</layer-list>

In android_manifest.xml puoi ancora impostare un'icona dell'app diversa (icona di avvio sul "desktop". Qualsiasi definizione di logo diversa qui è visibile nelle attività senza una barra delle azioni.


perché non ha effetto su Android 5.1
Logan Guo

Mi spiace, non posso dire qualcosa al riguardo in 5.1. Sono passato al più flessibile Toolbar-Control. Se non lo hai già fatto, ti consiglio di aprire una nuova domanda qui su StackOverflow e scrivere qualche dettaglio in più, cosa ha funzionato per te (<5.1) e cosa non funziona e cosa hai provato con 5.1, ma non sei arrivato a una soluzione.
Minsky

Grazie @Minsky, mi sono ispirato dalla tua risposta per risolvere il mio problema, ho inserito come nella risposta sotto :)
Contesto

Cosa succede se si usa mipmap?
Yura Shinkarev

100

MODIFICA : assicurati di impostare questo disegnabile come LOGO , non come l'icona della tua app come hanno fatto alcuni dei commentatori.

Basta creare un XML disegnabile e metterlo nella cartella delle risorse "drawable" (senza alcuna densità o altra configurazione).

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:drawable="@drawable/my_logo"
        android:right="10dp"/>


</layer-list>

L'ultimo passaggio è impostare questo nuovo disegnabile come logo nel tuo manifest (o sull'oggetto Actionbar nella tua attività)

In bocca al lupo!


1
C'è un grosso problema qui con questa soluzione. L'ho usato e @Alesqui ha ragione: l'icona dell'app è cambiata ed è diventata più piccola ... Puoi cambiare icona ma poiché dp è diverso per telefoni diversi, questa soluzione non la taglia in un'app di produzione.
Johan S

3
assicurati di impostare questo disegnabile come LOGO, non come l'icona dell'app. in bocca al lupo!
Cliffus

1
Vedo anche una distorsione. Se applico il riempimento destro come sopra, il lato destro dell'immagine viene ritagliato.
Neil

1
Soluzione interessante ma non funziona per me - posso aggiungere imbottitura extra in questo modo o ritagliare l'immagine del logo - non va bene (4.3)
Dori

1
@Cliffus - bella soluzione. La mia esigenza era di portare il logo a sinistra, quindi ho usato: android: left = "- 4dp".
TharakaNirmana,

55

Ho anche affrontato un problema simile, nel mio caso ho dovuto impostare i titoli in modo dinamico su ciascuna attività a seconda del contenuto.

Quindi questo ha funzionato per me.

actionBar.setTitle("  " + yourActivityTitle);

Se tutto ciò che vuoi è la spaziatura, questa è la soluzione più semplice a cui potessi pensare.


13
Perché il voto negativo? Non credo che sia una risposta sbagliata, solo un altro modo di farlo.
Rahul Sainani

3
@idratherbeintheair Sì, sono d'accordo che questo non è il modo "più pulito", quindi ora dice solo il più semplice. Ma quando fai notare qualcosa, per favore pubblica una soluzione alternativa. Ho affrontato questo problema e questo è ciò che ho usato nella mia app, quindi l'ho condiviso.
Rahul Sainani

3
Veramente? Questa soluzione potrebbe non funzionare allo stesso modo su schermi diversi con DPI diversi.
Roman Bugaian

5
Non sceglierò questa soluzione perché ho davvero bisogno di qc più stabile nella mia app, ma voglio chiedere a tutte quelle persone che dicono "Non è pulito". Oh, mio ​​Dio, dov'è la soluzione PULITA per questo problema? Tutti quegli hack con loghi, setPadding non mi sembrano puliti neanche a me! Basta leggere i commenti, quante persone hanno problemi anche con quelli. Impostazione di android: paddingLeft sul titolo - che cosa sarebbe PULITO se avesse funzionato. Siamo rimasti qui all'oscuro di inventare hack perché per qualche motivo semplicemente non funziona come avrebbe dovuto funzionare. Quindi niente è "non pulito".
Varvara Kalinina

1
Una soluzione più pulita sarebbe utilizzare l' app:titleMarginStartattributo nell'XML di layout.
LarsH

40

È così che sono stato in grado di impostare il riempimento tra l'icona home e il titolo.

ImageView view = (ImageView)findViewById(android.R.id.home);
view.setPadding(left, top, right, bottom);

Tuttavia, non sono riuscito a trovare un modo per personalizzarlo tramite gli stili xml di ActionBar. Cioè, il seguente XML non funziona:

<style name="ActionBar" parent="android:style/Widget.Holo.Light.ActionBar">        
    <item name="android:titleTextStyle">@style/ActionBarTitle</item>
    <item name="android:icon">@drawable/ic_action_home</item>        
</style>

<style name="ActionBarTitle" parent="android:style/TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="android:textSize">18sp</item>
    <item name="android:paddingLeft">12dp</item>   <!-- Can't get this padding to work :( -->
</style>

Tuttavia, se stai cercando di ottenere questo risultato tramite xml, questi due collegamenti potrebbero aiutarti a trovare una soluzione:

https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/styles.xml

(Questo è il layout effettivo utilizzato per visualizzare l'icona home in una barra delle azioni) https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/action_bar_home.xml


1
@ Dushyanth ho appena provato ma dice un'eccezione del puntatore nullo su imageview. ho sia homeUpIndicator che l'icona home nella barra delle azioni.
Krishna Shrestha

1
Funziona solo per API> = 11 poiché android.R.id.home è stato introdotto nell'API 11. Uso actionbarcompat per avere una barra delle azioni anche su dispositivi pre honeycomp. Come gestirlo lì?
Tobias

Un po 'un trucco. Vedi la risposta di Cliffus di seguito per una soluzione più pulita.
dhaag23

la spaziatura home non è più impostata utilizzando padding, sembra essere utilizzata marginEnddall'api 17, il che probabilmente interromperà questa soluzione. Vedi il mio sotto
Dori

@tobias R.id.home è sempre lì, anche prima del livello 11, semplicemente non disponibile
oscarthecat

32

Questa è una domanda comune in Material Design poiché potresti voler allineare il titolo della barra degli strumenti con il contenuto nel frammento sottostante. Per fare ciò, puoi sovrascrivere il riempimento predefinito di "12dp" utilizzando l'attributo contentInsetStart = "72dp" nel tuo layout toolbar.xml come mostrato di seguito

toolbar.xml

<?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_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/app_theme_color"
    app:contentInsetStart="72dp"/>

Quindi nella tua attività, chiama

Toolbar toolbar = (Toolbar) activity.findViewById(R.id.toolbar);
toolbar.setTitle("Title Goes Here");

E finisci con questo:

Toolbar


Questo non funziona affatto nel mio caso. Per favore fatemi sapere lo stile impostato su attività
Nitin Mesta

11
Questo è il modo giusto per farlo. C'è anche app:titleMarginStart="dimension"per indirizzare direttamente il titolo.
Markus Rubey

Pensa per la maggior parte degli utenti questa sarà la risposta "giusta". Funziona come un fascino, grazie!
Taras

1
Come è questa la risposta "giusta", se la domanda riguardava il riempimento tra l'icona della home e il titolo? L'icona della casa non è menzionata qui (né il logo o qualsiasi altra variazione). Se contentInsetStartmette uno spazio tra l'icona della casa e il titolo, la risposta potrebbe almeno dirlo. Il mio test solo ora con contentInsetStartsembrava mettere lo spazio prima del logo (che certamente non è lo stesso dell'icona home).
LarsH

30

Per me ha funzionato solo la seguente combinazione, testata dall'API 18 alla 24

app:contentInsetLeft="0dp"
app:contentInsetStart="0dp"
app:contentInsetStartWithNavigation="0dp"

dove in "app" è: xmlns:app="http://schemas.android.com/apk/res-auto"

per esempio.

 <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="@color/SE_Life_Green"
                app:contentInsetLeft="0dp"
                app:contentInsetStart="0dp"
                app:contentInsetStartWithNavigation="0dp"
                >
                .......
                .......
                .......
            </android.support.v7.widget.Toolbar>

1
Grazie mille. @Ajit
shahid17june

1
Grande. Sarebbe meglio se fornissi l'XML relativo all'esempio per chiarire dove metterlo. (So ​​dove mettere questa riga)
John Pang

Ciao @JohnPang, puoi inserirlo nella barra degli strumenti del tuo layout come mostrato sopra.
Ajit

29

Se stai utilizzando la barra degli strumenti da AppCompat (android.support.v7.widget.Toolbar,> = revisione 24, giugno 2016), il riempimento tra l'icona e il titolo può essere modificato con il seguente valore:

  app:contentInsetStartWithNavigation="0dp"

Per migliorare la mia risposta, puoi usarlo sulla tua barra degli strumenti direttamente all'interno della tua attività oppure puoi creare un nuovo file di layout per la tua barra degli strumenti. In questo caso, devi solo importare il @id della barra degli strumenti utilizzando la proprietà include su ciascuna vista necessaria.

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:elevation="4dp"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    app:contentInsetStartWithNavigation="0dp">
</android.support.v7.widget.Toolbar>

È quindi possibile importare il layout nel file activity.xml

<include
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

Grande. Sarebbe meglio se fornissi l'XML relativo all'esempio per chiarire dove metterlo. (So ​​dove mettere questa riga)
John Pang

@ JohnPang ho dettagliato la mia risposta, spero che ti aiuti a capire come usare questa proprietà.
tryp

@ Bolein95 stai utilizzando la libreria di supporto? per poterti aiutare, fornisci maggiori informazioni.
tryp

Da notare che questo parametro è stato introdotto nella versione 24 della libreria di progettazione. Quindi, se sei bloccato in Eclipse alla versione 23 (come facevo fino a ieri ...), non avrai accesso ad esso.
FlorianT

@FloriantT grazie per la precisione, ho aggiornato la mia risposta riguardo al tuo commento.
tryp

6

Usare titleMarginStartopere per me. Esempio di Xamarin:

<android.support.v7.widget.Toolbar
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:id="@+id/toolbar"
  android:layout_height="wrap_content"
  android:layout_width="match_parent"
  android:minHeight="?attr/actionBarSize"
  android:background="?attr/colorPrimary"
  app:titleMarginStart="24dp"/>

Imposta il logo in questo modo:

mToolbar = FindViewById<SupportToolbar>(Resource.Id.toolbar);
SetSupportActionBar(mToolbar);
SupportActionBar.SetLogo(Resource.Drawable.titleicon32x32);
SupportActionBar.SetDisplayShowHomeEnabled(true);
SupportActionBar.SetDisplayUseLogoEnabled(true);
SupportActionBar.Title = "App title";

Sei un genio. +1
Jacob Sánchez

4

Ho usato \ t prima del titolo e ho lavorato per me.


2

Sto usando un'immagine personalizzata invece del testo del titolo predefinito a destra del logo della mia app. Questo è impostato in modo programmatico come

    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setDisplayUseLogoEnabled(true);
    actionBar.setCustomView(R.layout.include_ab_txt_logo);
    actionBar.setDisplayShowCustomEnabled(true);

I problemi con le risposte sopra per me sono che il suggerimento di @ Cliffus non funziona per me a causa dei problemi che altri hanno delineato nei commenti e mentre l'impostazione del padding programmatico @dushyanth potrebbe aver funzionato in passato, penserei che il fatto che la spaziatura sia ora impostato utilizzando android:layout_marginEnd="8dip" dall'API 17 l'impostazione manuale del riempimento non dovrebbe avere alcun effetto. Vedi il link che ha pubblicato su git per verificare il suo stato corrente.

Una soluzione semplice per me è impostare un margine negativo sulla mia visualizzazione personalizzata nella actionBar, in questo modo android:layout_marginLeft="-14dp". Un rapido test mostra che funziona per me su 2.3.3 e 4.3 utilizzandoActionBarCompat

Spero che questo aiuti qualcuno!


@Diri puoi aggiungere altro possiamo creare una barra delle azioni su, giù, sinistra, destra
Amitsharma

@amitsharma - non sono sicuro di cosa intendi esattamente - intendi spostare la barra delle azioni dalla parte superiore dello schermo? Se è così, penso che dovresti creare una visualizzazione della barra delle azioni personalizzata per farlo - sembra che potrebbe non essere un buon ux però :)
Dori

in tal caso non so cosa intendi per "puoi aggiungere altro possiamo creare barra delle azioni su, giù, sinistra, destra"
Dori

2

Ho risolto questo problema utilizzando il layout di navigazione personalizzato

Usandolo puoi personalizzare qualsiasi cosa nel titolo sulla barra delle azioni:

build.gradle

dependencies {
    compile 'com.android.support:appcompat-v7:21.0.+'
    ...
}

AndroidManifest.xml

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">
        <activity
            android:name=".MainActivity"
            android:theme="@style/ThemeName">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
</application>

styles.xml

<style name="ThemeName" parent="Theme.AppCompat.Light">
   <item name="actionBarStyle">@style/ActionBar</item>
   <item name="android:actionBarStyle" tools:ignore="NewApi">@style/ActionBar</item>

<style name="ActionBar" parent="Widget.AppCompat.ActionBar">
   <item name="displayOptions">showCustom</item>
   <item name="android:displayOptions" tools:ignore="NewApi">showCustom</item>

    <item name="customNavigationLayout">@layout/action_bar</item>
   <item name="android:customNavigationLayout" tools:ignore="NewApi">@layout/action_bar</item>

    <item name="background">@color/android:white</item>
   <item name="android:background">@color/android:white</item>

action_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/action_bar_title"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:gravity="center_vertical"
          android:drawableLeft="@drawable/ic_launcher"
          android:drawablePadding="10dp"
          android:textSize="20sp"
          android:textColor="@android:color/black"
          android:text="@string/app_name"/>

0

Ho avuto un problema simile ma con la spaziatura tra l'icona / il logo dell'app personalizzata nella barra delle azioni. La soluzione di Dushyanth di impostare il padding ha funzionato in modo programmatico per me (impostare il padding sull'icona dell'app / logo). Ho provato a trovare android.R.id.home o R.id.abs__home ( solo ActionBarSherlock , poiché ciò garantisce la compatibilità con le versioni precedenti) e sembra funzionare su dispositivi 2.3-4.3 su cui ho testato.


0

Per il mio caso, è stato con Toolbar che l'ho risolto in questo modo:

ic_toolbar_drawble.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:drawable="@drawable/ic_toolbar"
    android:right="-16dp"
    android:left="-16dp"/>
</layer-list>

Nel mio frammento, controllo l'API:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
      toolbar.setLogo(R.drawable.ic_toolbar);
else
      toolbar.setLogo(R.drawable.ic_toolbar_draweble);

In bocca al lupo!


0

Puoi cambiare drawableSize del tuo DrawerArrow in questo modo:

<style name="MyTheme" parent="android:Theme.WithActionBar">
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style>

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="barLength">24dp</item>
    <item name="arrowShaftLength">24dp</item>
    <item name="arrowHeadLength">10dp</item>
    <item name="drawableSize">42dp</item> //this is your answer
</style>

Non è la risposta corretta, perché non puoi scegliere il lato del padding e il ridimensionamento dell'icona DrawerArrow quando cambi drawableSize (drawableSize = width = height). Ma puoi margine da sinistra. A margine da destra fare

findViewById(android.R.id.home).setPadding(10, 0, 5, 0);

0

Ho usato questo metodo setContentInsetsAbsolute(int contentInsetLeft, int contentInsetRight)e funziona!

int padding = getResources().getDimensionPixelSize(R.dimen.toolbar_content_insets);
mToolbar.setContentInsetsAbsolute(padding, 0);

0

Quando utilizzi una barra degli strumenti personalizzata, puoi utilizzare

toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(R.string.activity_title);
setSupportActionBar(toolbar);
getSupportActionBar().setLogo(R.drawable.logo);

e nel layout della barra degli strumenti è sufficiente impostare app:titleMarginStart="16dp"

Nota che devi impostare l'icona come logo, non usare getSupportActionBar().setIcon(R.drawable.logo) invece usa: getSupportActionBar().setLogo(R.drawable.logo)


0

L'ho usato AppBarLayoute l' ho ImageButtonfatto su misura.

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp"
    android:background="@android:color/transparent"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

   <RelativeLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent">

       <ImageView
           android:layout_width="32dp"
           android:layout_height="32dp"
           android:src="@drawable/selector_back_button"
           android:layout_centerVertical="true"
           android:layout_marginLeft="8dp"
           android:id="@+id/back_button"/>

       <android.support.v7.widget.Toolbar
           android:id="@+id/toolbar"
           android:layout_width="match_parent"
           android:layout_height="?attr/actionBarSize"
           app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
    </RelativeLayout>    
</android.support.design.widget.AppBarLayout>

Il mio codice Java:

findViewById(R.id.appbar).bringToFront();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ActionBar ab = getSupportActionBar();
getSupportActionBar().setDisplayShowTitleEnabled(false);

0

Puoi ottenere lo stesso anche con il metodo:

Drawable d = new InsetDrawable(getDrawable(R.drawable.nav_icon),0,0,10,0);
mToolbar.setLogo(d);

0

Nel tuo XML, imposta app:titleMarginnella visualizzazione della barra degli strumenti come segue:

<androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:titleMarginStart="16dp"/>

O nel tuo codice:

toolbar.setTitleMargin(16,16,16,16); // start, top, end, bottom

-2

questo lavoro per me per aggiungere il riempimento al titolo e per l' ActionBaricona l'ho impostato a livello di programmazione.

 getActionBar().setTitle(Html.fromHtml("<font color='#fffff'>&nbsp;&nbsp;&nbsp;Boat App </font>"));

-2
<string name="app_name">"    "Brick Industry</string>

Basta aggiungere " "per il nome della tua app Aggiungerà spazio tra l'icona e il titolo


Questo non è male, non so perché sia ​​stato così svalutato
Martin De Simone

forse a volte la soluzione più semplice è la migliore! grazie
Nuhman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.