ตั้งค่าสถานะของ BottomSheetDialogFragment เป็นขยาย


92

คุณตั้งค่าสถานะของส่วนที่ขยายเป็นส่วนBottomSheetDialogFragmentขยายโดยBottomSheetBehavior#setState(STATE_EXPANDED)ใช้ Android Support Design Library (v23.2.1) ได้อย่างไร

https://code.google.com/p/android/issues/detail?id=202396พูดว่า:

แผ่นด้านล่างถูกตั้งค่าเป็น STATE_COLLAPSED ในตอนแรก เรียก BottomSheetBehavior # setState (STATE_EXPANDED) ถ้าคุณต้องการขยาย โปรดทราบว่าคุณไม่สามารถเรียกใช้เมธอดก่อนดูเค้าโครง

ปฏิบัติปัญหาต้องมีมุมมองที่จะสูงขึ้นเป็นครั้งแรก แต่ผมไม่แน่ใจว่าวิธีการที่ฉันจะตั้ง BottomSheetBehaviour ลงบนเศษ ( BottomSheetDialogFragment)

View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);  
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);  

คำตอบ:


223

"โปรดทราบว่าคุณไม่สามารถเรียกใช้เมธอดก่อนดูเค้าโครง"

ข้อความข้างต้นคือเบาะแส

กล่องโต้ตอบมีตัวฟังที่เริ่มทำงานเมื่อกล่องโต้ตอบปรากฏขึ้น ไม่สามารถแสดงกล่องโต้ตอบได้หากไม่ได้จัดวางไว้

ดังนั้นในonCreateDialog()แผ่นงานด้านล่างของโมดอล ( BottomSheetFragment) ก่อนส่งคืนกล่องโต้ตอบ (หรือที่ใดก็ได้เมื่อคุณมีการอ้างอิงถึงกล่องโต้ตอบ) ให้โทร:

// This listener's onShow is fired when the dialog is shown
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {

        // In a previous life I used this method to get handles to the positive and negative buttons
        // of a dialog in order to change their Typeface. Good ol' days.

        BottomSheetDialog d = (BottomSheetDialog) dialog;

        // This is gotten directly from the source of BottomSheetDialog
        // in the wrapInBottomSheet() method
        FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);

        // Right here!
        BottomSheetBehavior.from(bottomSheet)
            .setState(BottomSheetBehavior.STATE_EXPANDED);
    }
});

ในกรณีของฉันประเพณีของฉันBottomSheetกลายเป็น:

@SuppressWarnings("ConstantConditions")
public class ShareBottomSheetFragment extends AppCompatDialogFragment {

    @NonNull @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        BottomSheetDialog dialog =
                new BottomSheetDialog(getActivity(), R.style.Haute_Dialog_ShareImage);

        dialog.setContentView(R.layout.dialog_share_image);

        dialog.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });

        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                BottomSheetDialog d = (BottomSheetDialog) dialog;

                FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
                BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });

        SwitchCompat switchview = (SwitchCompat) dialog.findViewById(R.id.switchview);
        switchview.setTypeface(FontCache.get(dialog.getContext(), lookup(muli, NORMAL)));

        return dialog;
    }
}

โปรดแจ้งให้เราทราบหากสิ่งนี้ช่วยได้

อัปเดต

โปรดทราบว่าคุณสามารถแทนที่BottomSheetDialogFragmentเป็น:

public class SimpleInitiallyExpandedBottomSheetFragment extends BottomSheetDialogFragment {

    @NonNull @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);

        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                BottomSheetDialog d = (BottomSheetDialog) dialog;

                FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
                BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });

        // Do something with your dialog like setContentView() or whatever
        return dialog;
    }
}

แต่ฉันไม่เห็นจริงๆว่าทำไมใคร ๆ ก็อยากทำแบบนั้นเพราะฐานBottomSheetFragmentไม่ทำอะไรนอกจากส่งกลับ a BottomSheetDialog.

อัปเดตสำหรับ ANDROIDX

เมื่อใช้ AndroidX ทรัพยากรก่อนหน้านี้ที่พบในขณะนี้สามารถพบได้ที่android.support.design.R.id.design_bottom_sheetcom.google.android.material.R.id.design_bottom_sheet


ขอบคุณฉันลองวิธีนี้แล้ว ทำให้ดูไม่เป็นระเบียบBottomSheetDialogFragment(ดูเหมือนจะข้ามเฟรมในภาพเคลื่อนไหวตอนเปิด) เมื่อเปลี่ยนจากพฤติกรรมที่ยุบไปเป็นแบบขยาย แก้ไข: ทดสอบสิ่งนี้บนอุปกรณ์ Android Marshmallow และ KitKat
user2560886

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

5
เป็นเพียงการรับไม่พบแพ็กเกจandroid.support.design.Rหลังจากอัปเดตไลบรารีการสนับสนุน?
นาตาริโอ

2
ฉันกำลังมีปัญหาในการแก้ไขandroid.support.design.Rเช่นเดียวกับ @natario ฉันกำลังใช้implementation "com.google.android.material:material:1.0.0". ฉันใช้ AndroidX ในโครงการนี้ด้วย
hsson

21
เมื่อใช้ AndroidX สามารถดูทรัพยากรได้ที่com.google.android.material.R.id.design_bottom_sheet
expressx

45

คำตอบของ efeturi นั้นดีมากอย่างไรก็ตามหากคุณต้องการใช้onCreateView ()เพื่อสร้าง BottomSheet ของคุณซึ่งต่างจากการใช้onCreateDialog ()นี่คือรหัสที่คุณจะต้องเพิ่มภายใต้เมธอด onCreateView ()ของคุณ:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    getDialog().setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            BottomSheetDialog d = (BottomSheetDialog) dialog;
            View bottomSheetInternal = d.findViewById(android.support.design.R.id.design_bottom_sheet);
            BottomSheetBehavior.from(bottomSheetInternal).setState(BottomSheetBehavior.STATE_EXPANDED);
        }
    });
    return inflater.inflate(R.layout.your_bottomsheet_content_layout, container, false);
}

3
หรือคุณไม่จำเป็นต้องโทรหา getDialog เลย ฉันพบวิธีที่สะอาดที่สุดคือการแทนที่ทั้ง onCreateView และ onCreateDialog สร้างมุมมองของคุณใน onCreateView (เช่นเดียวกับที่คุณทำกับส่วนใด ๆ ) และทำรหัสเฉพาะของกล่องโต้ตอบใน onCreateDialog (โทร super.onCreateDialog เพื่อรับอินสแตนซ์)
Stimsoni

2
นี่ช่วยวันของฉัน ขอบคุณ.
AndroidRuntimeException

@Stimsoni onCreateView จะไม่ถูกเรียกหากใช้ onCreateDialog developer.android.com/reference/android/support/v4/app/…
Vincent_Paing

1
@ Vincent_Paing ใช่แล้ว ในลิงค์ที่แนบมาของคุณระบุว่า 'onCreateView ไม่จำเป็นต้องดำเนินการ' มันไม่ได้บอกว่าจะไม่เรียก ลองดูที่รหัสที่มาที่นี่github.com/material-components/material-components-android/blob/... การใช้งานเริ่มต้นเรียกใช้ onCreateDialog เพื่อสร้างแผ่นงานด้านล่างและทุกโซลูชันข้างต้นยังคงใช้ onCreateView ซึ่งหมายความว่าทั้งสองจะถูกเรียกเสมอ ตรวจสอบให้แน่ใจว่าคุณยังคงโทรหา super.onCreateDialog () ถ้าคุณลบล้างมัน
Stimsoni

ใน BottomSheetDialogFragment มันทำให้ฉันผิดพลาดใน onCreateView () ฉันใส่ไว้ใน onViewCreated () และมันสมบูรณ์แบบ! ขอบคุณ
avisper

22

โซลูชันที่เรียบง่ายและสง่างาม:

BottomSheetDialogFragment อาจเป็นคลาสย่อยเพื่อจัดการกับสิ่งนี้:

class NonCollapsableBottomSheetDialogFragment extends BottomSheetDialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final BottomSheetDialog bottomSheetDialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);

        bottomSheetDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                FrameLayout bottomSheet = bottomSheetDialog.findViewById(com.google.android.material.R.id.design_bottom_sheet);

                BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
                behavior.setSkipCollapsed(true);
                behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });
        return bottomSheetDialog;
    }
}

ดังนั้นขยายชั้นเรียนนี้แทนที่จะBottomSheetDialogFragmentสร้างแผ่นงานด้านล่างของคุณเอง

บันทึก

เปลี่ยนcom.google.android.material.R.id.design_bottom_sheetเป็นandroid.support.design.R.id.design_bottom_sheetว่าโปรเจ็กต์ของคุณใช้ไลบรารีการสนับสนุน Android แบบเก่าหรือไม่


1
น่าจะเป็นตอนนี้แทนcom.google.android.material.R android.support.design.R
EpicPandaForce

@EpicPandaForce ชัวร์. ทีม Android ของ Google เพิ่งบรรจุไลบรารีการสนับสนุนเดิมใหม่
DYS

4

ผมว่าพวกข้างบนดีกว่า น่าเศร้าที่ฉันไม่พบวิธีแก้ปัญหาเหล่านั้นก่อนที่จะแก้ไข แต่เขียนวิธีแก้ปัญหาของฉัน ค่อนข้างคล้ายกับทั้งหมด

================================================== ================================

ฉันประสบปัญหาเดียวกัน นี่คือสิ่งที่ฉันแก้ไข พฤติกรรมซ่อนอยู่ใน BottomSheetDialog ซึ่งพร้อมใช้งานเพื่อรับพฤติกรรมหากคุณไม่ต้องการเปลี่ยนเค้าโครงหลักของคุณให้เป็น CooridateLayout คุณสามารถลองสิ่งนี้ได้

ขั้นตอนที่ 1: ปรับแต่ง BottomSheetDialogFragment

open class CBottomSheetDialogFragment : BottomSheetDialogFragment() {
   //wanna get the bottomSheetDialog
   protected lateinit var dialog : BottomSheetDialog 
   override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
      dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
      return dialog
   }

   //set the behavior here
   fun setFullScreen(){
      dialog.behavior.state = STATE_EXPANDED
   }
}

ขั้นตอนที่ 2: ทำให้ส่วนของคุณขยายส่วนที่กำหนดเองนี้

class YourBottomSheetFragment : CBottomSheetDialogFragment(){

   //make sure invoke this method after view is built
   //such as after OnActivityCreated(savedInstanceState: Bundle?)
   override fun onStart() {
      super.onStart()
      setFullScreen()//initiated at onActivityCreated(), onStart()
   }
}

3
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                BottomSheetDialog d = (BottomSheetDialog) dialog;

                FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
                BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });

ฉันพบ NullPointException ในBottomSheetBehavior.from(bottomSheet)เพราะd.findViewById(android.support.design.R.id.design_bottom_sheet)ส่งคืนค่าว่าง

มันแปลก ๆ ฉันเพิ่มรหัสบรรทัดนี้ในนาฬิกาใน Android Monitor ในโหมด DEBUG และพบว่ามันส่งคืน Framelayout ตามปกติ

นี่คือรหัสของwrapInBottomSheetใน BottomSheetDialog:

private View wrapInBottomSheet(int layoutResId, View view, ViewGroup.LayoutParams params) {
        final CoordinatorLayout coordinator = (CoordinatorLayout) View.inflate(getContext(),
                R.layout.design_bottom_sheet_dialog, null);
        if (layoutResId != 0 && view == null) {
            view = getLayoutInflater().inflate(layoutResId, coordinator, false);
        }
        FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(R.id.design_bottom_sheet);
        BottomSheetBehavior.from(bottomSheet).setBottomSheetCallback(mBottomSheetCallback);
        if (params == null) {
            bottomSheet.addView(view);
        } else {
            bottomSheet.addView(view, params);
        }
        // We treat the CoordinatorLayout as outside the dialog though it is technically inside
        if (shouldWindowCloseOnTouchOutside()) {
            coordinator.findViewById(R.id.touch_outside).setOnClickListener(
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            if (isShowing()) {
                                cancel();
                            }
                        }
                    });
        }
        return coordinator;
    }

บางครั้งฉันพบว่าR.id.design_bottom_sheetไม่เท่ากับandroid.support.design.R.id.design_bottom_sheet. มีมูลค่าต่างกันใน R.java ที่แตกต่างกัน

ดังนั้นผมจึงเปลี่ยนไปandroid.support.design.R.id.design_bottom_sheetR.id.design_bottom_sheet

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                BottomSheetDialog d = (BottomSheetDialog) dialog;

                FrameLayout bottomSheet = (FrameLayout) d.findViewById(R.id.design_bottom_sheet); // use R.java of current project
                BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });

ไม่มี NullPointException อีกต่อไปในขณะนี้


3

ใช้BottomsheetDialogFragmentสถานะในonResumeจะแก้ปัญหานี้

@Override
public void onResume() {
    super.onResume();
    if(mBehavior!=null)
       mBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}

onShow(DialogInterface dialog)และpostDelayedอาจทำให้ภาพเคลื่อนไหวผิดพลาด


2

ผลลัพธ์ทั้งหมดด้วยการใช้ onShow () ทำให้เกิดข้อผิดพลาดในการแสดงผลแบบสุ่มเมื่อซอฟต์คีย์บอร์ดแสดงขึ้น ดูภาพหน้าจอ - กล่องโต้ตอบ BottomSheet ไม่ได้อยู่ที่ด้านล่างของหน้าจอ แต่วางไว้เหมือนแป้นพิมพ์ปรากฏขึ้น ปัญหานี้ไม่ได้เกิดขึ้นเสมอไป แต่ค่อนข้างบ่อย

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

อัปเดต

วิธีแก้ปัญหาของฉันที่สะท้อนถึงสมาชิกส่วนตัวนั้นไม่จำเป็น การใช้ postDelayed (ประมาณ 100 ms) เพื่อสร้างและแสดงกล่องโต้ตอบหลังจากซ่อนแป้นพิมพ์แบบนุ่มเป็นทางออกที่ดีกว่า จากนั้นวิธีแก้ปัญหาข้างต้นด้วย onShow () ก็ใช้ได้

Utils.hideSoftKeyboard(this);
mView.postDelayed(new Runnable() {
    @Override
    public void run() {
        MyBottomSheetDialog dialog = new MyBottomSheetDialog();
        dialog.setListener(MyActivity.this);
        dialog.show(getSupportFragmentManager(), TAG_BOTTOM_SHEET_DLG);
    }
}, 100);

ดังนั้นฉันจึงใช้โซลูชันอื่น แต่ต้องใช้การสะท้อนแสงเนื่องจาก BottomSheetDialog มีสมาชิกทั้งหมดเป็นส่วนตัว แต่มันแก้จุดบกพร่องในการแสดงผล คลาส BottomSheetDialogFragment เป็นเพียง AppCompatDialogFragment ด้วยเมธอด onCreateDialog ซึ่งสร้าง BottomSheetDialog ฉันสร้างลูกของ AppCompatDialogFragment ซึ่งสร้างคลาสของฉันขยาย BottomSheetDialog และซึ่งแก้ปัญหาการเข้าถึงสมาชิกพฤติกรรมส่วนตัวและตั้งค่าในเมธอด onStart เป็นสถานะ STATE_EXPANDED

public class ExpandedBottomSheetDialog extends BottomSheetDialog {

    protected BottomSheetBehavior<FrameLayout> mBehavior;

    public ExpandedBottomSheetDialog(@NonNull Context context, @StyleRes int theme) {
        super(context, theme);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            Field privateField = BottomSheetDialog.class.getDeclaredField("mBehavior");
            privateField.setAccessible(true);
            mBehavior = (BottomSheetBehavior<FrameLayout>) privateField.get(this);
        } catch (NoSuchFieldException e) {
            // do nothing
        } catch (IllegalAccessException e) {
            // do nothing
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (mBehavior != null) {
            mBehavior.setSkipCollapsed(true);
            mBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
        }
    }
}


public class AddAttachmentBottomSheetDialog extends AppCompatDialogFragment {

    ....

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new ExpandedBottomSheetDialog(getContext(), getTheme());
    }

    ....
}

1

วิธีที่ง่ายที่สุดที่ผมนำมาใช้เป็นด้านล่างนี่เรากำลังมองหาandroid.support.design.R.id.design_bottom_sheetและการตั้งรัฐแผ่นด้านล่างเป็นขยายตัว

หากไม่มีสิ่งนี้แผ่นงานด้านล่างของฉันจะติดอยู่ในสถานะ COLLAPSED เสมอหากความสูงของมุมมองมากกว่า 0.5 ของความสูงของหน้าจอและฉันต้องเลื่อนด้วยตนเองเพื่อดูแผ่นงานด้านล่างแบบเต็ม

class BottomSheetDialogExpanded(context: Context) : BottomSheetDialog(context) {

    private lateinit var mBehavior: BottomSheetBehavior<FrameLayout>

    override fun setContentView(view: View) {
        super.setContentView(view)
        val bottomSheet = window.decorView.findViewById<View>(android.support.design.R.id.design_bottom_sheet) as FrameLayout
        mBehavior = BottomSheetBehavior.from(bottomSheet)
        mBehavior.state = BottomSheetBehavior.STATE_EXPANDED
    }

    override fun onStart() {
        super.onStart()
        mBehavior.state = BottomSheetBehavior.STATE_EXPANDED
    }
}

1

เช่นเดียวกับคำตอบuregentxในkotlinคุณสามารถประกาศคลาสแฟรกเมนต์ของคุณที่ขยายจากBottomSheetDialogFragmentและเมื่อสร้างมุมมองคุณสามารถตั้งค่าสถานะเริ่มต้นของผู้ฟังไดอะล็อกหลังจากที่ไดอะล็อกแสดงขึ้น

STATE_COLLAPSED: แผ่นด้านล่างสามารถมองเห็นได้ แต่แสดงเฉพาะความสูงที่มองเห็นได้

STATE_EXPANDED: แผ่นด้านล่างสามารถมองเห็นได้และความสูงสูงสุด

STATE_HALF_EXPANDED: แผ่นงานด้านล่างสามารถมองเห็นได้ แต่แสดงความสูงเพียงครึ่งเดียว

class FragmentCreateGroup : BottomSheetDialogFragment() {
      ...

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
        // Set dialog initial state when shown
        dialog?.setOnShowListener {
            val bottomSheetDialog = it as BottomSheetDialog
            val sheetInternal: View = bottomSheetDialog.findViewById(com.google.android.material.R.id.design_bottom_sheet)!!
            BottomSheetBehavior.from(sheetInternal).state = BottomSheetBehavior.STATE_COLLAPSED
        }

        val view = inflater.inflate(R.layout.fragment_create_group, container, false)
        ...

        return view
    }
}

อย่าลืมใช้การออกแบบวัสดุในการไล่ระดับสี

implementation "com.google.android.material:material:$version"

ดูข้อมูลอ้างอิงด้านการออกแบบวัสดุด้วย


ที่ไหนที่ไม่dialog?ตัวแปรมาจากใน onCreateView?
Eric Smith

dialogเป็นคุณสมบัติของคลาสDialogFragmentจริงๆแล้วคือ Getter ในตัวอย่างนี้ฉันใช้ getter นั้นเพื่อรับอินสแตนซ์ DialogFragment ปัจจุบันและsetOnShowListenerไปที่มัน คุณอาจเคยใช้คำแนะนำประเภทนั้นในโปรเจ็กต์ของคุณไปแล้วเช่นในกิจกรรมเพื่อเข้าถึงตัวรับแถบการกระทำactionBarคุณจึงสามารถปรับเปลี่ยนส่วนประกอบนั้นได้เช่นactionBar?.subtitle = "abcd"
FJCG

1

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

setOnShowListener(dialog -> {
            BottomSheetBehavior bottomSheetBehavior = ((BottomSheetDialog)dialog).getBehavior();
            bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
        });

1
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return super.onCreateDialog(savedInstanceState).apply {
        setOnShowListener {
            (this@TipsBottomDialogFragment.dialog as BottomSheetDialog).behavior.setState(
                BottomSheetBehavior.STATE_EXPANDED
            )
        }
    }
}

1

โพสต์สิ่งนี้ที่นี่ถึงผู้อ่านในอนาคตเนื่องจากฉันคิดว่าเราสามารถใช้วิธีแก้ปัญหาอื่นได้

ฉันกำลังพยายามแก้ปัญหาเดียวกันกับที่คุณอธิบายด้วยไฟล์BottomSheetDialog.

ฉันไม่ชอบใช้รหัส Android ภายในและฉันเพิ่งพบว่ามีวิธีการภายในBottomSheetDialog getBehaviorที่คุณสามารถใช้ได้:

คุณสามารถใช้สิ่งนี้ภายในBottomSheetDialog:

behavior.state = BottomSheetBehavior.STATE_EXPANDED

การใช้BottomSheetDialogFragmentที่คุณสามารถทำหล่อเดียวกันโต้ตอบจาก DialogFragment BottomSheetDialogว่า


1

BottomSheetDialogFragment :

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    (dialog as? BottomSheetDialog)?.behavior?.state = STATE_EXPANDED
}

หรือเมื่อพร้อมแสดง:

private fun onContentLoaded(items: List<Any>) {
    adapter.submitList(items)
    (dialog as? BottomSheetDialog)?.behavior?.state = STATE_EXPANDED
}

0

ในคลาส Kotlin BottomSheetDialogFragment ของคุณให้แทนที่ onCreateDialog ดังต่อไปนี้

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val bottomSheetDialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
        bottomSheetDialog.setOnShowListener {
            val bottomSheet =
                bottomSheetDialog.findViewById<FrameLayout>(
                    com.google.android.material.R.id.design_bottom_sheet
                )
            val behavior = BottomSheetBehavior.from(bottomSheet!!)
            behavior.skipCollapsed = true
            behavior.state = BottomSheetBehavior.STATE_EXPANDED
        }
        return bottomSheetDialog
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.