Thanh công cụ và ActionBar theo ngữ cảnh với AppCompat-v7


182

Tôi đang làm việc bằng cách sử dụng Thanh công cụ mới được thêm vào được giới thiệu trong Lollipop và thư viện AppCompat-v7. Tôi đã làm theo hướng dẫn này khi thiết lập Thanh công cụ Tôi nhận thấy rằng khi bạn gọi thứ gì đó sẽ hiển thị ActionBar theo ngữ cảnh (chẳng hạn như tô sáng văn bản để sao chép / dán), nó sẽ đẩy Thanh công cụ xuống trên trang. Bạn có thể thấy những gì tôi đang nói về hình ảnh ở cuối trang:

Vì vậy, về cơ bản, tôi thiết lập nó như thế này. Tôi có Thanh công cụ được xác định trong tệp xml mà tôi sử dụng với các thẻ bao gồm:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"/>

Sau đó, tôi khởi tạo nó theo quan điểm của tôi:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/root"
    tools:context=".MainActivity">

    <include
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/> 

    <!-- Rest of view -->

    </LinearLayout>

Trong mã, tôi thiết lập nó như vậy:

    // On Create method of activity:
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

Có ai biết làm thế nào để ActionBar theo ngữ cảnh vượt lên trên Thanh công cụ không?

Thanh công cụ và ActionBar theo ngữ cảnh


Chủ đề nào là hoạt động của bạn sử dụng?
alanv

David, tôi chỉ cần nhấp vào liên kết và nó dường như đang làm việc cho tôi.
ariets

Câu trả lời:


319

Cập nhật:

Giải pháp: sử dụng thuộc tính windowActionModeOverlay . Đặt điều này trong chủ đề của bạn:

<item name="windowActionModeOverlay">true</item>

và mã hành động sẽ được hiển thị trên thanh hành động thay vì đẩy nó xuống. (Nếu bạn không sử dụng AppCompat mới nhất thì bạn cần thêm tiền tố "android:" vào thuộc tính). Về cơ bản, nó cho AppCompat biết rằng bạn có một thanh công cụ nằm ở phía trên màn hình và nó sẽ vẽ ActionMode trên đầu nó.


Câu trả lời cũ / cách giải quyết:

Tôi gặp vấn đề tương tự. Bất kể tôi đặt chủ đề nào, nó luôn đẩy Thanh công cụ tôi đặt thành ActionBar. Tôi đã thử với và không có thư viện hỗ trợ, nhưng nó không thành vấn đề.

Thật không may, tôi không thể sửa nó vì vậy tôi đã xây dựng một cách giải quyết thay thế. Trong tôi ActionModeCallback, onCreateActionModetôi ẩn thanh hành động:

actionBarToolbar.setVisibility(View.GONE);

và trong onDestroyActionModetôi hiển thị lại:

actionBarToolbar.setVisibility(View.VISIBLE);

Việc ẩn / hiển thị xảy ra quá nhanh, nó không đáng chú ý trên các thiết bị thử nghiệm của tôi. Tất nhiên có một nhược điểm: mặc dù hoạt hình nhập vẫn hoạt động, hoạt hình thoát của thanh hành động theo ngữ cảnh bị mất vì Thanh công cụ ngay lập tức bật lên. Nhưng cho đến khi chúng tôi đi qua một giải pháp tốt hơn tôi đoán chúng tôi đang bị mắc kẹt với điều này.


(Hoạt động của tôi thực sự đang mở rộng một BaseActivitylớp tùy chỉnh có một phương thức được gọi getActionBarToolbar(), được lấy từ mã nguồn ứng dụng Google I / O 2014 , vì vậy tôi có thể dễ dàng lấy Thanh công cụ:

BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);

Quá tệ, ứng dụng I / O không sử dụng thanh hành động theo ngữ cảnh.)


Vâng, đây là giải pháp duy nhất tôi có thể đến. Tuy nhiên, có những trường hợp xảy ra ActionBar bối cảnh từ hệ thống (ví dụ như trong WebView hoặc với EditText). Những người bạn không nhận được cuộc gọi lại cho. Vì vậy, làm thế nào bạn sẽ đi về hiển thị / ẩn nó cho điều đó? (Hoặc tôi sai và trên thực tế, bạn có thể nhận được các cuộc gọi lại cho CAB với những người đó)?
ariets

1
Có, bạn có thể TextView.setCustomSelectionActionModeCallback () cho điều đó, giống như Aleksandar đã mô tả trong câu trả lời của mình.
Jacob Ras

1
Oh, đã không thể cập nhật bình luận của tôi nữa. Bổ sung nhỏ: có vẻ như setCustomSelectionActionModeCallback không thể được sử dụng với ActionModeCallback từ thư viện hỗ trợ. Tôi đang sử dụng kiểm tra VERSION.SDK_INT để đặt nó. Vẫn cần kiểm tra nếu sự cố cũng xảy ra trên các thiết bị tiền tổ ong.
Jacob Ras

@ariets vui lòng xem câu trả lời cập nhật của tôi. Tôi cảm thấy hơi thất vọng vì đã hoàn toàn quên tài sản đó, nhưng ít nhất chúng ta có thể thoát khỏi cách giải quyết ngay bây giờ ;-)
Jacob Ras

1
Buồn cười Tôi đang sử dụng phiên bản mới nhất (biên dịch 'com.android.support:appcompat-v7:22.0.0') nhưng tôi phải rời khỏi Android: một phần để nó hoạt động ...
Warpzit 18/03/2015

16

Không bắt đầu nó trên hoạt động của bạn, nhưng trên thanh công cụ của bạn. Trong bạn hoạt động:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)

và bạn phải sử dụng

<item name="windowActionModeOverlay">true</item>

đối với tôi, nó dành cho android.support.v7.app.ActionBar
Frank

Tôi gặp lỗi này-> startActionMode (android.view.ActionMode.Callback) trong Chế độ xem không thể được áp dụng cho (android.support.v7.view.ActionMode.Callback)
Faheem

À được rồi. Phiên bản tối thiểu của tôi không nhỏ hơn 11. Vì vậy, tôi có thể sử dụng android.view.ActionMode. Gọi lại trên android.support.v7.widget.Toolbar, tôi chưa bao giờ sử dụng android.support.v7.view.ActionMode.Callback.
Frank

Điều đáng nói AppCompatActivity.startSupportActionMode(callback), để có được khả năng tương thích với các thuộc tính như app:iconTinttrong mục menu xmls.
geekley

14

Chỉ là một bổ sung nhỏ: Dành cho

<item name="windowActionModeOverlay">true</item>
để làm việc, điều quan trọng là gọi super.onCreate(savedInstanceState) TRƯỚC khi gọi setContentView(R.layout.your_activity)trong hoạt động của bạn. Nó thực sự làm cho một sự khác biệt trong trường hợp này!


11

Trong trường hợp của tôi, <item name="windowActionModeOverlay">true</item>không hoạt động, nhưng công việc này : <item name="android:windowActionModeOverlay">true</item>, androidlà chìa khóa.


8
Bạn sử dụng <item name="windowActionModeOverlay">true</item>với thanh công cụ appcompat, nếu không bạn sử dụng androidkhông gian tên.
Javier Mendonça

không sử dụng cho tôi trong bố cục của tôi khi thêm thanh công cụ, trong thanh công cụ khởi tạo hoạt động và hỗ trợ thực hiện đúng xin vui lòng giúp tôi
Harsha

<item name = "windowActionModeOverlay"> true </ item> hoạt động như mong đợi!
Francois

8

Giải pháp của Jacob làm việc cho tôi nhưng ActionBar theo ngữ cảnh rõ ràng và Thanh công cụ hiển thị thông qua nó. Điều này có thể được giải quyết như sau:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    ....
    ....
    <item name="actionModeStyle">@style/CustomActionMode</item>
</style>

<style name="CustomActionMode" parent="@style/Widget.AppCompat.ActionMode">
    <item name="background">@color/primary_material_light</item>
</style>

Chủ đề "AppTheme.Base" phải là chủ đề được áp dụng cho Thanh công cụ.

Thêm chi tiết về kiểu dáng ActionBar theo ngữ cảnh:

cách tùy chỉnh thanh hành động theo ngữ cảnh bằng appCompat trong thiết kế vật liệu


0

Phương pháp rất hữu ích để đưa thanh công cụ ra phía trước toolbar.bringToFront()


2
View.bringToFront()là hoạt động rất nặng và thường nên tránh bằng mọi giá.
dominus

Bạn đúng, nhưng đối với hoạt hình, ví dụ từ trên xuống dưới màn hình sẽ chồng lên thanh công cụ. Do đó, chúng ta cần sử dụng thanh công cụ.bringToFront () để tạo hiệu ứng bên dưới thanh công cụ. Nếu có bất kỳ cách nào khác bạn có thể chia sẻ :)
kunal.c

0

Một bổ sung nhỏ khác: đảm bảo đặt ít nhất một màn hình trống trong hoạt động thông qua setContentView(R.layout.empty_screen)nếu bạn tải toàn bộ ui thành các đoạn ( ft.replace(android.R.id.content, fragment)).

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.