Android: xóa lề trái khỏi bố cục tùy chỉnh của Actionbar


269

Tôi đang sử dụng chế độ xem thanh hành động tùy chỉnh và như bạn có thể thấy trong ảnh chụp màn hình bên dưới, có một khoảng trống màu xám trong thanh hành động. Tôi muốn loại bỏ nó.

nhập mô tả hình ảnh ở đây

Tôi đã làm gì

res / value-v11 / style.xml

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

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

Rõ ràng

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

Hoạt động chủ yêu

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

Tôi đã tìm thấy một bài viết gần đây, đó là chỉ ra rằng có một vấn đề với bản phát hành mới nhất. Tôi cũng đã cập nhật ADT và SDK lên Android 5.

Chế độ xem tùy chỉnh của Android ActionBar không lấp đầy cha mẹ

Tôi không biết tôi nên làm gì.

Chỉnh sửa (giải pháp một phần):

Không hoạt động trên Android <= API 10.

Chế độ xem tùy chỉnh Android Lollipop, AppCompat ActionBar không chiếm toàn bộ chiều rộng màn hình

Tôi đã thay đổi điều gì:

Sử dụng phiên bản sdk mới nhất:

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

Thêm một 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
bạn đã thấy bài đăng này
Kaushik

1
@Zbarcea Nó không hoạt động ở cuối của tôi. và cho android: thanh công cụStyle IDE khiếu nại về yêu cầu api cấp 21 phút là 11. Giải pháp này có hiệu quả với bạn không?
Lập trình viên

Câu trả lời:


609

Nếu bạn đang thêm Toolbarthông qua XML, bạn chỉ cần thêm các thuộc tính XML để xóa nội dung.

<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 " cho tất cả những người thiếu phần 'ứng dụng' của xml.
Prakash

3
Sự khác biệt giữa việc sử dụng "ứng dụng:" và "android:" .. là gì?
Micro

3
Chúng là những không gian tên khác nhau. không gian tên "android" thường được sử dụng cho tất cả các thuộc tính được xác định bởi HĐH Android. Không gian tên "ứng dụng" theo truyền thống được sử dụng cho các thuộc tính được xác định bởi ứng dụng của bạn, thông qua việc nhập thư viện hoặc thêm tệp của riêng bạn vào tệp attrs.xml. Hãy nhớ rằng "xử lý" không gian tên có thể là bất cứ thứ gì bạn muốn, nó được xác định bằng cách sử dụng thuộc tính xmlns trên bố cục gốc của bạn hoặc, trong trường hợp này, trong chính thành phần bố cục. Bạn có thể làm cho nó "xmlns: nougat" nếu bạn muốn. tức là trong cơ sở dữ liệu Android, tôi thường sử dụng "bind" cho bindAd chương.
LukeWaggoner

@idratherbeintheair Tôi có chế độ xem tìm kiếm trên thanh công cụ nhưng khi tôi ẩn nó bằng khả năng hiển thị, đường viền có nghĩa là ranh giới của chế độ xem tìm kiếm có nghĩa là loại đường viền vẫn hiển thị trên thanh công cụ. Bất cứ ý tưởng về điều đó?
Jay Rathod RJ

24
trong trường hợp của tôi, thêm thuộc tính này vào thiết kế xml của android.support.v7.widget.Toolbar: app:contentInsetStartWithNavigation="0dp"là đủ.
tính toán

198

thử cái này:

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

Tôi đã sử dụng mã này trong dự án của tôi, chúc may mắn;


4
Thông minh! Parent.setContentInsetsAbsolute (0,0) thực hiện thủ thuật!
Bam

7
Những công việc này. Tuy nhiên, nó có thể thay đổi bố cục một chút. Ngoài ra, bạn có thể làm actionBar.setCustomView(R.layout.app_title_bar); Toolbar parent =(Toolbar) actionBar.getCustomView().getParent(); parent.setContentInsetsAbsolute(0,0);hơn là thổi phồng bố cục.
Markymark

Không làm việc cho tôi, mặc dù vấn đề của tôi chỉ hơi khác nhau.
Solace

Hàm setContentInsetsAbsolute chỉ được hỗ trợ nếu SDK> 21. Bất kỳ giải pháp
Pramod J George

11
cũng phải thêm parent.setPadding(0, 0, 0, 0);cho máy tính bảng
Alexandre G

47

Hình bên trái được tạo bởi Thanh công cụ contentInsetStart, theo mặc định là 16dp.

Thay đổi điều này để căn chỉnh theo dòng chính.

Cập nhật cho thư viện hỗ trợ v24.0.0:

Để phù hợp với thông số Thiết kế Vật liệu, có một thuộc tính bổ sung contentInsetStartWithNavigationtheo mặc định là 16dp. Thay đổi điều này nếu bạn cũng có một biểu tượng điều hướng.

Hóa ra đây là một phần của Đặc tả thiết kế Vật liệu mới được giới thiệu trong phiên bản 24 của thư viện Thiết kế.

https: // m vật liệu @ potypes/navulation.html

Tuy nhiên, có thể xóa không gian thừa bằng cách thêm thuộc tính sau vào tiện ích Thanh công cụ.

app:contentInsetStartWithNavigation="0dp"

Trước : nhập mô tả hình ảnh ở đây

Sau : nhập mô tả hình ảnh ở đây


giải pháp này là những gì hiệu quả với tôi khi sử dụng Android Jetpack (androidx)
Francisc0

27

Tôi tìm thấy một độ phân giải khác (tham chiếu appcompat-v7) thay đổi thanh công cụStyle, mã sau đây:

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


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

Vui lòng xem stackoverflow.com/questions/31359608/ này , nếu bạn có thể giúp tôi.
Kedia Prashant

tôi sẽ kiểm tra và để bạn 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">

Điều này là đủ tốt.


11

Chỉ cần sửa đổi tệp kiểu của bạn

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

8

Thay vì thêm một thanh công cụ trong bố cục, bạn có thể đặt chế độ xem tùy chỉnh của mình như hiển thị bên dưới.

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

7

Chỉ thêm app:contentInsetStart="0dp"vào thanh công cụ loại bỏ không gian còn lại.

Vì vậy, định nghĩa Thanh công cụ của bạn trông như thế này

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

và nó trông như thế này

nhập mô tả hình ảnh ở đây


4

Sử dụng AppCompatAcitivtybạn có thể sử dụng chỉ bằng cách

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

Bạn cần thêm dòng này app2: contentInsetStart = "0dp" trong thanh công cụ của bạn

<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
Đối với tôi đó là app:contentInsetStart="0dp"
Adil Soomro

1

Tôi không tìm thấy giải pháp cho vấn đề của mình (ảnh đầu tiên) ở bất cứ đâu, nhưng cuối cùng tôi kết thúc với một giải pháp đơn giản nhất sau vài giờ đào. Xin lưu ý rằng tôi đã thử với rất nhiều thuộc tính xml như app:setInsetLeft="0dp", v.v. nhưng không ai trong số chúng giúp được trong trường hợp này.

Bức tranh 1 nhập mô tả hình ảnh ở đây

đoạn mã sau đã giải quyết vấn đề này như trong Hình 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);
}

Hình 2

nhập mô tả hình ảnh ở đây


1

Đặt thuộc tính "contentInset ..." thành 0 trong Thanh công cụ không hoạt động đối với tôi. Giải pháp của Nilesh Senta để cập nhật phong cách làm việc!

kiểu tệp

<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

Tạo thanh công cụ như thế này:

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

vui lòng theo liên kết này để biết thêm - Mẹo Android


0

chỉ thêm android:padding="0dp"công việc cho tôi

<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

Bạn chỉ có thể sử dụng bố cục tương đối bên trong nhóm xem thanh công cụ trong tệp xml của mình và điều chỉnh vị trí của các widget khi bạn yêu cầu chúng cho trường hợp sử dụng của mình. Không cần tạo bố cục tùy chỉnh & thổi phồng nó và gắn vào thanh công cụ. Sau khi thực hiện trong mã java của bạn, hãy sử dụng setContentInsetsAbsolute (0,0) với đối tượng thanh công cụ của bạn trước khi đặt nó làm thanh hành động hỗ trợ trong bố cục của bạn.


0

Sẽ tốt hơn nếu thêm một mục nền vào kiểu của thanh hành động ứng dụng để phù hợp với màu nền của thanh hành động tùy chỉnh:

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

Sau Android 6.0, thanh hành động thậm chí có không gian bên phải và không thể được đặt. Thêm một lề phải điều chỉnh trong hoạt động như thế này: ( chế độ xem là thanh hành động tùy chỉnh hoặc nút bên phải trong đó)

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

Cơ chế hoạt động của thanh tác vụ chỉ được hỗ trợ sau ứng dụng Android 3.0+. Thay vào đó, nếu chúng tôi sử dụng thanh công cụ (hỗ trợ lib v7), chúng tôi nên bố trí nó trong từng xml của từng hoạt động và xử lý vấn đề chồng chéo với thanh trạng thái hệ thống trong thiết bị Android 5.0 trở lên.


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)

0

công việc này cho tôi

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

0

Nếu bạn kiểm tra tài liệu của thanh công cụ, theo mặc định, nó có kiểu được xác định và có một mục contentInsetStart.

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

Nếu bạn muốn ghi đè phần đệm này thì có thể thực hiện theo hai cách.

1. Ghi lại kiểu và thêm kiểu của riêng bạn với các giá trị contentInsetStart và contentInsetEnd

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

2.Trong XML, bạn có thể xác định trực tiếp các giá trị contentInsetStart và 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

Ứng dụng của bạn có hỗ trợ Android 5 không? Nếu không hỗ trợ thì bạn có thể hạ cấp phiên bản của thanh hành động hỗ trợ v7. Nó trông giống như:

biên dịch 'com.android.support:appcompat-v7:19.0.+' (Không sử dụng v7: 21+)

cũng làm cho phiên bản mục tiêu của ứng dụng dưới 21.

mục tiêuSdkVersion 14

Nếu ứng dụng của bạn hỗ trợ android 5 -> bạn sẽ cần ToolBar tùy chỉnh. (Becuase appcombat-v7: 21 có một số thay đổi).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.