แสดง ActionMode บน Toolbar


88

ฉันพยายามที่จะใช้android.view.ActionModeกับใหม่นอกเหนือไปจากแบบดั้งเดิมandroid.support.v7.widget.Toolbar android.app.ActionBarฉันสามารถแสดงด้วย:

toolbar.startActionMode(callback);

ปัญหาคือActionModeแสดงอยู่เหนือActionBarและไม่เกินToolbar. มีวิธีเปลี่ยนไหม

ฉันพยายามตั้งค่าสิ่งต่อไปนี้ในธีมของฉัน แต่ดูเหมือนจะไม่เปลี่ยนแปลงอะไรเลย:

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

1
ฉันคิดว่า ActionMode เป็นส่วนหนึ่งของ ActionBar และคุณไม่สามารถเปลี่ยนตำแหน่งได้
SpyZip

มันแย่เกินไป ขอบคุณสำหรับคำตอบ
Gaëtan

1
คุณตั้งแถบเครื่องมือเป็นแถบการทำงานหรือไม่?
Nikola Despotoski

1
ยังคงมีปัญหาเดิมมีการอัปเดตเกี่ยวกับเรื่องนี้หรือไม่ ฉันได้รับสถานการณ์เดียวกันแถบเครื่องมือหนึ่งเป็นแถบการทำงานแบบคลาสสิกและแถบเครื่องมือด้านล่างหนึ่งแถบเป็นส่วนหัวและเมนูตัวเลือกสำหรับเนื้อหาที่แสดงด้านล่าง ประสบปัญหานี้และไม่สามารถย้าย Actionmode ลงได้
cV2

คำตอบ:


83

เนื่องจากคุณใช้งานอยู่Toolbarฉันจึงถือว่าคุณกำลังใช้ AppCompatActivityและได้แทนที่บิวท์อินActionBarด้วยการToolbarใช้ไฟล์ setSupportActionBar(toolbar);

ก่อนอื่นให้แน่ใจว่าคุณกำลังนำเข้าเนมสเปซที่ถูกต้อง:

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

และไม่

import android.view.ActionMode;

จากนั้นใช้

_actionMode = startSupportActionMode(this);

และไม่

_actionMode = startActionMode(this);

35
สิ่งนี้บวกกับการwindowActionModeOverlayตั้งค่าได้ผลสำหรับฉัน
Jimeux

4
ฉันกำลังใช้AppCompatActivityและเพิ่มwindowActionModeOverlay ก็เพียงพอแล้วสำหรับฉัน ฉันพยายามใช้การนำเข้าandroid.support.v7.view.ActionModeแต่ไม่สามารถใช้งานได้MultiChoiceModeListenerดังนั้นฉันจึงใช้android.view.ActionModeแทน คุณรู้หรือไม่ว่ามีเวอร์ชันรองรับของMultiChoiceModeListener? ขอบคุณ
Axel

มี MultiChoiceModeListener เวอร์ชันรองรับหรือไม่
galaxigirl

@galaxigirl ดูเหมือนจะไม่มี คุณต้องจัดการกับเหตุการณ์คลิกในอะแดปเตอร์และตัวยึดมุมมอง
peterchaula

68

อย่าเริ่มต้นในกิจกรรมของคุณ แต่บนแถบเครื่องมือของคุณ ในกิจกรรมของคุณ:

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

และคุณต้องใช้

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

ในธีมของคุณตามที่ Andre ระบุไว้


1
สิ่งนี้ได้ผลสำหรับฉันเพราะฉันมีความต้องการพิเศษเช่นกัน แต่ในการดำเนินการผมอยากที่จะดำเนินการActionMode.Callback MultiChoiceModeListenerปัญหาในการใช้การสนับสนุนActionModeคือดูเหมือนว่าจะไม่มีเวอร์ชันรองรับของไฟล์MultiChoiceModeListener.
jwir3

44

ลองใช้สิ่งนี้ในธีมของคุณ:

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

ตามที่ระบุไว้ในคำถามของฉันฉันลองแล้วไม่ประสบความสำเร็จ แต่ขอบคุณ!
Gaëtan

ขอโทษค่ะฉันไม่รู้ว่าคุณได้ลองทำไปแล้ว แน่ใจหรือว่าใช้ไม่ได้ มันใช้ได้กับฉัน
André Restivo

ฉันมีปัญหาเดียวกันและสิ่งนี้แก้ไขได้ ขอบคุณ!
Marta Rodriguez

2
ฉันลองใช้และไม่มีandroid:คำนำหน้าและใส่ไว้ในธีมแอปพลิเคชันของฉัน ActionModeซ้อนActionBarแต่ฉันต้องการมันมากกว่าฉันซึ่งเป็นดังต่อไปนี้Toolbar ActionBar
Gaëtan

@ Gaëtanคุณได้รับคำตอบสำหรับเรื่องนี้หรือไม่? ฉันมีปัญหาเดียวกันและฉันกำลังขยายกิจกรรมไม่ใช่ AppCompatActivity เนื่องจากแอปของฉันรองรับ API 21 ขึ้นไป
SjDev

15

ฉันคิดว่าสิ่งหนึ่งที่ผู้คนไม่ชัดเจนก็คือเส้น

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

จะอยู่ในธีมฐานเช่น AppTheme ไม่ใช่ 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" />


นี่เป็นการเปลี่ยนแปลงเดียวที่ฉันต้องการ ขอบคุณ!
PNDA

5

ค้นหา AndroidManifest.xml ของคุณเพิ่มโค้ดด้านล่างถัดไปในแอปพลิเคชันหรือธีมกิจกรรมของคุณ

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

ชอบมาก:

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

1

นี่คือทางออกที่ฉันทำ

ในเมธอด onCreateActionModeของActionMode.Callbackของฉันฉันเพิ่มสิ่งนี้:

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

มันใช้ได้กับฉัน


1

ฉันได้ลองวิธีการทั้งหมดข้างต้นแล้ว แต่ก็ยังไม่ได้ผล จากนั้นฉันลองใช้วิธีการด้านล่าง:

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

ที่นี่ฉันใช้โหมดการกระทำและเมธอด startSupportActionMode ของไลบรารีสนับสนุน ในขณะเดียวกันฉันก็พยายามปรับเปลี่ยนธีมของกิจกรรมที่กำหนด แน่นอนว่ามันไม่ได้ผล ดังนั้นหากคุณไม่มีทางเลือกที่ดีกว่าจริงๆคุณอาจลองวิธีนี้

เมื่อไม่นานมานี้ฉันพบว่าฉันใช้กรอบสีสันเพื่อเปิดใช้งานหลายธีมของแอพของฉันซึ่งจะเปลี่ยนธีมในโค้ด เมื่อฉันพยายามปรับเปลี่ยนสไตล์ในกรอบนี้มันก็ใช้ได้

หวังว่าจะได้ผล


นี่เป็นสิ่งเดียวที่ใช้ได้ผลสำหรับฉัน ขอบคุณมาก.
รจิตร

1

ดังนั้นหลังจากผ่านไปหลายวันในหัวข้อนี้ในที่สุดฉันก็ใช้งานได้ ฉันอยากจะสรุปสิ่งที่ฉันทำ

หมายเหตุ: นี่เป็นวิธีการใช้Toolbarเพื่อแทนที่ค่าเริ่มต้นในActionBarAppCompatActivity

  1. ฉันเพิ่มบรรทัดนี้ในของฉันAppTheme: มันบอก Android ว่าคุณต้องการให้โหมดการทำงานของคุณซ้อนทับแถบเครื่องมือ
<item name="windowActionModeOverlay">true</item>
  1. ใช้การนำเข้าที่ถูกต้อง:

คุณต้องใช้การนำเข้าเหล่านี้เพื่อทำงานกับAppCompatActivity:

import androidx.appcompat.view.ActionMode;
// or
import android.support.v7.view.ActionMode;
  1. เริ่ม ActionMode ในกิจกรรมของคุณดังนี้:
actionMode = startSupportActionMode(callback);

และไม่เป็นเช่นนั้น:

actionMode = startActionMode(callback);

กิจกรรมของคุณสร้าง ActionMode บนแถบเครื่องมือโดยอัตโนมัติเนื่องจากถูกตั้งค่าเป็น supportActionToolbar สไตล์จะจัดการกับ dsiplaying เป็นโอเวอร์เลย์

ขอบคุณ @Kuffs และ @Lefty


0

หากคุณเห็นแผนผังมุมมองคุณจะสามารถเขียนโค้ดด้านล่าง:

 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));
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.