Прокладка між домашньою іконою 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.