Hiển thị Chế độ hành động trên Thanh công cụ


87

Tôi đang cố gắng sử dụng android.view.ActionModecái mới android.support.v7.widget.Toolbar, ngoài cái truyền thống android.app.ActionBar. Tôi có thể hiển thị nó với:

toolbar.startActionMode(callback);

Vấn đề là cái ActionModeđược hiển thị trên ActionBar, và không trên Toolbar. Có cách nào để thay đổi điều đó không?

Tôi đã cố gắng thiết lập những điều sau trong chủ đề của mình, nhưng nó dường như không thay đổi bất kỳ điều gì:

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

1
Tôi nghĩ ActionMode là một phần của ActionBar và bạn không thể thay đổi vị trí của nó
SpyZip

Thật quá tệ. Cảm ơn vì câu trả lời
Gaëtan

1
Bạn đã đặt thanh công cụ làm thanh tác vụ chưa?
Nikola Despotoski,

1
vẫn có vấn đề tương tự, bất kỳ cập nhật về điều này? tôi gặp trường hợp tương tự, một thanh công cụ làm thanh tác vụ cổ điển và một thanh công cụ bên dưới, làm tiêu đề và menu tùy chọn cho nội dung được hiển thị bên dưới. đối mặt với sự cố này và không thể di chuyển chế độ hành động xuống.
cV2

Câu trả lời:


82

Vì bạn đang sử dụng Toolbar, tôi cũng giả sử bạn đang sử dụng AppCompatActivityvà đã thay thế cài đặt sẵn bằng cách sử dụng ActionBartùy chỉnh của bạnToolbarsetSupportActionBar(toolbar);

Trước hết, hãy đảm bảo rằng bạn đang nhập đúng không gian tên:

import androidx.appcompat.view.ActionMode;
// Or
import android.support.v7.view.ActionMode;

và không

import android.view.ActionMode;

sau đó sử dụng

_actionMode = startSupportActionMode(this);

và không

_actionMode = startActionMode(this);

35
Điều này cộng với windowActionModeOverlaycài đặt đã làm việc cho tôi.
Jimeux

4
Tôi hiện đang sử dụng AppCompatActivityvà thêm vào windowActionModeOverlay là đủ cho tôi. Tôi đã cố gắng sử dụng nhập android.support.v7.view.ActionModenhưng nó không hoạt động MultiChoiceModeListener, vì vậy tôi đã kết thúc bằng cách android.view.ActionModethay thế. Bạn có biết nếu có một phiên bản hỗ trợ của MultiChoiceModeListener? Cảm ơn
Axel.

Có phiên bản hỗ trợ của MultiChoiceModeListener không?
galaxigirl

@galaxigirl, có vẻ như không có. Bạn phải xử lý các sự kiện nhấp chuột trong bộ chuyển đổi của bạn và xem holderr
peterchaula

67

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 hoạt động của bạn:

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

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

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

trong chủ đề của bạn như Andre đã nêu.


1
Điều này làm việc cho tôi, bởi vì tôi cũng có một yêu cầu đặc biệt. Thay vì thực hiện ActionMode.Callback, tôi muốn thực hiện MultiChoiceModeListener. Vấn đề với việc sử dụng hỗ trợ ActionModelà dường như không có phiên bản hỗ trợ của MultiChoiceModeListener.
jwir3

43

Hãy thử điều này trong chủ đề của bạn:

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

Như đã nêu trong câu hỏi của tôi, tôi đã thử điều này mà không thành công. Nhưng cảm ơn bạn!
Gaëtan

Xin lỗi, tôi không nhận ra bạn đã thử điều đó. Bạn có chắc là nó không hoạt động? Nó làm việc cho tôi.
André Restivo

Tôi đã gặp vấn đề tương tự và điều này đã khắc phục được. Cảm ơn!
Marta Rodriguez

2
Tôi đã thử có và không có android:tiền tố, và đặt nó vào chủ đề ứng dụng của mình. Các ActionModelớp phủ ActionBar, nhưng tôi muốn nó trên của tôi Toolbar, bên dưới ActionBar.
Gaëtan

@ Gaëtan Bạn đã nhận được câu trả lời cho điều này chưa? Tôi đang gặp vấn đề tương tự và tôi đang mở rộng Hoạt động chứ không phải AppCompatActivity vì ứng dụng của tôi hỗ trợ API 21 trở lên.
SjDev

15

Tôi nghĩ một điều mà mọi người không làm rõ là dòng

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

được đặt trong chủ đề Cơ sở tức là AppTheme chứ không phải AppTheme.NoActionBar

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionModeOverlay">true</item>
</style>

<style name="transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
</style>


<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />


Đây là thay đổi duy nhất tôi cần. Cảm ơn!
PNDA

5

tìm AndroidManifest.xml của bạn, tiếp theo hãy thêm mã bên dưới vào ứng dụng hoặc chủ đề Hoạt động của bạn

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

như vậy:

<style name="WorkTimeListTheme" parent="AppTheme.NoActionBar">
        <item name="windowActionModeOverlay">true</item>
        <item name="actionModeBackground">@color/theme_primary</item>
    </style>

1

Đây là giải pháp tôi đã thực hiện.

Trong phương thức onCreateActionMode của ActionMode.Callback , tôi thêm điều này:

StandaloneActionMode standaloneActionMode = (StandaloneActionMode) actionMode;
Field mContextView;
try {
     mContextView = StandaloneActionMode.class.getDeclaredField("mContextView");
     mContextView.setAccessible(true);
     View contextView = (View) mContextView.get(standaloneActionMode);
     MarginLayoutParams params = (MarginLayoutParams) contextView.getLayoutParams();
     params.topMargin = mToolbar.getTop();
  } catch (NoSuchFieldException e) {
            e.printStackTrace();
  } catch (IllegalAccessException e) {
            e.printStackTrace();
  } catch (IllegalArgumentException e) {
            e.printStackTrace();
  }

Nó làm việc cho tôi.


1

Tôi đã thử tất cả các phương pháp ở trên, nhưng nó vẫn không hoạt động. Và sau đó, tôi đã thử phương pháp dưới đây:

    private class ActionModeCallback implements ActionMode.Callback {
    @Override
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        actionMode.getMenuInflater().inflate(R.menu.note_find_action, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        ((AppCompatActivity) getActivity()).getSupportActionBar().hide();
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode) {
        ((AppCompatActivity) getActivity()).getSupportActionBar().show();
    }
}

Ở đây, tôi đã sử dụng chế độ hành động và phương thức startSupportActionMode của thư viện hỗ trợ. Đồng thời tôi cũng đã cố gắng sửa đổi chủ đề của hoạt động đã cho. Chắc chắn, nó không hoạt động. Vì vậy, nếu bạn thực sự không có lựa chọn nào tốt hơn, bạn có thể thử cái này.

Gần đây, tôi đã thấy rằng tôi đã sử dụng khung Màu sắc để bật nhiều chủ đề của ứng dụng của mình, điều này sẽ thay đổi chủ đề trong mã. Khi tôi cố gắng sửa đổi kiểu trong khuôn khổ này, nó hoạt động.

Hy vọng nó hoạt động.


Đây là điều duy nhất làm việc cho tôi. Cảm ơn rất nhiều.
Rachit

0

Nếu bạn nhìn thấy cây xem, Bạn có thể viết mã dưới đây:

 ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
    traverseView(decorView);
 /**
 * traverse find actionmodebar
 * @param root  view
 */
public void traverseView(View root) {
    if (root==null){
        return;
    }
    if (root instanceof ActionBarContextView){
        root.setVisibility(View.GONE);
        return;
    }
    if ((root instanceof ViewGroup)) { // If view is ViewGroup, apply this method on it's child views
        ViewGroup viewGroup = (ViewGroup) root;
        for (int i = 0; i < viewGroup.getChildCount(); ++i) {
            traverseView(viewGroup.getChildAt(i));
        }
    }
}

0

Vì vậy, sau nhiều ngày đi qua chủ đề này, cuối cùng tôi đã làm cho nó hoạt động. Tôi muốn tóm tắt những gì tôi đã làm.

Lưu ý: Đây là giải pháp sử dụng a Toolbarđể thay thế mặc định ActionBartrong AppCompatActivity.

  1. Tôi đã thêm dòng này vào của mình AppTheme: Nó cho android biết rằng bạn muốn chế độ hành động của mình phủ lên thanh công cụ
<item name="windowActionModeOverlay">true</item>
  1. Sử dụng hàng nhập khẩu phù hợp:

Bạn phải sử dụng các lần nhập này để làm việc với AppCompatActivity:

import androidx.appcompat.view.ActionMode;
// or
import android.support.v7.view.ActionMode;
  1. Khởi động ActionMode trên Activity của bạn như sau:
actionMode = startSupportActionMode(callback);

Và không phải như vậy:

actionMode = startActionMode(callback);

Bạn Hoạt động tự động tạo Chế độ hành động trên thanh công cụ vì nó được đặt làm Thanh công cụ hỗ trợ. Kiểu xử lý dsiplaying dưới dạng lớp phủ.

Cảm ơn @Kuffs và @Lefty.

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.