2014-10-21 40 views
64

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

toolbar.startActionMode(callback); 

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

tôi tryied để thiết lập sau trong chủ đề của tôi, nhưng nó dường như không thay đổi bất cứ đ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

+0

Điều đó quá tệ. Cảm ơn câu trả lời –

+1

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

Trả lời

27

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

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

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

+0

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

+0

Tôi đã có cùng một vấn đề và sửa lỗi này. Cảm ơn! –

49

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

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

+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ợ 'ActionMode' là có vẻ như không phải là một phiên bản hỗ trợ của' MultiChoiceModeListener'. – jwir3

54

Vì bạn đang sử dụng Toolbar, tôi cũng giả định bạn đang sử dụng AppCompatActivity và đã thay thế việc xây dựng trong ActionBar với tùy chỉnh của bạn Toolbar sử dụng setSupportActionBar(toolbar);

Trước hết đảm bảo bạn đang nhập khẩu đúng không gian tên.

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

Điều này cộng với cài đặt 'windowActionModeOverlay' làm việc cho tôi. – Jimeux

+4

Tôi hiện đang sử dụng 'AppCompatActivity' và thêm' windowActionModeOverlay' là đủ cho tôi. Tôi đã cố gắng sử dụng nhập 'android.support.v7.view.ActionMode' nhưng nó không hoạt động với' MultiChoiceModeListener', vì vậy tôi đã sử dụng 'android.view.ActionMode' để thay thế. Bạn có biết liệu có phiên bản hỗ trợ của 'MultiChoiceModeListener' không? Cảm ơn – Axel

+0

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

1

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

Trong phương pháp onCreateActionMode của tôi về ActionMode.Callback, tôi thêm 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.

0

Tôi đã thử tất cả các phương pháp ở trên, nhưng vẫn không hoạt động. Và sau đó, tôi đã thử phương thức 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ó sự lựa chọn tốt hơn, bạn có thể thử cái này.

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

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

Các vấn đề liên quan