แถบเครื่องมือและ ActionBar เชิงบริบทด้วย AppCompat-v7


182

ฉันกำลังทำงานกับการใช้ Toolbar ที่เพิ่งเพิ่มเข้ามาใหม่ซึ่งถูกนำมาใช้ใน Lollipop และไลบรารี AppCompat-v7 ฉันทำตามคำแนะนำนี้ในการตั้งค่า Toolbar ฉันสังเกตเห็นว่าเมื่อคุณเรียกใช้บางสิ่งที่จะแสดงบริบทของ ActionBar (เช่นการเน้นข้อความเพื่อคัดลอก / วาง) มันจะดัน Toolbar ลงบนหน้า คุณสามารถเห็นสิ่งที่ฉันกำลังพูดถึงในภาพที่ด้านล่างของหน้า:

โดยพื้นฐานแล้วฉันตั้งมันแบบนี้ ฉันมีแถบเครื่องมือที่กำหนดไว้ในไฟล์ xml ที่ฉันใช้กับแท็กรวม:

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

จากนั้นฉันยกตัวอย่างมันในมุมมองของฉัน:

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

ในรหัสฉันตั้งค่าเช่นนั้น:

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

ไม่มีใครรู้วิธีการทำอย่างนั้นเพื่อให้ Contextual ActionBar มาเหนือแถบเครื่องมือหรือไม่

แถบเครื่องมือและ ActionBar ตามบริบท


ธีมของคุณคือกิจกรรมที่ใช้?
alanv

เดวิดฉันคลิกลิงค์และดูเหมือนว่าจะใช้ได้สำหรับฉัน
ariets

คำตอบ:


320

ปรับปรุง:

วิธีแก้ไข: ใช้คุณสมบัติwindowActionModeOverlay ตั้งค่านี้ในธีมของคุณ:

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

และโหมดแอคชั่นจะปรากฏบนแถบแอ็คชันแทนการกดลง (หากคุณไม่ได้ใช้ AppCompat ล่าสุดคุณต้องเพิ่มคำนำหน้า "android:" ในคุณสมบัติ) โดยทั่วไปจะทำให้ AppCompat รู้ว่าคุณมีแถบเครื่องมือที่ด้านบนของหน้าจอและควรวาด ActionMode ไว้ด้านบน


คำตอบเก่า / วิธีแก้ปัญหา:

ฉันพบปัญหาเดียวกัน ไม่ว่าฉันจะตั้งค่าชุดรูปแบบใดมันจะดันลงแถบเครื่องมือที่ฉันตั้งเป็น ActionBar เสมอ ฉันลองด้วยและไม่มีไลบรารีสนับสนุน แต่มันก็ไม่สำคัญ

น่าเสียดายที่ฉันไม่สามารถแก้ไขได้ดังนั้นฉันจึงได้สร้างวิธีแก้ปัญหาแทน ในของฉันActionModeCallback's onCreateActionModeฉันซ่อนแถบการทำงาน:

actionBarToolbar.setVisibility(View.GONE);

และในonDestroyActionModeฉันแสดงอีกครั้ง:

actionBarToolbar.setVisibility(View.VISIBLE);

การซ่อน / การแสดงนั้นเกิดขึ้นเร็วมากจนไม่เห็นในอุปกรณ์ทดสอบของฉัน แน่นอนว่ามีข้อเสีย: แม้ว่าการป้อนภาพเคลื่อนไหวยังคงใช้งานได้ แต่การออกจากการเคลื่อนไหวของแถบการกระทำตามบริบทจะหายไปเนื่องจาก Toolbar ปรากฏขึ้นทันที แต่จนกว่าเราจะเจอทางออกที่ดีกว่าฉันคิดว่าเราติดอยู่กับเรื่องนี้


(กิจกรรมของฉันจริง ๆ แล้วเป็นการขยายBaseActivityคลาสแบบกำหนดเองซึ่งมีวิธีการที่เรียกว่าgetActionBarToolbar()นำมาจากซอร์สโค้ดแอป Google I / O 2014ดังนั้นฉันสามารถดึงแถบเครื่องมือได้อย่างง่ายดาย:

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

น่าเสียดายที่แอป I / O ไม่ได้ใช้แถบการกระทำตามบริบท)


ใช่นี่เป็นทางออกเดียวที่ฉันสามารถทำได้เช่นกัน อย่างไรก็ตามมีบางกรณีที่ Contextual ActionBar เกิดขึ้นจากระบบ (ตัวอย่างเช่นใน WebView หรือ EditText) ผู้ที่คุณไม่ได้รับการติดต่อกลับ ดังนั้นคุณจะแสดง / ซ่อนมันอย่างไร (หรือฉันผิดและในความเป็นจริงคุณสามารถโทรหา CAB ได้ด้วย)
ariets

1
ใช่คุณสามารถTextView.setCustomSelectionActionModeCallback ()สำหรับสิ่งนั้นเช่น Aleksandar อธิบายไว้ในคำตอบของเขา
Jacob Ras

1
โอ้ไม่สามารถอัพเดทความคิดเห็นของฉันได้อีกแล้ว เพิ่มเติมเล็กน้อย: ดูเหมือนว่า setCustomSelectionActionModeCallback ไม่สามารถใช้กับ ActionModeCallback จากไลบรารีการสนับสนุน ฉันใช้ VERSION.SDK_INT ตรวจสอบเพื่อตั้งค่า ยังคงต้องทดสอบว่าปัญหายังเกิดขึ้นกับอุปกรณ์ก่อนรังผึ้งหรือไม่
Jacob Ras

@ariets โปรดดูคำตอบที่อัปเดตของฉัน ผมรู้สึกว่าการถ่ายโอนข้อมูลบิตสำหรับการลืมสนิทว่าทรัพย์สิน แต่อย่างน้อยเราจะได้รับการกำจัดของการแก้ปัญหาในขณะนี้ ;-)
จาค็อบราส

1
ตลกฉันกำลังใช้งานล่าสุด (คอมไพล์ 'com.android.support:appcompat-v7:22.0.0') แต่ฉันต้องออกจาก Android: ส่วนหนึ่งเพื่อให้มันทำงาน ...
Warpzit

16

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

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

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

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

สำหรับฉันมันทำเพื่อ android.support.v7.app.ActionBar
แฟรงค์

ฉันได้รับข้อผิดพลาดนี้ -> startActionMode (android.view.ActionMode.Callback) ในมุมมองไม่สามารถใช้กับ (android.support.v7.view.ActionMode.Callback)
Faheem

อ่าโอเค. เวอร์ชันขั้นต่ำของฉันไม่เล็กกว่า 11 ดังนั้นฉันจึงสามารถใช้ android.view.ActionMode โทรกลับบน android.support.v7.widget.Toolbar ฉันไม่เคยใช้ android.support.v7.view.ActionMode.Callback
Frank

เป็นมูลค่าการกล่าวขวัญAppCompatActivity.startSupportActionMode(callback)เพื่อให้เข้ากันได้กับคุณลักษณะเช่นapp:iconTintในรายการเมนู xml
geekley

14

นอกจากนี้เล็กน้อย: สำหรับ

<item name="windowActionModeOverlay">true</item>
ในการทำงานเป็นสิ่งสำคัญที่จะต้องโทรหาsuper.onCreate(savedInstanceState) ก่อนการโทรsetContentView(R.layout.your_activity)ในกิจกรรมของคุณ มันสร้างความแตกต่างในกรณีนี้จริงๆ!


11

ในกรณีของฉัน <item name="windowActionModeOverlay">true</item>ไม่ได้ทำงาน แต่งานนี้<item name="android:windowActionModeOverlay">true</item>ที่androidเป็นกุญแจสำคัญ


8
คุณใช้<item name="windowActionModeOverlay">true</item>กับแถบเครื่องมือ appcompat มิฉะนั้นคุณจะใช้androidเนมสเปซ
Javier Mendonça

ไม่มีประโยชน์สำหรับฉันในเลย์เอาต์ของฉันกำลังเพิ่มแถบเครื่องมือในกิจกรรมเริ่มต้นแถบเครื่องมือและตั้งค่าการสนับสนุนที่ทำจริงโปรดช่วยฉัน
Harsha

<item name = "windowActionModeOverlay"> จริง </item> ทำงานตามที่คาดไว้!
Francois

8

ทางออกของยาโคบทำงานได้สำหรับฉัน แต่ ActionBar เชิงบริบทนั้นโปร่งใสและ Toolbar ปรากฏให้เห็นผ่านทาง สามารถแก้ไขได้ดังนี้:

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

ชุดรูปแบบ "AppTheme.Base" ต้องเป็นธีมที่ใช้กับ Toolbar

รายละเอียดเพิ่มเติมเกี่ยวกับการกำหนดสไตล์ของ ActionBar ตามบริบท:

วิธีการกำหนด Contextual Action Bar โดยใช้ appCompat ในการออกแบบวัสดุ


0

วิธีการที่มีประโยชน์มากในการนำแถบเครื่องมือมาไว้ด้านหน้า toolbar.bringToFront()


2
View.bringToFront()เป็นการดำเนินการที่หนักมากและโดยทั่วไปควรหลีกเลี่ยงค่าใช้จ่ายใด ๆ
dominus

คุณถูกต้อง แต่สำหรับภาพเคลื่อนไหวสำหรับเช่นบนลงล่างของหน้าจอจะซ้อนทับแถบเครื่องมือ ดังนั้นเราจำเป็นต้องใช้ toolbar.bringToFront () เพื่อเคลื่อนไหวด้านล่าง toolbar หากมีวิธีอื่นที่คุณสามารถแชร์ได้)
kunal.c

0

การเพิ่มเล็ก ๆ อีกอย่างหนึ่ง: อย่าลืมตั้งค่าหน้าจอว่างอย่างน้อยในกิจกรรมผ่านsetContentView(R.layout.empty_screen)ถ้าคุณโหลด UI ทั้งหมดในส่วน ( ft.replace(android.R.id.content, fragment))

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