Pengisi antara ikon beranda dan judul ActionBar

110

Adakah yang tahu cara mengatur padding antara ikon beranda ActionBar dan judul?

Alesqui
sumber
13
Selamat datang di dunia peretasan: Android . Hal sederhana ini seharusnya dapat ditemukan oleh siapa saja (bahkan seorang pemula) jika kita membutuhkannya di teknisi UI dan pemrograman aplikasi lainnya. Namun di Android, ini sangat misterius. Mereka dengan sengaja menyembunyikan fitur tersebut, membuatnya menjadi rumit dan hanya untuk membuat Android menjadi dunia peretasan . Saya tidak tahu apa tujuan akhir mereka.
King King
1
Ini pertanyaan dan jawaban memberi jalan untuk mencapai hal ini dengan atribut di dalam toolbar (dukungan v7)
Elisabeth
Android menyebalkan lebih dari iOS.
Borzh

Jawaban:

69

Saya mengadaptasi jawaban Cliffus dan menetapkan logo-drawable dalam definisi gaya bilah tindakan saya, misalnya seperti ini di 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>

Drawable tampak seperti Cliffus (di sini dengan ikon peluncur aplikasi default) di 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>

Di android_manifest.xml Anda masih dapat menyetel ikon aplikasi yang berbeda (ikon peluncur di 'desktop'. Definisi logo yang berbeda di sini terlihat dalam aktivitas tanpa bilah tindakan.

Minsky
sumber
mengapa tidak berpengaruh pada Android 5.1
Logan Guo
Maaf, saya tidak bisa bilang apa-apa di 5.1. Saya beralih ke Toolbar-Control yang lebih fleksibel. Jika belum selesai, saya sarankan untuk membuka pertanyaan baru di sini di StackOverflow dan menulis beberapa detail lebih lanjut, apa yang berhasil untuk Anda (<5.1) dan apa yang tidak berhasil dan apa yang Anda coba dengan 5.1, tetapi tidak menemukan solusi.
Minsky
Terima kasih @Minsky, saya terinspirasi dari jawaban Anda untuk menyelesaikan masalah saya, saya berikan caranya di jawaban di bawah ini :)
Konteks
Bagaimana jika digunakan mipmap?
Yura Shinkarev
100

EDIT : pastikan Anda menyetel drawable ini sebagai LOGO , bukan sebagai ikon aplikasi Anda seperti yang dilakukan beberapa pemberi komentar.

Cukup buat XML drawable dan letakkan di folder resource "drawable" (tanpa kepadatan atau konfigurasi lain).

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

Langkah terakhir adalah menyetel drawable baru ini sebagai logo dalam manifes Anda (atau pada objek Actionbar dalam aktivitas Anda)

Semoga berhasil!

Cliffus
sumber
1
Ada masalah besar di sini dengan solusi ini. Saya menggunakannya dan @Alesqui benar - ikon aplikasi berubah dan menjadi lebih kecil ... Anda dapat mengubah ikon tetapi karena dp berbeda untuk ponsel yang berbeda maka solusi ini tidak memotongnya dalam aplikasi produksi.
Johan S
3
pastikan Anda menyetel drawable ini sebagai LOGO, bukan sebagai ikon aplikasi Anda. semoga berhasil!
Cliffus
1
Saya juga melihat distorsi. Jika saya menerapkan padding yang tepat seperti di atas, sisi kanan gambar akan dipotong.
Neil
1
Solusi menarik tetapi tidak berhasil untuk saya - saya dapat menambahkan padding ekstra dengan cara ini atau memotong gambar logo - tidak bagus (4.3)
Dori
1
@ Cliffus - solusi yang bagus. Persyaratan saya adalah mengambil logo ke kiri jadi saya menggunakan: android: left = "- 4dp".
TharakaNirmana
55

Saya juga menghadapi masalah serupa, dalam kasus saya, saya harus menetapkan judul secara dinamis pada setiap aktivitas tergantung pada kontennya.

Jadi ini berhasil untuk saya.

actionBar.setTitle("  " + yourActivityTitle);

Jika yang Anda inginkan hanyalah jarak, ini adalah solusi termudah yang dapat saya pikirkan.

Rahul Sainani
sumber
13
Mengapa tidak memilih? Jangan menganggap itu jawaban yang salah, hanya cara lain untuk melakukannya.
Rahul Sainani
3
@idratherbeintheair Ya, saya setuju ini bukan cara "terbersih" jadi sekarang hanya mengatakan yang termudah. Tetapi ketika Anda menunjukkan sesuatu, silakan posting solusi alternatif. Saya menghadapi masalah ini dan inilah yang saya gunakan di aplikasi saya, jadi saya membagikannya.
Rahul Sainani
3
Betulkah? Solusi ini mungkin tidak berfungsi sama pada layar berbeda dengan DPI berbeda.
Roman Bugaian
5
Saya tidak akan memilih solusi ini karena saya benar-benar membutuhkan sth yang lebih stabil di aplikasi saya, tetapi saya ingin meminta semua orang mengatakan "Ini tidak bersih". Ya Tuhan, dimana solusi BERSIH untuk masalah ini? Semua peretasan dengan logo, setPadding juga tidak terlihat bersih bagi saya! Baca saja komentar, berapa banyak orang yang bermasalah dengan itu juga. Menyetel android: paddingLeft pada judul - itu akan menjadi CLEAN jika berhasil. Kami dibiarkan di sini dalam kegelapan untuk menciptakan peretasan karena untuk beberapa alasan itu tidak berfungsi sebagaimana mestinya. Jadi tidak ada yang "tidak bersih".
Varvara Kalinina
1
Solusi yang lebih bersih adalah dengan menggunakan app:titleMarginStartatribut dalam XML tata letak.
LarsH
40

Beginilah cara saya mengatur padding antara ikon beranda dan judul.

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

Saya tidak dapat menemukan cara untuk menyesuaikan ini melalui gaya xml ActionBar. Artinya, XML berikut tidak berfungsi:

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

Namun, jika Anda ingin mencapai ini melalui xml, kedua tautan ini dapat membantu Anda menemukan solusi:

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

(Ini adalah tata letak sebenarnya yang digunakan untuk menampilkan ikon beranda di bilah tindakan) https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/action_bar_home.xml

Dushyanth
sumber
1
@ Dushyanth saya baru saja mencoba tetapi mengatakan pengecualian pointer nol pada imageview. Saya memiliki homeUpIndicator dan ikon beranda di bilah tindakan.
Krishna Shrestha
1
Ini hanya berfungsi untuk API> = 11 karena android.R.id.home diperkenalkan di API 11. Saya menggunakan actionbarcompat untuk memiliki actionbar juga pada perangkat honeycomp sebelumnya. Bagaimana cara menanganinya di sana?
tobias
Sedikit retasan. Lihat jawaban Cliffus di bawah untuk solusi yang lebih bersih.
dhaag23
jarak rumah tidak lagi diatur menggunakan padding , tampaknya digunakan marginEndsejak api 17 - yang mungkin akan merusak solusi ini. Lihat milik saya di bawah
Dori
@tobias R.id.home selalu ada, bahkan sebelum level 11. itu tidak tersedia
oscarthecat
32

Ini adalah pertanyaan umum dalam Desain Material karena Anda mungkin ingin menyejajarkan judul bilah alat dengan konten dalam fragmen di bawah ini. Untuk melakukannya, Anda dapat mengganti pengisi default "12dp" dengan menggunakan atribut contentInsetStart = "72dp" di layout Anda seperti yang ditunjukkan di bawah ini

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

Kemudian dalam aktivitas Anda, telepon

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

Dan Anda berakhir dengan ini:

Toolbar

themichaelscott
sumber
Ini sama sekali tidak berhasil dalam kasus saya. Tolong beri tahu saya gaya yang diatur untuk aktivitas
Nitin Mesta
11
Ini adalah cara yang benar untuk melakukan ini. Ada juga yang app:titleMarginStart="dimension"mengincar gelar secara langsung.
Markus Rubey
Menurut sebagian besar pengguna, ini akan menjadi jawaban yang "benar". Bekerja sebagai pesona, Terima kasih!
Taras
1
Bagaimana ini bisa menjadi jawaban yang "benar", jika pertanyaannya tentang padding antara ikon beranda dan judul? Ikon beranda tidak disebutkan di sini (atau logo atau variasinya). Jika contentInsetStartmemberi spasi antara ikon beranda dan judul, jawabannya setidaknya bisa mengatakan demikian. Pengujian saya barusan dengan contentInsetStartsepertinya menempatkan spasi sebelum logo (yang memang tidak sama dengan ikon home).
LarsH
30

Bagi saya, hanya kombinasi berikut yang berhasil, diuji dari API 18 hingga 24

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

di mana di "app" adalah: xmlns:app="http://schemas.android.com/apk/res-auto"

sebagai contoh.

 <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>
Ajit
sumber
1
Terima kasih banyak. @Ajit
shahid17juni
1
Bagus. Akan lebih baik jika Anda dapat memberikan contoh XML terkait untuk memperjelas di mana harus meletakkan ini. (Saya tahu di mana harus meletakkan baris ini)
John Pang
Halo @JohnPang, Anda dapat meletakkan ini di Toolbar tata letak Anda seperti yang ditunjukkan di atas.
Ajit
29

Jika Anda menggunakan toolbar dari AppCompat (android.support.v7.widget.Toolbar,> = revision 24, June 2016), padding antara ikon dan judul dapat diubah dengan nilai berikut:

  app:contentInsetStartWithNavigation="0dp"

Untuk meningkatkan jawaban saya, Anda dapat menggunakannya pada toolbar Anda secara langsung di dalam aktivitas Anda atau Anda dapat membuat file layout baru untuk toolbar Anda. Dalam kasus ini, Anda hanya perlu mengimpor @id toolbar Anda menggunakan properti include pada setiap tampilan yang diperlukan.

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

Anda kemudian dapat mengimpor tata letak Anda di activity.xml

<include
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
tryp
sumber
Bagus. Akan lebih baik jika Anda dapat memberikan contoh XML terkait untuk memperjelas di mana harus meletakkan ini. (Saya tahu di mana harus meletakkan baris ini)
John Pang
@JohnPang Saya menjelaskan jawaban saya secara rinci, semoga dapat membantu Anda memahami cara menggunakan properti ini.
tryp
@ Bolein95 apakah Anda menggunakan pustaka dukungan? untuk dapat membantu Anda memberikan informasi lebih lanjut.
tryp
Perlu dicatat bahwa parameter ini diperkenalkan pada versi 24 pustaka desain. Jadi jika Anda terjebak dalam gerhana di versi 23 (seperti dulu sampai kemarin ...), Anda tidak akan memiliki akses ke sana.
FlorianT
@FloriantT terima kasih atas ketepatannya, saya telah memperbarui jawaban saya terkait komentar Anda.
tryp
6

Menggunakan titleMarginStartkarya untuk saya. Contoh 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"/>

Atur logo seperti ini:

mToolbar = FindViewById<SupportToolbar>(Resource.Id.toolbar);
SetSupportActionBar(mToolbar);
SupportActionBar.SetLogo(Resource.Drawable.titleicon32x32);
SupportActionBar.SetDisplayShowHomeEnabled(true);
SupportActionBar.SetDisplayUseLogoEnabled(true);
SupportActionBar.Title = "App title";
Druid
sumber
Kamu jenius +1
Jacob Sánchez
4

Saya menggunakan \ t sebelum judul dan bekerja untuk saya.

Zanini
sumber
2

Saya menggunakan gambar khusus, bukan teks judul default di sebelah kanan logo aplikasi saya. Ini diatur seperti programatik

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

Masalah dengan jawaban di atas untuk saya adalah saran @ Cliffus tidak bekerja untuk saya karena masalah yang telah diuraikan orang lain dalam komentar dan sementara pengaturan padding programatik @dushyanth mungkin telah berfungsi di masa lalu, saya akan berpikir bahwa fakta bahwa spasi adalah sekarang diatur menggunakan android:layout_marginEnd="8dip" sejak API 17 secara manual mengatur padding seharusnya tidak berpengaruh. Lihat link yang dia posting ke git untuk memverifikasi statusnya saat ini.

Solusi sederhana bagi saya adalah menetapkan margin negatif pada tampilan kustom saya di actionBar, seperti itu android:layout_marginLeft="-14dp". Tes cepat menunjukkan bahwa ini berfungsi untuk saya di 2.3.3 dan 4.3 menggunakanActionBarCompat

Semoga ini bisa membantu seseorang!

Dori
sumber
@Diri bisakah kamu menambahkan lebih banyak, bisakah kita membuat bilah tindakan di atas, bawah, kiri, kanan
Amitsharma
@amitsharma - saya tidak yakin apa yang Anda maksud sebenarnya - maksud Anda memindahkan bilah tindakan dari atas layar? Jika demikian, saya pikir Anda perlu membuat tampilan bilah tindakan khusus untuk melakukan ini - kedengarannya seperti itu mungkin tidak bagus ux :)
Dori
dalam hal ini saya tidak tahu apa yang Anda maksud dengan "bisakah kamu menambahkan lebih banyak, bisakah kita membuat bilah tindakan di atas, bawah, kiri, kanan"
Dori
2

Saya memecahkan masalah ini dengan menggunakan tata letak Navigasi kustom

Dengan menggunakannya, Anda dapat menyesuaikan apa pun dalam judul di bilah tindakan:

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"/>
mc.dev
sumber
0

Saya memiliki masalah serupa tetapi dengan jarak antara atas dan ikon / logo aplikasi khusus di bilah tindakan. Solusi Dushyanth untuk mengatur padding secara terprogram bekerja untuk saya (mengatur padding pada ikon aplikasi / logo). Saya mencoba menemukan android.R.id.home atau R.id.abs__home ( hanya ActionBarSherlock , karena ini memastikan kompatibilitas ke belakang), dan tampaknya berfungsi di perangkat 2.3-4.3 yang telah saya uji.

raptor
sumber
0

Untuk kasus saya, itu dengan Toolbar saya menyelesaikannya seperti ini:

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>

Di Fragmen saya, saya memeriksa 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);

Semoga berhasil!

Konteks
sumber
0

Anda dapat mengubah drawableSize dari DrawerArrow Anda seperti ini:

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

Ini bukan jawaban yang benar, karena Anda tidak dapat memilih sisi padding dan penskalaan ikon DrawerArrow saat mengubah drawableSize (drawableSize = width = height). Tapi Anda bisa margin dari kiri. Untuk margin dari kanan lakukan

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

Saya menggunakan metode ini setContentInsetsAbsolute(int contentInsetLeft, int contentInsetRight)dan berhasil!

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

Saat Anda menggunakan Toolbar kustom, Anda dapat menggunakan

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

dan dalam tata letak toolbar Anda cukup setel app:titleMarginStart="16dp"

Perhatikan bahwa Anda harus mengatur ikon sebagai logo, jangan gunakan getSupportActionBar().setIcon(R.drawable.logo) sebagai gantinya: getSupportActionBar().setLogo(R.drawable.logo)

Martin Schüller
sumber
0

Saya terbiasa AppBarLayoutdan biasa ImageButtonmelakukannya.

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

Kode Java saya:

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

Anda juga dapat mencapai metode yang sama:

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

Di XML Anda, setel app:titleMargindi tampilan Toolbar Anda sebagai berikut:

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

Atau di kode Anda:

toolbar.setTitleMargin(16,16,16,16); // start, top, end, bottom
Ahmed Ashour
sumber
-2

ini berfungsi bagi saya untuk menambahkan padding ke judul dan untuk ActionBarikon saya telah mengaturnya secara terprogram.

 getActionBar().setTitle(Html.fromHtml("<font color='#fffff'>&nbsp;&nbsp;&nbsp;Boat App </font>"));
Muhammad Dawood
sumber
-2
<string name="app_name">"    "Brick Industry</string>

Cukup tambahkan " "untuk nama aplikasi Anda. Ini akan menambah spasi antara ikon dan judul

Manohar
sumber
Ini tidak buruk, saya tidak tahu mengapa itu menjadi begitu buruk
Martin De Simone
mungkin terkadang solusi yang paling sederhana adalah yang terbaik! terima kasih
Nuhman