ความแตกต่างระหว่าง ActionBarSherlock และความเข้ากันได้ของ ActionBar


156

ความแตกต่างระหว่างActionBarSherlockและความเข้ากันได้ของ Action Barคืออะไร

ไม่กี่วันที่ผ่านมา Google เพิ่งเปิดตัวความเข้ากันได้กับ ActionBar ซึ่งทำให้ฉันสับสนมาก ความเข้ากันได้ของแถบการทำงานนั้นเหมือนกับ ActionBarSherlock และการเข้ารหัสเหมือนกันหรือไม่

ตัวอย่าง: ไอคอนแอพเพื่อนำทาง "up"หรือ ActionBar.Tab รองรับความเข้ากันได้กับ Action Bar หรือไม่


12
FYI ฉันเขียนบล็อกโพสต์เกี่ยวกับสิ่งนี้สำหรับบล็อก eng ของ Square: corner.squareup.com/2012/05/actionbarsherlock-as-a-base.html
Jake Wharton

3
youtube.com/… นี่คือสิ่งที่ Google คิดเกี่ยวกับ ActionBarSherlock กับ ActionBarCompact
Rolf ツ

นี่เป็นหัวข้อที่สำคัญและมีประโยชน์สำหรับผู้ที่ต้องการย้ายจาก ABS ไปยัง ABCompat ขอบคุณ
Ashokchakravarthi Nagarajan

คำตอบ:


61

ActionBarSherlock ให้แอปพลิเคชันของคุณเป็นแอคชั่นโดยไม่คำนึงว่าแอนดรอยด์ของคุณใช้เวอร์ชันใดของ API API ความเข้ากันได้ของแถบการกระทำจะให้แถบการกระทำแก่คุณเฉพาะเมื่ออุปกรณ์ที่คุณใช้อยู่คือระดับ API 3.0 ขึ้นไป

* โปรดทราบว่าหากอุปกรณ์ที่คุณใช้ไม่ได้ 3.0 หรือสูงกว่านั้น ActionBarSherlock จะใช้มันเป็นแถบการนำไปปฏิบัติที่กำหนดเองไม่ใช่แบบดั้งเดิม

--EDIT--

ดูเหมือนว่าสิ่งต่าง ๆ มีการเปลี่ยนแปลงและจริง ๆ แล้วไม่มีความแตกต่างระหว่าง ActionBarSherlock และความเข้ากันได้ของ Action Bar อีกต่อไป โปรดอ่านความคิดเห็นด้านล่างเพื่อดูรายละเอียด

--EDIT--

หลังจากใช้ทั้งสองตอนนี้ฉันสามารถพูดได้ว่าฉันชอบความเข้ากันได้กับ ActionBarSherlock to Action Bar ActionBarSherlock นั้นใช้งานง่ายและดีมาก

--EDIT-- ดังที่ LOG_TAG กล่าวถึงตอนนี้มีการรองรับแถบแอ็คชันในไลบรารีการสนับสนุน Android ฉันยังไม่ได้มีโอกาสใช้ แต่ฉันคิดว่ามันเป็นสิ่งที่ดีที่สุดที่จะใช้


1
@Aididamo ขอบคุณสำหรับหัวขึ้น ฉันอาจจะเป็นคนบ้า แต่ฉันสามารถสาบานได้ว่า ณ จุดหนึ่งรุ่นในแพ็คที่เข้ากันได้กับ Android ไม่ได้ให้คุณถ้า pre-3.0 ของคุณ ฉันแก้ไขคำตอบแล้ว
Kurtis Nusbaum

35
คำตอบนั้นผิดทั้งหมด - วัตถุประสงค์ของตัวอย่างความเข้ากันได้คือเพื่อรองรับอุปกรณ์ 3.0
AlikElzin-kilaka

8
Google เปิดตัวการใช้งาน Action Bar ที่เข้ากันได้แบบย้อนหลังที่เรียกว่า ActionBarCompat ซึ่งเป็นส่วนหนึ่งของ Support Library r18 ActionBarCompat API ช่วยให้คุณสร้างรูปแบบการออกแบบ Action Bar ที่จำเป็นลงในแอปของคุณด้วยความเข้ากันได้ในวงกว้างกับ Android 2.1
LOG_TAG

3
ลิงค์ต่อไปนี้จะบอกคุณwhyและhowให้ใช้ ActionBarCompat API ใหม่android-developers.blogspot.in/2013/08/…
VenoM

2
เพียงเพิ่มสำหรับผู้ที่คิดว่าพวกเขาอาจต้องการรวม Chromecast ในแอพของพวกเขาฉันขอแนะนำให้ใช้ไลบรารี appcompat MediaRouter APIs ที่จำเป็นสำหรับการรวม Chromecast ขึ้นอยู่กับ appcompat ไม่สามารถใช้ ActionBarSherlock
clu

113

ActionBarSherlock กับ ActionBarCompat:

ฉันแค่ต้องการสร้างความแตกต่างของรหัสระหว่าง ActionBarSherlock กับ ActionBarCompat Lib

 ActionBarSherlock กับ ActionBarCompat ** ข้อความที่แข็งแกร่ง **

เราสามารถโยกย้ายแอพจาก ActionBarSherlock ไปยัง ActionBarCompat:

ขั้นตอน

  1. นำเข้าโครงการAppCompat

  2. แทนที่ด้วยSherlockFragmentActivityActionBarActivity

  3. แทนที่ด้วยSherlockFragmentFragment

  4. เปลี่ยนMenu, MenuItemและgetSupportMenuInflater()การอ้างอิง ปรับเปลี่ยนวิธีที่คุณได้รับมุมมองการกระทำ

    mSearchView = (SearchView)MenuItemCompat.getActionView(mSearchItem)

  5. ปรับเปลี่ยนธีมและสไตล์ของคุณ

สำหรับข้อมูลเพิ่มเติมโปรดอ้างอิงสไลด์นี้โดย+ NickButcher (Google)

ป้อนคำอธิบายรูปภาพที่นี่

ขอบคุณแหล่งที่มา: http://gmariotti.blogspot.in/2013/07/actionbarsherlock-vs-actionbarcompat.html http://antonioleiva.com/actionbarcompat-migrating-actionbarsherlock/

อย่าลืมอ่านDeveloper.androidนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ ABC!

หมายเหตุ: การตั้งค่าสำหรับการทดสอบหน่วยแบบเดียวกับ ABS นั้นเป็นไปไม่ได้ในไลบรารีการสนับสนุน

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่

เครดิต: Gabriele Mariotti


1
เพียงแค่อัปเดตที่ ABS สามารถเพิ่มลงในโครงการ Gradle ได้ในขณะนี้compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'และไม่จำเป็นต้องเป็นโครงการห้องสมุด
ankushg

ขอบคุณสำหรับคำอธิบายรายละเอียด
Biswajit Das

41

เพิ่งทำสิ่งที่ @Kurtis Nusbaum ด้วยตัวอย่างที่เป็นจริง

อัปเดต: ตามที่ @ rudy-s กล่าวว่าด้วยไลบรารีสนับสนุน android ล่าสุด (api 18) ฉันเห็นว่าพวกเขามีการสนับสนุนสำหรับ actionbar ในตัวอยู่แล้ว (เรียกว่าคลาส ActionBarCompat)

ฉันสร้างแอพพลิเคชั่นง่าย ๆ สองตัวเพื่อแสดงความแตกต่างทางภาพระหว่าง ActionBarSherlock และความเข้ากันได้ของ ActionBar ดูภาพเปรียบเทียบ:

แอพที่ใช้ไลบรารีความเข้ากันได้

แอพที่ใช้ไลบรารี sherlock

ตอนนี้ลักษณะที่ปรากฏเมื่อกดปุ่มเมนู:

แอปที่ใช้งานร่วมกันได้บนเมนูกด

กด App โดยใช้ sherlock บนเมนู


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

ด้านล่างนี้คุณสามารถดูแหล่งที่มาของแอปพลิเคชัน

ไฟล์ xml ของเมนูเหมือนกัน:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/action_1"
    android:orderInCategory="100"
    android:showAsAction="always"
    android:title="@string/action1"/>

<item
    android:id="@+id/action_2"
    android:orderInCategory="100"
    android:showAsAction="ifRoom"
    android:title="@string/action2"/>

<item
    android:id="@+id/action_3"
    android:orderInCategory="100"
    android:showAsAction="ifRoom"
    android:title="@string/action3"/>

<item
    android:id="@+id/action_settings"
    android:orderInCategory="100"
    android:showAsAction="never"
    android:title="@string/action_settings"/>

</menu>

กิจกรรมของความเข้ากันได้:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
     }

     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
     }
}

กิจกรรมของ Sherlock:

public class MainActivity extends SherlockActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        getSupportMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

}

จำเป็นต้องมีการกำหนดค่าเพิ่มเติมในแอป sherlock:

<style name="AppBaseTheme" parent="Theme.Sherlock.Light.DarkActionBar">

อัปเดต: ตามที่ @ rudy-s กล่าวว่าด้วยไลบรารีสนับสนุน android ล่าสุด (api 18) ฉันเห็นว่าพวกเขามีการสนับสนุนสำหรับ actionbar ในตัวอยู่แล้ว (เรียกว่าคลาส ActionBarCompat)


5
จริงๆแล้วมันไม่ถูกต้องทั้งหมด ไลบรารีความเข้ากันได้สามารถให้และนำการใช้งานไปใช้กับ ActionBar บน Gingerbread ตัวอย่างแอพนี้ให้ AB ใน GB และไม่ใช้ Sherlock แต่ใช้งานร่วมกันได้ play.google.com/store/apps/details?id=uk.co.mxdata.rootle
Hamid

ไม่จำเป็นถ้าคุณดึงตัวอย่าง actionbarcompat ออกมา (ตัวอย่างจาก android-17 sdk) และสร้างใน ADT มันจะทำงานบนอุปกรณ์ GB ด้วย ActionBar ฉันเพิ่งทดสอบด้วยตัวเองเพื่อยืนยันใน Desire HD ด้วย 2.3.5
ฮามิด

โอเคเข้าใจแล้ว. อย่างไรก็ตาม ActionBarSherlock มีคุณสมบัติเพิ่มเติมใช่ไหม?
Bruno Mateus

2
ด้วยไลบรารีการสนับสนุน android ล่าสุด (api 18) ฉันเห็นว่าพวกเขามีการสนับสนุนในตัวสำหรับ actionbar (เรียกว่าคลาส ActionBarCompat)
ดี้ s

GingerBEARD? รักมัน
Carlos P

39

Actionbar Sherlock นั้นล้ำหน้ากว่าและทะเยอทะยานมากกว่าโครงการความเข้ากันได้กับ Actionbar ธรรมดา

ความเข้ากันได้ของแถบการกระทำนั้นถือได้ว่าเป็น "ตัวอย่าง" หรือเป็นจุดเริ่มต้นที่ดีถ้าคุณต้องการที่จะตีแถบการกระทำที่ด้านบนของแอปเท่านั้น

ActionBarSherlock สร้างบนไลบรารีความเข้ากันได้และให้คุณ (เช่นตัวอย่างความเข้ากันได้ของแถบการกระทำ) Action Bar บนอุปกรณ์ 3.0 นอกจากนี้ยังมีคุณสมบัติพิเศษที่ไม่ปรากฏในรหัสความเข้ากันได้ของ ActionBar ซึ่งรวมถึงคุณสมบัติที่ชอบ แต่ไม่ จำกัด เพียง

  • setNavigationMode (สำหรับแท็บและสปินเนอร์ในแถบการกระทำ)
  • กล่องโต้ตอบชิ้นส่วน
  • Contextual Action Bar (CAB) เมนูที่ใช้แทนแถบการกระทำใช้สำหรับตัวอย่างสำหรับการเลือกแบบหลายตัว (http://developer.android.com/design/patterns/new-4-0.html) นี่คือคุณลักษณะของ ICS ( !) สำหรับสิ่งนี้การดำเนินการของคลาส ActionMode (แนะนำใน API ระดับ 11) จะต้องมีการนำเข้าสู่ไลบรารี ActionbarSherlock
  • การใช้งาน Fragment และ FragmentActivity - เนื่องจากแฟรกเมนต์สามารถใช้เมนู onCreateOptions เราต้องตรวจสอบให้แน่ใจว่าใช้ SupportMenuInflater
  • สองชุดรูปแบบไม่แตกต่างจาก Holo.Dark และ Holo.Light (Theme.Sherlock, Theme.Sherlock.Light)
  • คุณลักษณะ ICS "แถบการกระทำแยก"

ข้อเสียอย่างเดียวที่ฉันเห็นในการใช้ ActionbarSherlock คือคุณล็อคตัวเองในไลบรารีนั้น หากด้วยเหตุผลบางอย่างมันจะตายในอนาคตอันใกล้คุณจะต้องรักษาด้วยตัวคุณเอง (ตัวอย่างเช่นหากไม่มีการนำ Jellybean มาใช้) นี่คือความยุ่งยาก (ไม่ใช่ปัญหาใหญ่) เนื่องจากชิ้นส่วนทั้งหมดของคุณขยาย SherlockFragemnt และกิจกรรมทั้งหมดของคุณ SherlockActivity


ฉันพลาดอะไรไปรึเปล่า? ดูเหมือนว่าการเลือกหลายรายการไม่รองรับใน ABS
jiduvah

1
ขออภัยในความล่าช้า. ABS ไม่สนับสนุนการเลือกหลายทาง แต่คุณสามารถใช้ Multiselect โดยใช้ ABS "ActionMode" เนื่องจาก ABS มีการใช้งานของคลาส ActionMode ของตัวเอง เมื่อเข้าสู่ "โหมดเลือกหลายจุด" คุณจะตั้งค่าโหมดตัวเลือกของ ListView เป็น CHOICE_MODE_MULTIPLE และเรียกใช้ ActionMode โดยเรียกใช้ getSherlockActivity () startActionMode (โทรกลับ)
Glenn Bech

26

การปรับใช้ @Jake ดำเนินไปได้ดีกว่าสิ่งที่รองรับแถบการทำงานเพื่อให้เข้ากันได้กับ Actionbar ที่แม่นยำยิ่งขึ้นเป็นเพียงตัวอย่างพื้นฐานเกี่ยวกับวิธีการที่คุณสามารถสนับสนุนแอปพลิเคชันทั้งหมดด้วย pseudo-actionbar สำหรับการเผยแพร่ก่อนจาก Honeycomb (API 13) แม้ว่าเป้าหมายของพวกเขาจะเป็นแอ็คชั่นข้ามกันที่เหมือนกันพวกมันมีวิธีการที่แตกต่างกัน

ActionbarCompat Aproach

การใช้งานนี้ไม่ใช้ประโยชน์จากห้องสมุดรองรับ Android ที่เข้ากันได้แทนมันสร้างคลาสพื้นฐานที่ชื่อว่าActionBarActivityสร้างอินสแตนซ์เดียวของผู้ช่วยตัวช่วยนี้ทำหน้าที่เป็นตัวโรงงานเอง

ส่วนที่น่าสนใจที่สุดคือในActionbarBaseHelperเพราะมันมีรหัสที่สำคัญที่สุดผมขอแนะนำให้คุณเข้าใจคลาสนี้และคุณจะได้รับตัวอย่างทั้งหมด

Action Bar Sherlock

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

เช่นเดียวกับ Sherlock ที่ใช้งานร่วมกันได้มีการใช้งานที่แตกต่างกัน แต่อย่างใดอย่างหนึ่งก็คือสำหรับ "ความเข้ากันได้" และอีกวิธีหนึ่งคือ Native มันบังคับให้คุณขยายจาก SherlockActivity หรือจาก SherlockFragmentActivity เนื่องจากคลาสพื้นฐานทั้งสองนี้มีวิธีสำหรับการแจกจ่าย ActionBar

นี่เป็นโครงการขนาดใหญ่และซับซ้อนที่ไม่สามารถอธิบายได้ในโพสต์เดียว แนะนำให้คุณขุดไปรอบ ๆSherlock Github ซื้อคืนดูและตามที่Jeff Atwoodพูด

ป้อนคำอธิบายรูปภาพที่นี่


10
  • ฉันเชื่ออย่างยิ่งว่าคุณควรใช้ActionBarCompatสำหรับโครงการใหม่ทั้งหมดที่ต้องการสนับสนุนอุปกรณ์รุ่นเก่า

  • นอกจากนี้ยังอาจสมเหตุสมผลในการโยกย้ายโครงการที่มีอยู่ ดังนั้นอ่านต่อเพื่อเรียนรู้ว่าทำไมคุณควรโยกย้ายหรือใช้ ActionBarCompat ทันทีและวิธีโยกย้ายโครงการที่มีอยู่

ทำไมคุณควรเลือก ActionBarCompat มากกว่า ActionBarSherlock

มีเหตุผลหลายประการที่คุณควรเลือกใช้ ActionbarCompat มากกว่า ActionbarSherlock

  1. ก่อนอื่นโครงการนี้คือโดย Google เป็นส่วนหนึ่งของห้องสมุดสนับสนุนและน่าจะสนับสนุนสิ่งที่เกี่ยวข้องกับ Action Bar ใหม่ในเวลาเดียวกัน Google ปล่อยพวกเขาด้วยสต็อก Android

  2. อีกเหตุผลที่ดีคือมันรองรับNavigation Drawer patternด้านขวานอกกรอบในขณะที่ ActionBarSherlock ไม่ทำงาน ดังนั้นหากคุณต้องการเพิ่ม drawer นี้ลงในโปรเจ็กต์ / แอพที่มีอยู่คุณควรย้ายข้อมูล

  3. สิ่งสุดท้ายและที่สำคัญคือ Jake Wharton ผู้สร้าง ActionBarSherlock ประกาศใน Google+ ว่าการพัฒนาต่อไปของ ActionBarSherlock ได้หยุดลง ActionBarSherlock 4.4 เป็นรุ่นล่าสุดและอาจได้รับการแก้ไขข้อผิดพลาด - แต่จะไม่มีฟีเจอร์ใหม่ ๆ : ดังนั้นหากมีฟังก์ชั่นใหม่ที่รวมอยู่ใน actionbar คุณอาจไม่สามารถใช้งานกับ actionbarsherlock ได้


7

บางทีเราควรอัปเดตคำตอบเพราะ Google เผยแพร่การสนับสนุน Actionbar อย่างเป็นทางการตั้งแต่API18 ?

บล็อกด้านล่างมาจากบล็อกอย่างเป็นทางการเกี่ยวกับห้องสมุดทั้งสองนี้:

หากคุณกำลังใช้โซลูชันบุคคลที่สาม (เช่น ActionBarSherlock) มีเหตุผลสองสามข้อที่จะต้องพิจารณาอัปเกรด:

  • สามารถปรับปรุงให้ทันสมัยอยู่เสมอเมื่อ Action Bar API พัฒนาขึ้น
  • การสนับสนุนการนำทางแบบบูรณาการของบรรพบุรุษ
  • การใช้เฟรมเวิร์กเมนูและคลาส MenuItem
  • ใช้คลาส Fragment ของ Support Library ต่อไป
  • การสนับสนุนแบบบูรณาการสำหรับ ActionBarDrawerToggle สำหรับใช้กับ DrawerLayout
  • Backport ของ PopupMenu

ActionBarSherlock เป็นห้องสมุดที่มั่นคงและผ่านการทดสอบมาอย่างดีซึ่งให้บริการกับผู้พัฒนาเป็นอย่างดีมาเป็นเวลานาน หากคุณกำลังใช้งานอยู่และไม่จำเป็นต้องมีข้อใดข้อหนึ่งข้างต้นคุณไม่จำเป็นต้องย้ายข้อมูล

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