Android: удалить левое поле из пользовательского макета панели действий


269

Я использую настраиваемый вид панели действий, и, как вы можете видеть на скриншоте ниже, на панели действий есть пустое серое пространство. Я хочу удалить это.

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

Что я сделал:

RES / значения-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 / значения / my_custom_actionbar.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>

Основное занятие

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 Это не работает на моем конце. и для андроида: toolbarStyle IDE жалобы на требуемый уровень API 21 мин составляет 11. Работает ли это решение для вас?
Программист

Ответы:


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 " для всех, кому не хватает части "app" в xml.
Пракаш

3
В чем разница между использованием "app:" и "android:" ..?
Микро

3
Это разные пространства имен. Пространство имен «Android» традиционно используется для всех атрибутов, определенных ОС Android. Пространство имен "app" традиционно используется для атрибутов, которые определяются вашим приложением, либо путем импорта библиотек, либо путем добавления ваших собственных в файл attrs.xml. Имейте в виду, что «дескриптор» пространства имен может быть таким, каким вы его хотите, он определяется с помощью атрибута xmlns в корневом макете или, в данном случае, в самом элементе макета. Вы можете сделать это "xmlns: nougat", если хотите. То есть в привязке данных Android я обычно использую «привязку» для привязки адаптеров.
LukeWaggoner

@idratherbeintheair У меня есть вид поиска на панели инструментов, но когда я скрываю его, используя видимость, граница означает, что граница вида поиска означает, что вид границы все еще отображается на панели инструментов. есть идеи по этому поводу?
Джей Ратод RJ

24
в моем случае, добавление этого атрибута в конструкции XML из android.support.v7.widget.Toolbar: app:contentInsetStartWithNavigation="0dp"было достаточно.
вычислительная

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. Любое решение
Прамод J Джордж

11
пришлось добавить и parent.setPadding(0, 0, 0, 0);для таблеток
Александр Г

47

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

Измените это, чтобы выровнять к ключевой линии.

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

Для соответствия спецификации Material Design есть дополнительный атрибут, contentInsetStartWithNavigationкоторый по умолчанию равен 16dp. Измените это, если у вас также есть значок навигации.

Оказалось, что это является частью новой Спецификации дизайна материала, представленной в версии 24 библиотеки проектирования.

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

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

app:contentInsetStartWithNavigation="0dp"

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

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


это решение - то, что у меня работало с использованием Android Jetpack (androidx)
Francisc0

27

Я нашел другое разрешение (ссылка appcompat-v7), которое изменяет toolbarStyle, следующий код:

<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

Просто измените ваш styles.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"
Adil Soomro

1

Я нигде не нашел решения для своей проблемы (первое изображение), но в итоге я нашел простейшее решение после нескольких часов копания. Обратите внимание, что я пробовал использовать множество атрибутов xml, например app: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);

Механизм Actionbar поддерживается только после приложения Android 3.0+. Если вместо этого мы используем панель инструментов (для поддержки 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

Если вы проверяете документацию панели инструментов, по умолчанию у нее определен стиль и есть элемент 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? Если не поддерживается, то вы можете понизить версию поддержки actionbar v7. Это выглядит так:

скомпилируйте 'com.android.support:appcompat-v7:19.0.+' (не используйте v7: 21+)

также сделать целевую версию приложения менее 21.

targetSdkVersion 14

Если ваше приложение поддерживает Android 5 -> вам понадобится пользовательская панель инструментов. (Becuase appcombat-v7: 21 есть некоторые изменения).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.