簡體   English   中英

Android:從操作欄的自定義布局中刪除左邊距

[英]Android: remove left margin from actionbar's custom layout

我正在使用自定義操作欄視圖,正如您在下面的屏幕截圖中看到的那樣,操作欄中有一個空白的灰色空間。 我想刪除它。

在此處輸入圖像描述

我做了什么:

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

如果您通過 XML 添加Toolbar ,您可以簡單地添加 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" />

嘗試這個:

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

我在我的項目中使用了這段代碼,祝你好運;

左插圖是由 Toolbar 的contentInsetStart引起的,默認為 16dp。

更改它以與關鍵線對齊。

支持庫 v24.0.0 的更新:

為了匹配 Material Design 規范,還有一個額外的屬性contentInsetStartWithNavigation ,默認為 16dp。 如果您還有導航圖標,請更改此設置。

事實證明,這是設計庫第 24 版中引入的新材料設計規范的一部分。

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

但是,可以通過將以下屬性添加到工具欄小部件來刪除額外的空間。

app:contentInsetStartWithNavigation="0dp"

前 : 在此處輸入圖像描述

后 : 在此處輸入圖像描述

我發現了另一個改變 toolbarStyle 的解決方案(參考 appcompat-v7 ),代碼如下:

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


<style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
</style>
<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">

這應該足夠好了。

只需將app:contentInsetStart="0dp"添加到工具欄的 XML 屬性即可。

只需修改您的styles.xml

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

僅將app:contentInsetStart="0dp"添加到工具欄刪除剩余的空間。

所以你的 Toolbar 定義看起來像這樣

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

它看起來像這樣

在此處輸入圖像描述

您可以設置自定義視圖,而不是在布局中添加工具欄,如下所示。

Toolbar parent = (Toolbar) customView.getParent();
parent.setContentInsetsAbsolute(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>

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

您需要在工具欄中添加這一行 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"/>

這對我有用

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

在工具欄中將“contentInset ...”屬性設置為 0 對我不起作用。 Nilesh Senta 更新風格的解決方案奏效了!

樣式.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);

科特林

    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)

我沒有在任何地方找到我的問題(第一張圖片)的解決方案,但經過幾個小時的挖掘,我最終得到了一個最簡單的解決方案。 請注意,我嘗試了很多 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);
}

圖二

在此處輸入圖像描述

最正確和最簡單的答案在另一篇文章中,這個:

Android Lollipop,AppCompat ActionBar自定義視圖不占用整個屏幕寬度

它被標記為正確,在我嘗試之后,我可以確認它是有效的。

像這樣創建工具欄:

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

只添加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">
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);

您可以在 xml 文件中的工具欄視圖組內使用相對布局,並根據用例的需要調整小部件的位置。無需創建自定義布局並將其膨脹並附加到工具欄。 在您的 java 代碼中完成后,將 setContentInsetsAbsolute(0,0) 與您的工具欄對象一起使用,然后再將其設置為布局中的支持操作欄。

最好在 app actionbar 的樣式中添加一個背景項,使其與自定義 actionbar 的背景顏色保持一致:

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

android 6.0之后,actionbar甚至還有margin-right空間,不能設置。 像這樣在活動中添加右邊距調整:(視圖是自定義的操作欄或其中的右鍵)

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+ 應用程序之后才支持操作欄機制。 如果我們使用工具欄(支持 lib v7)代替,我們應該在每個活動的每個 xml 中布局它,並注意在 Android 5.0 或更高版本的設備中與系統狀態欄重疊的問題。

在 xml 中為 Toolbar 標簽添加這兩個屬性:

app:contentInsetEnd="0dp"
app:contentInsetStart="0dp"

並在內部代碼添加以下行:

// remove extra padding of toolbar
toolbar.setContentInsetsAbsolute(0, 0);
toolbar.setPadding(0, 0, 0, 0);

在移動和平板設備上都進行了測試。

<androidx.appcompat.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="68dp"
            android:elevation="12dp"
            app:contentInsetStart="0dp">

你的應用支持android 5嗎? 如果不支持,那么您可以降級支持操作欄v7的版本。 它看起來像:

編譯'com.android.support:appcompat-v7:19.0.+'(不要使用v7:21+)

也使目標版本的應用程序少於21。

targetSdkVersion 14

如果您的應用支持android 5 - >,您將需要自定義ToolBar。 (因為appcombat-v7:21有一些變化)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM