Android: видаліть лівий запас із власної розкладки панелі дій


269

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

введіть тут опис зображення

Що я зробив:

res / values-v11 / styles.xml

<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">
        <item name="android:actionBarStyle">@style/ActionBarStyle</item>
        <item name="actionBarStyle">@style/ActionBarStyle</item>
</style>

res / values ​​/ my_custom washingbar.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="ActionBarStyle" parent="@style/Widget.AppCompat.Light.ActionBar.Solid">
        <item name="android:height">60dp</item>
    </style>
</resources>

Маніфест

<uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="19" />

<application
            android:icon="@drawable/ic_launcher"
            android:label="@string/AppName"
            android:theme="@style/AppBaseTheme" >
    <!-- activities... etc -->
</application>

MainActivity

public void onCreate(Bundle bundle) {
    super.onCreate(bundle);

    ActionBar actionbar = getSupportActionBar();

    actionbar.setDefaultDisplayHomeAsUpEnabled(false);
    actionbar.setDisplayHomeAsUpEnabled(false);
    actionbar.setDisplayShowCustomEnabled(true);
    actionbar.setDisplayShowHomeEnabled(false);
    actionbar.setDisplayShowTitleEnabled(false);
    actionbar.setDisplayUseLogoEnabled(false);
    actionbar.setHomeButtonEnabled(false);

    // Add the custom layout
    View view = LayoutInflater.from(this).inflate(R.layout.actionbar, null, false);
    actionbar.setCustomView(view);
}

Я знайшов недавню публікацію, яка вказує на те, що існує проблема з останнім випуском. Я також оновив ADT і SDK до Android 5.

Налаштування власного подання Android ActionBar не заповнює батьківський

Я не знаю, що мені робити.

Редагування (часткове рішення):

Не працює на Android <= API 10.

Android Lollipop, нестандартний вид програми AppCompat ActionBar не займає ширину екрана

Що я змінив:

Використовуйте останню версію SDK:

<uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="21" />

Додайте toolbarStyle:

<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">
        <item name="android:actionBarStyle">@style/ActionBarStyle</item>
        <item name="actionBarStyle">@style/ActionBarStyle</item>

        <item name="android:toolbarStyle">@style/ToolbarStyle</item>
        <item name="toolbarStyle">@style/ToolbarStyle</item>
</style>

<style name="ToolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
    <item name="contentInsetStart">0dp</item>
    <item name="android:contentInsetStart">0dp</item>
</style>

1
Ви бачили цю посаду
Каушик

1
@Zbarcea Це не працює в моєму кінці. і для android: toolbarStyle IDE скарги на вимогу вимагає рівня api 21 хв є 11. Чи працює це рішення для u?
Програміст

Відповіді:


609

Якщо ви додаєте Toolbarчерез XML, ви можете просто додати атрибути XML, щоб видалити вставки з вмістом.

<android.support.v7.widget.Toolbar
    xmlns:app="schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/primaryColor"
    android:contentInsetLeft="0dp"
    android:contentInsetStart="0dp"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    android:contentInsetRight="0dp"
    android:contentInsetEnd="0dp"
    app:contentInsetRight="0dp"
    app:contentInsetEnd="0dp" />

2
xmlns: app = " schemas.android.com/apk/res-auto " для всіх, кому не вистачає "додаток", частина xml.
Пракаш

3
Яка різниця між використанням "app:" та "android:" ..?
Мікро

3
Вони різні простори імен. простір імен "android" традиційно використовується для всіх атрибутів, визначених ОС Android. Простір імен "app" традиційно використовується для атрибутів, визначених вашим додатком, або через імпорт бібліотек, або додавши власну у файл attrs.xml. Майте на увазі, що "ручка" простору імен може бути будь-якою, яку ви хочете, вона буде визначена за допомогою атрибута xmlns у вашій кореневій компоновці або, у цьому випадку, у самому елементі компонування. Ви можете зробити це "xmlns: nugat", якщо хочете. тобто в Android-прив'язці даних я зазвичай використовую "прив'язувати" для прив'язки даних.
LukeWaggoner

@idratherbeintheair У мене на панелі інструментів є перегляд пошуку, але коли я приховую його за допомогою видимості, межа межі перегляду пошуку означає, що вид межі все ще відображається на панелі інструментів. якась ідея з цього приводу?
Jay Rathod RJ

24
у моєму випадку додавання цього атрибуту до дизайну xml з android.support.v7.widget.Toolbar: app:contentInsetStartWithNavigation="0dp"було достатньо.
computingfreak

198

спробуйте це:

    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setDisplayShowTitleEnabled(false);
    View customView = getLayoutInflater().inflate(R.layout.main_action_bar, null);
    actionBar.setCustomView(customView);
    Toolbar parent =(Toolbar) customView.getParent();
    parent.setPadding(0,0,0,0);//for tab otherwise give space in tab
    parent.setContentInsetsAbsolute(0,0);

Я використовував цей код у своєму проекті, удачі;


4
Відмінно! parent.setContentInsetsAbsolute (0,0) робить трюк!
Бам

7
Це працює. Однак це може трохи змінити макет. Крім того, ви можете зробити, actionBar.setCustomView(R.layout.app_title_bar); Toolbar parent =(Toolbar) actionBar.getCustomView().getParent(); parent.setContentInsetsAbsolute(0,0);а не надувати макет.
Markymark

Не працює для мене, хоча моя проблема просто трохи інша.
Потіха

Функція setContentInsetsAbsolute підтримується лише в тому випадку, якщо SDK> 21. Будь-яке рішення
Pramod J George

11
довелося додати і parent.setPadding(0, 0, 0, 0);для планшетів
Олександр G

47

Ліва вставка викликана Панеллю інструментів, contentInsetStartяка за замовчуванням становить 16dp.

Змініть це, щоб вирівняти ключовий рядок.

Оновлення для бібліотеки підтримки v24.0.0:

Для відповідності специфікації Material Design є додатковий атрибут, contentInsetStartWithNavigationякий за замовчуванням становить 16dp. Змініть це, якщо у вас також є значок навігації.

З'ясувалося, що це частина нової специфікації дизайну матеріалу, представленої у версії 24 бібліотеки Design.

https://material.google.com/patterns/navigation.html

Однак видалити додатковий простір можна, додавши в віджет панелі інструментів наступне властивість.

app:contentInsetStartWithNavigation="0dp"

Перед: введіть тут опис зображення

Після: введіть тут опис зображення


це рішення - те, що працювало для мене, використовуючи Android Jetpack (androidx)
Francisc0

27

Я знайшов іншу роздільну здатність (посилання appcompat-v7), яка змінює панель інструментівStyle, з таким кодом:

<item name="toolbarStyle">@style/Widget.Toolbar</item>


<style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
</style>

Погляньте на цей stackoverflow.com/questions/31359608/… , якщо ви можете мені допомогти.
Прашант Кедія

я перевірю і дозволю вам
зрозуміти

14
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentInsetLeft="0dp"
app:contentInsetStart="0dp"
android:paddingLeft="0dp">

Це повинно бути досить добре.


11

Просто змініть свої стилі.xml

<!-- ActionBar styles -->
    <style name="MyActionBar" parent="Widget.AppCompat.ActionBar">
        <item name="contentInsetStart">0dp</item>
        <item name="contentInsetEnd">0dp</item>
    </style>

8

Замість додавання панелі інструментів у макет ви можете встановити власний вид, як показано нижче.

Toolbar parent = (Toolbar) customView.getParent();
parent.setContentInsetsAbsolute(0,0);

7

Лише додати app:contentInsetStart="0dp" на панель інструментів видаліть цей залишений пробіл.

Тож визначення панелі інструментів виглядає приблизно так

 <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    app:contentInsetStart="0dp"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

і це виглядає приблизно так

введіть тут опис зображення


4

Використання AppCompatAcitivtyВи можете використовувати просто

Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
View logo = getLayoutInflater().inflate(R.layout.custom_toolbar, null);
mToolbar.addView(logo, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mToolbar.setContentInsetsAbsolute(0,0);

3

Вам потрібно додати цей рядок app2: contentInsetStart = "0dp" на панелі інструментів

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app2="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    app2:contentInsetStart="0dp"/>

2
Для мене це було app:contentInsetStart="0dp"
Аділ Соомро

1

Я не знайшов рішення для своєї проблеми (перша картинка) ніде, але нарешті я закінчую найпростішим рішенням через кілька годин копання. Зауважте, що я намагався з багатьма атрибутами xmlapp:setInsetLeft="0dp" , тощо., Але жоден з них не допоміг у цьому випадку.

Малюнок 1 введіть тут опис зображення

наступний код вирішив це питання, як на малюнку 2

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

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


    //NOTE THAT: THE PART SOLVED THE PROBLEM.
    android.support.design.widget.AppBarLayout abl = (AppBarLayout)
            findViewById(R.id.app_bar_main_app_bar_layout);

    abl.setPadding(0,0,0,0);
}

Малюнок 2

введіть тут опис зображення


1

Налаштування атрибутів "contentInset ..." на 0 на Панелі інструментів не працювало для мене. Рішення Nilesh Senta для оновлення стилю працювало!

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="actionBarStyle">@style/Actionbar</item>
    <item name="android:titleTextStyle">@style/ActionbarTitle</item>
</style>

<style name="Actionbar" parent="Widget.AppCompat.ActionBar">
    <item name="contentInsetStart">0dp</item>
    <item name="contentInsetEnd">0dp</item>
</style>

java (onCreate)

ActionBar actionBar =  getSupportActionBar();

actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);

ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(
            ActionBar.LayoutParams.MATCH_PARENT,
            ActionBar.LayoutParams.MATCH_PARENT
    );

View view = LayoutInflater.from(this).inflate(R.layout.actionbar_main, null);

actionBar.setCustomView(view, layoutParams);

0

Створіть панель інструментів так:

<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/menuToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="0dp"
android:background="@color/white"
android:contentInsetLeft="10dp"
android:contentInsetRight="10dp"
android:contentInsetStart="10dp"
android:minHeight="?attr/actionBarSize"
android:padding="0dp"
app:contentInsetLeft="10dp"
app:contentInsetRight="10dp"
app:contentInsetStart="10dp"></android.support.v7.widget.Toolbar>

перейдіть за цим посиланням для отримання додаткової інформації - Android Поради


0

тільки додаю android:padding="0dp"роботу для мене

<android.support.v7.widget.Toolbar
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:padding="0dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

0
ActionBar ab = getSupportActionBar();
ab.setDisplayShowHomeEnabled(true);
      ab.setDisplayShowCustomEnabled(true);
      setDisplayShowTitleEnabled(true);
      View customView =     getLayoutInflater().inflate(R.layout.activity_main,null); //here activity_main.xml is the GUI design file.
ab.setCustomView(customView);
Toolbar parent =(Toolbar) customView.getParent(); //use V7 Toolbar import
parent.setContentInsetsAbsolute(0, 0);
setPadding(5,0,0,0);

ab.setIcon(R.mipmap.ic_launcher);

0

Ви можете просто використовувати відносну компоновку всередині групи перегляду панелі інструментів у вашому XML-файлі та коригувати положення віджетів у міру необхідності їх для вашого випадку використання. Після завершення роботи у вашому коді Java використовуйте setContentInsetsAbsolute (0,0) з об’єктом панелі інструментів, перш ніж встановити його як панель дій підтримки у своєму макеті.


0

Було б краще додати фоновий елемент у стиль панелі дій програми, щоб він відповідав кольорові фону на спеціальній панелі дій:

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

Після android 6.0, панель дій навіть має простір у праві, і її неможливо встановити. Додайте правий запас коригування в такій діяльності: ( вид - це спеціальна панель дій або права кнопка в ньому)

int rightMargin = Build.VERSION.SDK_INT>=Build.VERSION_CODES.M ? 0 : 8; // may the same with actionbar leftMargin in px
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
p.setMargins(p.leftMargin, p.topMargin, rightMargin, p.bottomMargin);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
    p.setMarginEnd(rightMargin);
}
view.setLayoutParams(p);

Механізм панелі дій просто підтримується після програми Android 3.0+. Якщо ми замість цього використовуємо панель інструментів (support lib v7), ми повинні розмістити її у кожному xml кожного виду діяльності та подбати про проблему перекриття панелі стану системи на пристрої Android 5.0 або новішої версії.


0

Котлін

    supportActionBar?.displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM;
    supportActionBar?.setCustomView(R.layout.actionbar);

    val parent = supportActionBar?.customView?.parent as Toolbar
    parent?.setPadding(0, 0, 0, 0)//for tab otherwise give space in tab
    parent?.setContentInsetsAbsolute(0, 0)

0

ця робота для мене

toolbar.setPadding(0,0,0,0);
toolbar.setContentInsetsAbsolute(0,0);

0

Якщо ви перевірите документацію на панелі інструментів, вона за замовчуванням визначила стиль і є елемент contentInsetStart.

<item name="contentInsetStart">16dp</item>

Якщо ви хочете змінити цю підкладку, то це можна зробити двома способами.

1.Замініть стиль та додайте власний стиль зі значеннями contentInsetStart та contentInsetEnd

<style name="MyActionBar" parent="Widget.AppCompat.ActionBar">
    <item name="contentInsetStart">0dp</item>
    <item name="contentInsetEnd">0dp</item>
</style>

2.У XML ви можете безпосередньо визначити значення contentInsetStart і contentInsetEnd

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

    <!--Add your views here-->

</androidx.appcompat.widget.Toolbar>

-1

Чи підтримує ваш додаток android 5? Якщо не підтримується, ви можете зменшити версію панелі дій підтримки v7. Це виглядає так:

компілювати "com.android.support:appcompat-v7:19.0.+" (не використовувати v7: 21+)

також зробити цільову версію програми менше 21.

targetSdkVersion 14

Якщо ваша програма підтримує Android 5 -> вам знадобиться користувацький ToolBar. (Becuase appcombat-v7: 21 змінилися).

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