Прокладка між домашньою іконою ActionBar та заголовком


110

Хтось знає, як встановити прокладки між домашньою піктограмою ActionBar та заголовком?


13
Ласкаво просимо у світ хак: Android . Цю просту річ повинен був знайти будь-хто (навіть новачок), якщо нам це потрібно в інших технологіях інтерфейсу та прикладному програмуванні. Однак в Android це справді загадково. Вони навмисно приховують цю функцію подалі, ускладнюють її та просто роблять Android для світу хакерів . Я не знаю, яка їх кінцева мета.
— Король-король

1
Це питання та відповіді дають змогу досягти цього за допомогою атрибутів всередині панелі інструментів (підтримка v7)
— Елізабет

Android смокче навіть більше, ніж iOS.
— Борж

Відповіді:


69

Я адаптував відповідь Cliffus і призначив малюнок логотипу в моєму визначенні стилю панелі дій, наприклад, такий у 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>

Малюнок схожий на Cliffus '(тут зі значком запуску програми за замовчуванням) у res / dravable / 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>

У android_manifest.xml ви все ще можете встановити інший значок програми (піктограма запуску на "робочому столі". Будь-яке інше визначення логотипу тут видно в діяльності без панелі дій.


чому це не впливає на Android 5.1
— Логан Го

Вибачте, я не можу щось про це сказати в 5.1. Я перейшов на більш гнучку панель інструментів управління. Якщо цього ще не зроблено, рекомендую відкрити нове запитання тут на StackOverflow та написати ще детальну інформацію про те, що працювало у вас (<5.1), а що не працює і що ви намагалися з 5.1, але не знайшли рішення.
— Мінський

Дякую @Minsky, я надихнувся на твою відповідь, щоб вирішити мою проблему, і я поставив як у відповіді нижче :)
— Контекст

Що робити, якщо використовується mipmap?
— Юра Шинкарев

100

РЕДАКТУВАТИ : переконайтеся, що ви вказали цей параметр як LOGO , а не як значок програми, як це робили деякі з коментаторів.

Просто зробіть XML, який можна прочитати, і помістіть його в папку ресурсів "dravable" (без будь-якої щільності чи іншої конфігурації).

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

Останній крок - встановити цей новий малюється як логотип у своєму маніфесті (або на об’єкті Панелі дій у вашій діяльності)

Удачі!


1
Тут є велика проблема з цим рішенням. Я використовував це, і @Alesqui має рацію - піктограма програми змінилася і стала меншою ... Ви можете змінити значок, але оскільки dp відрізняється для різних телефонів, то це рішення не вирізає його у виробничому додатку.
— Йохан S

3
переконайтеся, що ви налаштовуєте цей малюнок як LOGO, а не як значок додатка. Щасти!
— Кліфф

1
Я також бачу спотворення. Якщо я застосую праву накладку, як описано вище, права частина зображення буде обрізана.
— Ніл

1
Цікаве рішення, але воно не працює для мене - я можу або додати додаткові набивки таким чином, або обрізати зображення логотипу - не добре (4.3)
— Дорі

1
@Cliffus - приємне рішення. Моєю вимогою було взяти логотип ліворуч, тому я використав: android: left = "- 4dp".
— TharakaNirmana

55

Я також стикався з подібною проблемою, у моєму випадку мені довелося динамічно встановлювати заголовки для кожної діяльності залежно від вмісту.

Тож це працювало для мене.

actionBar.setTitle("  " + yourActivityTitle);

Якщо все, що вам потрібно, - це інтервал, це найпростіше рішення, про яке я міг придумати.


13
Чому голосування "за"? Не вважайте, що це неправильна відповідь, просто інший спосіб зробити це.
— Рахул Сайнані

3
@idratherbeintheair Так, я погоджуюся, що це не "найчистіший" спосіб, тому зараз це сказано лише найпростіше. Але коли ви щось вказуєте, будь ласка, опублікуйте альтернативне рішення. Я зіткнувся з цією проблемою, і це те, що я використовував у своєму додатку, тому поділився.
— Рахул Сайнані

3
Дійсно? Це рішення може не працювати однаково на різних екранах з різними DPI.
— Роман Бугаян

5
Я не вибиратиму це рішення, тому що мені дійсно потрібно що-небудь більш стабільне в моєму додатку, але я хочу попросити всіх тих, хто каже "Це не чисто". О, Боже, де ЧИСЛЕ вирішення цієї проблеми? Усі ці хакі з логотипами, setPadding також не виглядають чистими для мене! Просто прочитайте коментарі, скільки людей теж має проблеми. Налаштування андроїда: paddingLeft on title - що було б CLEAN, якби воно працювало. Ми залишаємось тут у темряві, щоб вигадувати хаки, бо чомусь це просто не працює так, як воно мало працювати. Тож нічого "не чисто".
— Варвара Калініна

1
Більш чистим рішенням буде використання app:titleMarginStartатрибута в макеті XML.
— LarsH

40

Ось так я зміг встановити прокладку між домашньою піктограмою та заголовком.

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

Я не зміг знайти спосіб налаштувати це за допомогою xml-стилів ActionBar. Тобто, наступний XML не працює:

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

Однак якщо ви хочете досягти цього через xml, ці два посилання можуть допомогти вам знайти рішення:

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

(Це фактичний макет, який використовується для відображення домашнього значка на панелі дій) https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/action_bar_home.xml


1
@Dushyanth я просто спробував, але говорить про виключення нульових покажчиків на перегляді зображень. У панелі дій є і homeUpIndicator, і домашня піктограма.
— Кришна Шреща

1
Це працює лише для API> = 11, оскільки android.R.id.home був представлений в API 11. Я використовую панель дій, щоб мати панель дій також на попередніх пристроях сот. Як з цим впоратися?
— tobias

Трохи хак. Дивіться відповідь Cliffus нижче для більш чистого рішення.
— dhaag23

домашній інтервал більше не встановлюється з використанням padding, він, здається, використовується marginEndз api 17 - що, ймовірно, порушить це рішення. Дивіться мою нижче
— Дорі

@tobias R.id.home завжди є, навіть до рівня 11, він просто недоступний
— oscarthecat

32

Це поширене питання в «Матеріал дизайну», оскільки ви, можливо, захочете узгодити заголовок панелі інструментів із вмістом у фрагменті нижче. Для цього ви можете змінити замінник "12dp" за замовчуванням, використовуючи атрибут contentInsetStart = "72dp" у вашій макеті панелі інструментів.xml, як показано нижче

панель інструментів.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"/>

Потім у своїй діяльності зателефонуйте

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

І ви закінчуєте це:

Панель інструментів


У моєму випадку це зовсім не працює. Будь ласка, дайте мені знати, що стиль призначений для активності
— Нітін Места

11
Це правильний спосіб зробити це. Існує також app:titleMarginStart="dimension"націлювання на назву безпосередньо.
— Маркус Рубей

Думаю, що для більшості користувачів це буде "правильна" відповідь. Працює як шарм, дякую!
— Тарас

1
Як це "правильна" відповідь, якщо питання стосувалося прокладки між домашньою піктограмою та заголовком? Тут не згадується домашня ікона (ні логотип, ні будь-яка версія). Якщо contentInsetStartрозмістити пробіл між домашньою піктограмою та заголовком, відповідь могла б принаймні так сказати. На моєму тесті лише зараз contentInsetStartздавалося, що це місце перед логотипом (що, правда, не те саме, що домашня ікона).
— LarsH

30

Для мене працювала лише наступна комбінація, протестована від API 18 до 24

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

де в "застосунку" є: xmlns:app="http://schemas.android.com/apk/res-auto"

наприклад.

 <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
Дуже дякую. @Ajit
— shahid17june

1
Чудово. Було б краще, якщо ви можете надати зразок XML, щоб уточнити, куди це поставити. (Я точно знаю, куди подіти цю лінію)
— Джон Панг

Привіт @JohnPang, ви можете розмістити це на панелі інструментів свого макета, як показано вище.
— Аджит

29

Якщо ви використовуєте панель інструментів від AppCompat (android.support.v7.widget.Toolbar,> = редакція 24 червня 2016 року), прокладка між піктограмою та заголовком може бути змінена на таке значення:

  app:contentInsetStartWithNavigation="0dp"

Щоб покращити мою відповідь, ви можете використовувати її на панелі інструментів безпосередньо всередині своєї діяльності або ви можете створити новий файл макета для своєї панелі інструментів. У цьому випадку вам просто потрібно імпортувати @id панелі інструментів за допомогою властивості include для кожного необхідного представлення даних.

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

Потім можна імпортувати макет у свою сторінку Activity.xml

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

Чудово. Було б краще, якщо ви можете надати зразок XML, щоб уточнити, куди це поставити. (Я точно знаю, куди подіти цю лінію)
— Джон Панг

@JohnPang я детально пояснив свою відповідь, сподіваюся, що це допоможе вам зрозуміти, як використовувати цю властивість.
— tryp

@ Bolein95 Ви використовуєте бібліотеку підтримки? щоб допомогти вам, будь ласка, надайте більше інформації.
— tryp

Варто зазначити, що цей параметр був введений у версії 24 бібліотеки дизайну. Отже, якщо ви застрягли в затемненні у версії 23 (як я звик до вчорашнього дня ...), ви не матимете доступу до нього.
— FlorianT

@FloriantT дякую за точність, я оновив свою відповідь щодо вашого коментаря.
— tryp

6

Використання titleMarginStartтворів для мене. Приклад 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"/>

Встановіть логотип так:

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

Ви геній. +1
— Яків Санчес


2

Я використовую власне зображення замість тексту заголовка за замовчуванням праворуч від логотипу моїх програм. Це налаштовано на зразок програмно

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

Проблеми з вищезазначеними відповідями для мене - це пропозиція @ Cliffus для мене не працює через проблеми, які інші окреслили в коментарях, і хоча налаштування програмних накладок @dushyanth, можливо, працювало в минулому, я думаю, що факт, що інтервал - це тепер встановлено з використанням android:layout_marginEnd="8dip" оскільки API 17 вручну, встановлення прокладки, не повинно мати ніякого ефекту. Перегляньте посилання, яке він опублікував до git, щоб перевірити його поточний стан.

Просте рішення для мене - встановити негативний запас на моєму власному режимі перегляду в панелі actionBar android:layout_marginLeft="-14dp". Швидкий тест показує, що він працює для мене на 2.3.3 та 4.3 з використаннямActionBarCompat

Сподіваюся, це комусь допоможе!


@Diri можеш додати більше, чи можемо ми зробити панель дій вгору, вниз, вліво, вправо
— Amitsharma

@amitsharma - я не впевнений, що саме ти маєш на увазі - ти маєш на увазі переміщення панелі дій з верхньої частини екрана? Якщо так, я думаю, що вам потрібно створити спеціальний перегляд панелі дій, щоб це зробити - це здається, що це може бути не так добре, хоча :)
— Дорі,

в такому випадку я не знаю, що ви маєте на увазі під "чи можна додати більше, чи можемо ми зробити панель дій вгору, вниз, вліво, вправо"
— Дорі

2

Я вирішив цю проблему за допомогою користувацького макета навігації

Використовуючи його, ви можете налаштувати будь-що в заголовку на панелі дій:

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

У мене була подібна проблема, але з інтервалом між вгору та спеціальною піктограмою / логотипом програми на панелі дій. Рішення Dushyanth щодо налаштування прокладки програмно працювало для мене (налаштування накладки на значок додатка / логотипу). Я намагався знайти або android.R.id.home, або R.id.abs__home ( лише ActionBarSherlock , оскільки це забезпечує сумісність у зворотному напрямку), і, здається, він працює на 2.3-4.3 пристроях, на яких я тестував.


0

У моєму випадку це було за допомогою Панелі інструментів, і я вирішив це так:

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>

У своєму фрагменті я перевіряю 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);

Удачі!


0

Ви можете змінити dravableSize вашого DrawerArrow так:

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

Це неправильна відповідь, оскільки ви не можете вибрати сторону накладки та масштабування значка DrawerArrow при зміні dravableSize (dravableSize = width = height). Але можна відступити зліва. Щоб відступити від права робити

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

0

Я використав цей метод, setContentInsetsAbsolute(int contentInsetLeft, int contentInsetRight)і він працює!

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

0

Коли ви користуєтеся спеціальною панеллю інструментів, ви можете використовувати її

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

а на макеті панелі інструментів просто встановіть app:titleMarginStart="16dp"

Зауважте, що вам потрібно встановити значок як логотип, а не getSupportActionBar().setIcon(R.drawable.logo) використовувати: getSupportActionBar().setLogo(R.drawable.logo)


0

Я звикла AppBarLayoutі звичайно ImageButtonце робила.

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

Мій код Java:

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

0

Ви також можете досягти цього методом:

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

0

У своєму XML встановіть app:titleMarginу вікні панелі інструментів наступне:

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

Або у своєму коді:

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

-2

ця робота для мене, щоб додати прокладку до заголовка, а для ActionBarзначка я встановив це програмно.

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

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

Просто додайте " "назву програми. Це додасть пробіл між піктограмою та заголовком


Це не погано, я не знаю, чому це так зважено
— Мартін Де Сімоне

можливо, іноді найпростіший варіант рішення є найкращим! дякую
— Нуман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.