বটমশিটডায়ালগফ্র্যাগমেন্টের রাজ্যটি প্রসারিত করতে সেট করুন


92

অ্যান্ড্রয়েড সাপোর্ট ডিজাইন লাইব্রেরি (v23.2.1) BottomSheetDialogFragmentব্যবহার BottomSheetBehavior#setState(STATE_EXPANDED)করে আপনি কীভাবে প্রসারিত বিস্তারের রাজ্য সেট করবেন ?

https://code.google.com/p/android/issues/detail?id=202396 বলেছেন:

নীচে শীটগুলি প্রথমে STATE_COLLAPSED এ সেট করা আছে। আপনি যদি এটি প্রসারিত করতে চান তবে নীচে শীটবিহীন # সেট স্টেট (STATE_EXPANDED) কল করুন। মনে রাখবেন লেআউট দেখার আগে আপনি পদ্ধতিটি কল করতে পারবেন না।

প্রস্তাবিত অনুশীলন একটি দৃশ্য প্রথম স্ফীত করা প্রয়োজন, কিন্তু আমি নিশ্চিত আমি একটি টুকরা সম্মুখের BottomSheetBehaviour সেট করব নই ( BottomSheetDialogFragment)।

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

উত্তর:


221

"দ্রষ্টব্য যে লেআউটগুলি দেখার আগে আপনি পদ্ধতিটি কল করতে পারবেন না" "

উপরের পাঠ্যটি ক্লু।

ডায়ালগগুলির একটি শ্রোতা থাকে যা ডায়ালগ প্রদর্শিত হওয়ার পরে বরখাস্ত হয় । কথোপকথনটি যদি সেট না করা হয় তবে এটি প্রদর্শিত হবে না।

সুতরাং, 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রিটার্ন ব্যতীত অন্য কিছু না করায় কেউ কেন এটি করতে চাইবে তা আমি সত্যিই দেখতে চাই না BottomSheetDialog

অ্যান্ড্রয়েডএক্সের জন্য আপডেট

অ্যান্ড্রয়েডএক্স ব্যবহার করার সময়, পূর্বে পাওয়া সংস্থানটি android.support.design.R.id.design_bottom_sheetএখন পাওয়া যাবে com.google.android.material.R.id.design_bottom_sheet


ধন্যবাদ, আমি এই পদ্ধতিটি চেষ্টা করেছিলাম। এটি BottomSheetDialogFragmentসঙ্কুচিত থেকে প্রসারিত আচরণে যাওয়ার সাথে সাথে এটি প্রদর্শিত জাঙ্কিটিকে (প্রারম্ভিক অ্যানিমেশনটিতে ফ্রেমগুলি এড়িয়ে যেতে দেখা যায়) তৈরি করে। সম্পাদনা করুন: এন্ড্রয়েড মার্শমেলো এবং
কিটকেট

4
এটি আমার পক্ষে পুরোপুরি কাজ করে। কোন লাফালাফি। আপনি কেবল একটি ডায়ালগ ফিরিয়ে দেওয়া ছাড়াও অন্য কিছু করছেন? আপনি যদি আপনার পোস্টটি আপনার কোড সহ আপডেট করেন তবে প্রশংসা করব যাতে আমার আরও ভাল ধারণা পাওয়া যায়।
এফিমুনি 26'16

4
android.support.design.Rসমর্থন লাইব্রেরিগুলি আপডেট করার পরে কি কেবল প্যাকেজটি খুঁজে পাচ্ছি না ?
নটারিও

4
android.support.design.R@ ন্যাটারিওর মতো সমাধান করার ক্ষেত্রেও আমার সমস্যা রয়েছে । আমি ব্যবহার করছি implementation "com.google.android.material:material:1.0.0"। আমি প্রকল্পে অ্যান্ড্রয়েডএক্সও ব্যবহার করছি।
hsson

21
অ্যান্ড্রয়েডএক্স ব্যবহার করার সময় রিসোর্সটি পাওয়া যাবেcom.google.android.material.R.id.design_bottom_sheet
urgentx

45

ইফেটুরির উত্তরটি দুর্দান্ত, তবে, যদি আপনি নিজের বটমশিট তৈরি করতে অনক্রিটভিউ () ব্যবহার করতে চান তবে অনক্রিটডায়ালগ () এর সাথে যাওয়ার বিপরীতে , এখানে আপনার কোডটি আপনার অনক্রিটভিউ () পদ্ধতির অধীনে যুক্ত করতে হবে :

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

4
বিকল্পভাবে আপনাকে মোটেই ডায়ালগ কল করতে হবে না। আমি এটির সবচেয়ে পরিষ্কার উপায় খুঁজে পাই যে অনক্রিটভিউ এবং অনক্রিটডায়ালগ উভয়ই ওভাররাইড করা। অনক্রিটভিউতে আপনার দৃষ্টিভঙ্গিটি তৈরি করুন (যেমন আপনি যে কোনও খণ্ডের সাথে থাকবেন) এবং ডায়ালগটি নির্দিষ্ট কোডটি অনক্রিয়েটডায়লগে করুন (উদাহরণটি পেতে সুপার.ক্রেটডায়ালগ কল করুন)
সিমিটসনি

4
এই আমার দিন বাঁচা। ধন্যবাদ
অ্যান্ড্রয়েডরুনটাইম এক্সসেপশন

অনক্রিটডায়ালগ ব্যবহার করা থাকলে @ সিমসটনি অনক্রিটভিউ কল করা হয় না। বিকাশকারী.অ্যান্ড্রয়েড.
ভিনসেন্ট_প্যাজ

4
@ ভিনসেন্ট_প্যাং, হ্যাঁ এটি। আপনার সংযুক্ত লিঙ্কে এটি বলেছে 'অনক্রিটভিউ বাস্তবায়নের দরকার নেই'। এটি বলা হয় না এটি বলা হবে না। সোর্স কোডটি এখানে দেখুন github.com/matory-components/matory-components-android/blob/… । ডিফল্ট বাস্তবায়ন নীচে শীটটি তৈরি করতে অনক্রিটডায়ালগ কল করে এবং উপরের প্রতিটি সমাধান এখনও অনক্রিটভিউ অর্থাত ব্যবহার করে যা তারা উভয়ই ডাকা হয়। আপনি যদি ওভাররাইড না করেন তবে আপনি সুপার.অনক্রিটডায়ালগ () কে এখনও কল করেন তা নিশ্চিত করুন।
সিসটেমনি

বটমশিটডায়ালগফ্র্যাগমেন্টে এটি আমাকে ক্রিসটভিউতে ক্র্যাশ করেছে () আমি এটিকে ওভিউক্রিয়েটেড () এ রেখেছি এবং এটি নিখুঁত! আপনাকে ধন্যবাদ
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আপনার নিজের নীচের শিটটি তৈরি করার পরিবর্তে এই শ্রেণিটি প্রসারিত করুন ।

বিঃদ্রঃ

আপনার প্রকল্পটি যদি পুরানো Android সমর্থন লাইব্রেরি ব্যবহার com.google.android.material.R.id.design_bottom_sheetকরে android.support.design.R.id.design_bottom_sheetতবে তা পরিবর্তন করুন to


4
com.google.android.material.Rপরিবর্তে এখন বলে মনে হচ্ছে android.support.design.R
এপিকপান্ডাফোর্স

নিবন্ধন করুন গুগলে অ্যান্ড্রয়েড দল সম্প্রতি প্রযোজ্য সহায়তা লাইব্রেরিটিকে পুনরায় প্যাকেজ করেছে।
DYS

4

আমি মনে করি উপরেরগুলি আরও ভাল। দুঃখের সাথে আমি সমাধান করার আগে সেই সমাধানগুলি খুঁজে পেলাম না। তবে আমার সমাধান লিখুন। সবার সাথে বেশ মিল।

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

আমি একই সমস্যার মুখোমুখি। এটিই আমি সমাধান করেছি। আচরণটি বটমশিটডায়ালগের মধ্যে লুকানো রয়েছে, যা আচরণটি পেতে পাওয়া যায় আপনি যদি আপনার পিতামাতার বিন্যাসকে CooridateLayout হিসাবে পরিবর্তন না করতে চান তবে আপনি এটি চেষ্টা করতে পারেন।

পদক্ষেপ 1: বটমপত্রক ডায়ালগ ফ্রেমটি কাস্টমাইজ করুন

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

আমি নুলপয়েন্টএক্সেপশন এর সাথে দেখা করেছি BottomSheetBehavior.from(bottomSheet)কারণ নালার d.findViewById(android.support.design.R.id.design_bottom_sheet)রিটার্ন দেয়।

এটা অদ্ভুত. আমি DEBUG মোডে অ্যান্ড্রয়েড মনিটরে ঘড়িতে কোডের এই লাইনটি যুক্ত করেছি এবং এটি ফ্রেমলেআউটকে স্বাভাবিকভাবে ফিরে আসতে দেখেছি।

নীচে wrapInBottomSheetশীটডায়ালগের কোড এখানে :

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। বিভিন্ন আর.জেভাতে তাদের আলাদা মান রয়েছে।

তাই আমি পরিবর্তন android.support.design.R.id.design_bottom_sheetকরতে R.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);
            }
        });

এখন আর নালপয়েন্ট এক্সেকশন নেই।


3

BottomsheetDialogFragmentরাষ্ট্র প্রয়োগ করুন onResumeএই সমস্যাটি সমাধান করবে

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

onShow(DialogInterface dialog)এবং postDelayedঅ্যানিমেশন ভুল হতে পারে


2

সফট কীবোর্ড প্রদর্শিত হলে অনশো () ব্যবহার করে সমস্ত ফলাফল এলোমেলোভাবে রেন্ডার বাগ দেয়। স্ক্রিনশট বেলো দেখুন - নীচের অংশে ডায়ালগটি স্ক্রিনের নীচে নেই তবে এটি প্রদর্শিত আছে যেমন কীবোর্ড প্রদর্শিত হয়েছিল। এই সমস্যাটি সবসময় হয় না তবে প্রায়শই ঘটে।

এখানে চিত্র বর্ণনা লিখুন

হালনাগাদ

ব্যক্তিগত সদস্যের প্রতিবিম্ব সহ আমার সমাধানটি অপ্রয়োজনীয়। হাইড সফট কীবোর্ডের পরে ডায়ালগ তৈরি এবং প্রদর্শনের জন্য পোস্টডলেড (প্রায় 100 এমএস সহ) ব্যবহার করা ভাল সমাধান। তারপরে ওনশো () সহ উপরের সমাধানগুলি ঠিক আছে।

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

সুতরাং আমি অন্যান্য সমাধানটি বাস্তবায়ন করি তবে এর প্রতিবিম্বটি ব্যবহার করা দরকার কারণ নীচে শীটডায়ালগের সমস্ত সদস্য ব্যক্তিগত হিসাবে রয়েছে। তবে এটি বাগ সরবরাহ করার সমাধান করে। বটমশিটডায়ালগফ্রেগমেন্ট শ্রেণিটি কেবলমাত্র অ্যাপকম্প্যাটডায়ালগফ্রেগমেন্ট যা অনক্রিয়েটডায়ালগ পদ্ধতি সহ বটমশিটডায়ালগ তৈরি করে। আমি অ্যাপকম্প্যাটডায়ালগফ্র্যাগমেন্টের নিজস্ব শিশু তৈরি করি যা আমার ক্লাসটি তৈরি করে বটমশিটডায়ালগ এবং প্রাইভেট আচরণের সদস্যের অ্যাক্সেস সলভ করে এবং স্টার্ট পদ্ধতিতে এটি স্টেটেক্সেপেন্ডেড অবস্থায় সেট করে।

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 খুঁজে পেয়েছি এবং নীচের শিটের অবস্থাটি এক্সপেন্ডেড হিসাবে সেট করছি ।

এটি না করে, আমার নীচের শীটটি সর্বদা আবদ্ধ অবস্থায় আটকে থাকত যদি ভিউ উচ্চতা স্ক্রিনের উচ্চতার ০.৫ এর বেশি হয় এবং আমাকে পুরো নীচের শিটটি দেখার জন্য ম্যানুয়ালি স্ক্রোল করতে হয়।

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

ইউরেজেন্টেক্স জবাবের অনুরূপ , কোটলিনে , আপনি আপনার খণ্ড শ্রেণিটি ঘোষণা করতে পারেন যা থেকে প্রসারিত হয় BottomSheetDialogFragmentএবং যখন ভিউটি তৈরি করা হয় আপনি ডায়ালগটি প্রদর্শনের পরে ডায়ালগ শ্রোতার ডিফল্ট অবস্থা সেট করতে পারেন।

STATE_COLLAPSED: নীচের শীটটি দৃশ্যমান তবে কেবল এটির উচ্চতা দেখায় showing

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 মধ্যে থেকে এসেছে?
এরিক স্মিথ

dialogক্লাসের সম্পত্তি DialogFragment, আসলে একজন গেটর ter এই উদাহরণে আমি বর্তমান ডায়ালগফ্রেগমেন্ট উদাহরণটি পেতে এবং এটি পেতে সেই গেটরটি ব্যবহার setOnShowListenerকরেছি। হতে পারে আপনি ইতিমধ্যে আপনার প্রকল্পে এই জাতীয় নির্দেশাবলী ব্যবহার করেছেন, উদাহরণস্বরূপ কোনও ক্রিয়াকলাপে, অ্যাকশন বারে প্রবেশের জন্য অ্যাক্সেস actionBarব্যবহার করা হয়, সুতরাং আপনি সেই উপাদানটি সংশোধন করতে পারেন, উদাহরণস্বরূপactionBar?.subtitle = "abcd"
এফজেসিজি

1

আমার উত্তরটি সামান্য পরিবর্তনের সাথে উপরের উত্তরগুলির সাথে কম-বেশি একই more প্রথমে নীচের শিট ভিউটি সন্ধানের জন্য 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

আমি অভ্যন্তরীণ অ্যান্ড্রয়েড আইডিগুলি ব্যবহার করতে পছন্দ করি না এবং আমি সন্ধান করেছি BottomSheetDialog getBehaviorযে আপনি ভিতরে ব্যবহার করতে পারেন এমন একটি পদ্ধতি রয়েছে :

আপনি এটি আপনার ভিতরে ব্যবহার করতে পারেন BottomSheetDialog:

behavior.state = BottomSheetBehavior.STATE_EXPANDED

BottomSheetDialogFragmentআপনি ব্যবহার করে সেই ডায়ালগফ্রেগমেন্ট থেকে ডায়ালগটি একই কাস্টিং করতে পারেন BottomSheetDialog


1

নীচে পত্রক ডায়ালগফ্রেগমেন্ট :

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

আপনার কোটলিন বটমশীট ডায়ালগফ্রেগমেন্ট শ্রেণিতে, নীচে হিসাবে ক্রেটডায়ালগ ওভাররাইড করুন

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.