Android: remova a margem esquerda do layout personalizado da actionbar

269

Estou usando uma visualização personalizada da barra de ação e, como você pode ver na captura de tela abaixo, há um espaço cinza em branco na barra de ação. Eu quero removê-lo.

insira a descrição da imagem aqui

O que eu fiz:

res / valores-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 / valores / 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>

Manifesto

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

Atividade principal

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);
}

Eu encontrei um post recente, que indica que há um problema com a versão mais recente. Também atualizei o ADT e o SDK para o Android 5.

A exibição personalizada do Android ActionBar não está preenchendo o pai

Não sei o que devo fazer.

Editar (solução parcial):

Não está funcionando no Android <= API 10.

Android Lollipop, a visualização personalizada AppCompat ActionBar não ocupa a largura da tela inteira

O que eu mudei:

Use a versão mais recente do sdk:

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

Adicione um 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>
Zbarcea Christian
fonte
1
você viu este post
Kaushik
1
@Zbarcea Não está funcionando no meu fim. e para android: toolbarStyle As queixas do IDE sobre exigir nível de API 21 min são 11. Esta solução está funcionando para você?
programador

Respostas:

609

Se você estiver adicionando o Toolbarvia XML, poderá simplesmente adicionar atributos XML para remover inserções de conteúdo.

<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" />
LukeWaggoner
fonte
2
xmlns: app = " schemas.android.com/apk/res-auto " para todos os que não fazem parte do 'app' do xml.
Prakash
3
Qual é a diferença entre usar "app:" e "android:" ..?
Micro
3
Eles são diferentes namespaces. o espaço para nome "android" é tradicionalmente usado para todos os atributos definidos pelo sistema operacional Android. O espaço para nome "app" é tradicionalmente usado para atributos definidos pelo aplicativo, importando bibliotecas ou adicionando os seus no arquivo attrs.xml. Lembre-se de que o espaço para nome "identificador" pode ser o que você quiser, é definido usando o atributo xmlns no layout raiz ou, nesse caso, no próprio elemento de layout. Você pode criar "xmlns: nougat" se desejar. ou seja, na ligação de dados do Android, normalmente uso "bind" para bindingAdapters.
10306 LukeWaggoner
@idratherbeintheair Eu tenho uma visualização de pesquisa na barra de ferramentas, mas quando a oculto usando visibilidade, a borda significa limite da visualização de pesquisa significa que o tipo de borda ainda está aparecendo na barra de ferramentas. alguma ideia disso?
Jay Rathod RJ
24
no meu caso, adicionar este atributo ao design xml de android.support.v7.widget.Toolbar: app:contentInsetStartWithNavigation="0dp"foi suficiente.
computingfreak
198

tente isto:

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

Eu usei esse código no meu projeto, boa sorte;

cocotyty
fonte
4
Excelente! parent.setContentInsetsAbsolute (0,0) faz o truque!
Bam
7
Isso funciona. No entanto, isso pode alterar um pouco o layout. Como alternativa, você pode fazer, em actionBar.setCustomView(R.layout.app_title_bar); Toolbar parent =(Toolbar) actionBar.getCustomView().getParent(); parent.setContentInsetsAbsolute(0,0);vez de aumentar o layout.
Markymark 17/07
Não está funcionando para mim, embora meu problema seja um pouco diferente.
Solace
A função setContentInsetsAbsolute é suportada apenas se SDK> 21. Qualquer solução
Pramod J George
11
tive que adicionar parent.setPadding(0, 0, 0, 0);para tablets também
Alexandre G
47

A inserção esquerda é causada pela barra de ferramentas, contentInsetStartque por padrão é 16dp.

Altere isso para alinhar à linha principal.

Atualização para a biblioteca de suporte v24.0.0:

Para corresponder à especificação do Material Design, há um atributo adicional contentInsetStartWithNavigationque, por padrão, é 16dp. Altere isso se você também tiver um ícone de navegação.

Verificou-se que isso faz parte de uma nova Especificação de Projeto de Material introduzida na versão 24 da biblioteca de Design.

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

No entanto, é possível remover o espaço extra adicionando a seguinte propriedade ao widget Barra de Ferramentas.

app:contentInsetStartWithNavigation="0dp"

Antes : insira a descrição da imagem aqui

Depois de : insira a descrição da imagem aqui

Naveen Kumar M
fonte
esta solução é o que funcionou para mim usando Jetpack Android (androidx)
Francisc0
27

Encontrei outra resolução (referência appcompat-v7) que altera o toolbarStyle, a seguir código:

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


<style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
</style>
madhu527
fonte
Por favor, dê uma olhada neste stackoverflow.com/questions/31359608/… , se você puder me ajudar.
Prashant Kedia
i irá verificar e deixá-lo konw
madhu527
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">

Isso deve ser bom o suficiente.

Prakash
fonte
11

Apenas modifique seu styles.xml

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

Em vez de adicionar uma barra de ferramentas no layout, você pode definir sua exibição personalizada, como mostrado abaixo.

Toolbar parent = (Toolbar) customView.getParent();
parent.setContentInsetsAbsolute(0,0);
Raja Jawahar
fonte
7

Adicione apenas app:contentInsetStart="0dp"à barra de ferramentas e remova esse espaço esquerdo.

Portanto, sua definição da Barra de Ferramentas se parece com esta

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

e fica assim

insira a descrição da imagem aqui

Keyur
fonte
4

Usando AppCompatAcitivtyvocê pode usar apenas

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);
peixe morto
fonte
3

Você precisa adicionar esta linha app2: contentInsetStart = "0dp" na sua barra de ferramentas

<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"/>
Rahul
fonte
2
Para mim foi # app:contentInsetStart="0dp"
Adil Soomro 28/06
1

Não encontrei uma solução para o meu problema (primeira foto) em nenhum lugar, mas finalmente acabei com uma solução mais simples após algumas horas de escavação. Por favor, note que eu tentei com muitos atributos xml como app:setInsetLeft="0dp"etc., mas nenhum deles ajudou nesse caso.

Imagem 1 insira a descrição da imagem aqui

o código a seguir resolveu esse problema como na Figura 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);
}

Quadro 2

insira a descrição da imagem aqui

mifthi
fonte
1

Definir atributos "contentInset ..." como 0 na barra de ferramentas não funcionou para mim. A solução de Nilesh Senta para atualizar o estilo funcionou!

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);
Poseidon
fonte
0

Crie barra de ferramentas como esta:

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

siga este link para mais informações - Android Tips

Aneh Thakur
fonte
0

apenas adicionando android:padding="0dp"trabalho para mim

<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">
Vencedor
fonte
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);

fonte
0

Você pode apenas usar o layout relativo dentro do grupo de exibição da barra de ferramentas em seu arquivo xml e ajustar as posições dos widgets conforme necessário para o seu caso de uso. Não há necessidade de criar um layout personalizado, inflá-lo e anexá-lo à barra de ferramentas. Uma vez feito no seu código java, use setContentInsetsAbsolute (0,0) com o objeto da barra de ferramentas antes de defini-lo como barra de ação de suporte no seu layout.

Soumyadeb Chattopadhyay
fonte
0

Seria melhor adicionar um item de plano de fundo ao estilo da barra de ação do aplicativo para consistir com a cor de plano de fundo da barra de ação personalizada:

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

Após o Android 6.0, a barra de ação ainda possui um espaço de margem direita e não pode ser configurada. Adicione uma margem direita ajustando-se à atividade como esta: (a visualização é a barra de ação personalizada ou um botão direito)

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

O machenismo da barra de ação é suportado apenas após o aplicativo Android 3.0+. Se usarmos uma barra de ferramentas (da suporte lib v7), devemos colocá-la em cada xml de cada atividade e cuidar da questão da sobreposição com a barra de status do sistema no dispositivo Android 5.0 ou posterior.

Shrdi
fonte
0

Kotlin

    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)
Chen Jiling
fonte
0

esse trabalho pra mim

toolbar.setPadding(0,0,0,0);
toolbar.setContentInsetsAbsolute(0,0);
Maysam R
fonte
0

Se você verificar a documentação da barra de ferramentas, por padrão, ela tem estilo definido e existe um item contentInsetStart.

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

Se você deseja substituir esse preenchimento, isso pode ser feito de duas maneiras.

1. Substitua o estilo e adicione seu próprio estilo com os valores contentInsetStart e contentInsetEnd

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

2.Em XML, você pode definir diretamente os valores contentInsetStart e 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>
Sharath kumar
fonte
-1

Seu aplicativo suporta o Android 5? Se não houver suporte, você poderá fazer o downgrade da versão do support actionbar v7. É parecido com:

compile 'com.android.support:appcompat-v7:19.0.+' (Não use v7: 21+)

também torna a versão de destino do aplicativo menor que 21.

targetSdkVersion 14

Se o seu aplicativo suportar o Android 5 ->, você precisará da Barra de Ferramentas personalizada. (Porque o appcombat-v7: 21 tem alguma mudança).

quangson91
fonte