เค้าโครงผู้ประสานงานพร้อมแถบเครื่องมือในส่วนย่อยหรือกิจกรรม


96

ด้วยไลบรารีการออกแบบใหม่มีเค้าโครงใหม่หลายแบบที่เปลี่ยนแปลงวิธีการทำงานของแถบเครื่องมืออย่างมากหากนักพัฒนาต้องการ เนื่องจากแฟรกเมนต์ที่แตกต่างกันมีพฤติกรรมและวัตถุประสงค์ที่แตกต่างกันตัวอย่างเช่นแฟรกเมนต์แกลเลอรีที่มีแถบเครื่องมือการยุบซึ่งแสดงรูปภาพที่สำคัญหรือส่วนที่ไม่มีมุมมองแบบเลื่อนที่ไม่จำเป็นต้องใช้แอพบาร์เลย์เอาต์สำหรับการซ่อนแถบเครื่องมือการมีแถบเครื่องมือเดียวในกิจกรรมสามารถทำได้ พิสูจน์ยาก.

ด้วยเหตุนี้ฉันควรย้ายแถบเครื่องมือไปยังแต่ละส่วนหรือไม่ ถ้าเป็นเช่นนั้นฉันต้องตั้งค่า supportActionBar ทุกครั้งที่แสดงแฟรกเมนต์และยังมีการอ้างอิงของกิจกรรมในแฟรกเมนต์ซึ่งจะลบล้างลักษณะอิสระของแฟรกเมนต์ ถ้าฉันปล่อยแถบเครื่องมือไว้ในกิจกรรมเพียงอย่างเดียวฉันต้องมีเค้าโครงหลายแบบที่กำหนดไว้สำหรับพฤติกรรมแต่ละประเภทในแต่ละส่วน แนวทางที่ดีที่สุดคืออะไร?


1
สวัสดีคุณพบวิธีแก้ปัญหาหรือไม่?
SERG

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

มีการอัปเดตหรือแนวทางแก้ไขที่ดีกว่านี้หรือไม่
Sagar Nayak

คำตอบ:


56

สำหรับฉันมันฟังดูแปลกเกินไปที่จะมีแถบแอปและแถบเครื่องมือในแต่ละส่วน ดังนั้นฉันจึงเลือกที่จะมีแถบแอปเดียวพร้อมแถบเครื่องมือในกิจกรรม

ในการแก้ปัญหานั้นด้วย CoordinatorLayout คุณจะต้องตั้งค่าลักษณะการทำงานที่แตกต่างกันของFrameLayout(หรือเค้าโครงอื่น ๆ ) ของคุณที่ควรจะเก็บชิ้นส่วนจากแต่ละส่วนที่คุณต้องการแทนที่พฤติกรรมเริ่มต้น

สมมติว่าพฤติกรรมเริ่มต้นของคุณคือ app:layout_behavior="@string/appbar_scrolling_view_behavior"

จากนั้นใน fragment_activity_layout.xml ของคุณคุณอาจมีบางอย่างเช่นนี้:

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/dashboard_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.Toolbar"
            app:layout_scrollFlags="scroll|enterAlways"/>
    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/dashboard_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>

และในแต่ละส่วนคุณไม่ต้องการใช้app:layout_behavior="@string/appbar_scrolling_view_behavior"คุณจะต้องลบล้างonAttachและonDetachวิธีการที่จะเปลี่ยนพฤติกรรมของคุณFrameLayout:

CoordinatorLayout.Behavior behavior;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if(behavior != null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    behavior = params.getBehavior();
    params.setBehavior(null);

}

@Override
public void onDetach() {
    super.onDetach();
    if(behavior == null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    params.setBehavior(behavior);

    layout.setLayoutParams(params);

    behavior = null;
}

หลังจากนั้น CoordinatorLayout จะไม่ยุบแถบแอป ฯลฯ และจะอนุญาตให้เค้าโครงส่วนย่อยเป็นแบบเต็มความสูง


ดีจะต้องลองสิ่งนี้และดูว่ามันง่ายขึ้นหรือไม่ ขอบคุณ.
mobilepotato7

หากคุณพบสิ่งที่ง่ายกว่านี้โปรดแจ้งให้เราทราบ ฉันคิดว่าเป็นไปได้ที่จะเปลี่ยนพฤติกรรมของผู้ประสานงานได้ตลอดเวลาในวงจรชีวิตของชิ้นส่วน (เช่นปกติคุณมีเครื่องรีไซเคิลที่มีสิ่งของบางอย่าง แต่ในบางกรณีมันอาจจะว่างเปล่าและคุณจะรู้ว่าหลังจาก Loader's onLoadFinishedแล้วเท่านั้นเป็นไปได้ที่คุณจะ ชอบแสดงภาพตรงกลางเพื่อแจ้งว่าไม่มีอะไรอยู่ที่นี่เหมือนในแอป Inbox) แต่ฉันยังไม่ได้ลอง อาจจะช้ากว่าวันนี้
КлаусШварц

โอเคทำงานได้ดี ฉัน cr8 ผู้ช่วยที่ดูแลการเปิด / ปิดการใช้งานผู้ประสานงานตามความเหมาะสมดังนั้นฉันจึงโทรหาenableCoordinator(Activity activity)/ disableCoordinator(Activity activity)จากส่วนย่อย ๆ
КлаусШварц

ผู้ช่วยของคุณ @ КлаусШварцอยู่ที่ไหน โทรมาเมื่อไหร่
santhyago

1
@santhyago In the Fragment
КлаусШварц

8

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

<!-- Put your fragment inside a Framelayout and set the behavior for this FrameLayout -->
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <!-- Your fragment -->
    <include layout="@layout/content_main" />

</FrameLayout>

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>


1

นี่เป็นคำถามที่ดีอย่างToolbarแท้จริง: สิ่งที่ต้องทำเหมือนActionBarถูกเก็บไว้ใน a Activityหรือ a Fragment? หลังจากค้นหาคำถามและเอกสารต่างๆแล้วฉันไม่พบวิธีแก้ปัญหาที่ครอบคลุมทุกกรณี ดังนั้นมันจึงขึ้นอยู่กับสถานการณ์ของคุณว่าจะไปทางไหน

กรณีที่ 1: Toolbar ต้องเปลี่ยนเป็น ActionBar

หาก Toolbar ต้องทำงานเหมือน ActionBar ปกติ (หรือหากมีการแสดงส่วนย่อยสูงสุด 1 ชิ้นเป็นครั้งคราว) ฉันคิดว่าวิธีที่ดีที่สุด / ง่ายที่สุดคือใช้แบบดั้งเดิมที่Activitiesมี Toolbar ของตัวเองและใส่ Fragment ของคุณไว้ที่นั่น วิธีนี้ทำให้คุณไม่ต้องกังวลว่า Toolbar จะต้องแสดงเมื่อใด

การเปลี่ยน ActionBar (-behaviour) จาก Fragments ก็เป็นไปได้เช่นกัน แต่ฉันไม่แนะนำให้ทำเพราะจะบังคับให้คุณติดตามว่า Fragment ตัวไหนเปลี่ยน ActionBar เมื่อไหร่ ฉันไม่รู้ด้วยซ้ำว่าการตั้งค่า ActionBar สามารถทำได้หลายครั้ง

กรณีที่ 2: แต่ละ Fragment ควรมี Toolbar ของตัวเอง (บางส่วน)

นอกจากนี้คุณยังสามารถเลือกที่จะใส่แถบเครื่องมือแบบสแตนด์อโลนที่แตกต่างกันในส่วนต่างๆด้วยการกระทำของตัวเอง ด้วยวิธีนี้คุณสามารถแสดง Fragments ต่างๆติดกันโดยแต่ละชิ้นจะมีการกระทำของตัวเองใน Toolbar และแนะนำว่าเป็น Toolbar 1 อัน (อาจจะเหมือน Gmail-app แม้ว่าฉันจะไม่แน่ใจก็ตาม) อย่างไรก็ตามนี่หมายความว่าคุณจะต้องขยาย Toolbars เหล่านั้นด้วยตัวเอง แต่ต้องไม่ยากมาก

ฉันหวังว่านี่จะช่วยในการเลือก

(ขออภัยหากฉันทำผิดพลาด (ภาษา))


4
ขออภัย แต่สิ่งนี้ไม่สามารถตอบปัญหาที่เกี่ยวข้องกับไลบรารีการออกแบบใหม่ได้ แน่นอนว่าการมีแถบเครื่องมือเป็นแถบการดำเนินการเป็นเป้าหมาย แต่การมีเค้าโครงผู้ประสานงานหลายแบบสำหรับแถบเครื่องมือประเภทต่างๆอาจเป็นเรื่องยุ่งยาก สิ่งที่ฉันพบคือสามารถทำให้แถบเครื่องมือเคลื่อนไหวได้ตามต้องการ ฉันยังคงต้องทดสอบให้ดีขึ้น แต่ดูเหมือนว่าจะมีผลลัพธ์ที่ดี
mobilepotato7

0

นั่นคือสิ่งที่เอกสารการนำทางกล่าวว่า :

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

จริงๆแล้วการตั้งค่าToolbarโดยใช้NavigationUIนั้นง่ายมากและโซลูชันนี้ไม่จำเป็นต้องให้ Fragment มีความรู้เกี่ยวกับพาเรนต์ ตัวอย่างเช่น:

<!-- my_fragment.xml -->
<androidx.constraintlayout.widget.ConstraintLayout ...>

  <com.google.android.material.appbar.MaterialToolbar
    android:id="@+id/toolbar"
    ... />

</androidx.constraintlayout.widget.ConstraintLayout>
class MyFragment : Fragment() {
  ...

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val navController = findNavController()
    binding.toolbar.setupWithNavController(navController)
  }
}

คุณสามารถค้นหาเต็มตัวอย่าง GitHub ที่นี่ นอกจากนี้ยังมีคำถามสัมพัทธ์ที่อาจสนใจsetSupportActionbar จำเป็นอีกต่อไปหรือไม่?

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