5 votes

Comment ajouter une mise en page inférieure dans la boîte de dialogue modale BottomSheet ?

Je souhaite réaliser le design suivant en utilisant BottomSheetDialogFragment . Mais le problème est que la disposition du bas défile lorsque je la fais glisser. Je veux que la disposition du bas soit toujours en bas jusqu'à ce que le BottomSheetDialogFragment est rejeté.

Veuillez trouver la capture d'écran

ButtonSheetDialogFragment

Voici mon code

Mise en page de la feuille de bas de page.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <!--The main content goes over here-->
    </LinearLayout>

    <!--The footer view-->
    <LinearLayout
        android:id="@+id/footer_purchase_layout"
        android:layout_width="match_parent"
        android:layout_height="52dp"
        android:layout_gravity="bottom"
        android:orientation="horizontal"
        android:weightSum="1">

        <TextView
            android:id="@+id/txt_cancel_purchase"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5"
            android:gravity="left|center_vertical"
            android:text="CLOSE"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/txt_item_purchase_action"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5"
            android:gravity="right|center_vertical"
            android:text="ADD STICKERS"
            android:textSize="14sp" />

    </LinearLayout>
</FrameLayout>

ModalBottomSheetFragment.java

public class ModalBottomSheetFragment extends BottomSheetDialogFragment {

    public ModalBottomSheetFragment() {}

    private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {

        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                dismiss();
            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {}
    };

    @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
    @Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);

        View mContentView = View.inflate(getContext(), R.layout.bottomsheet_layout, null);
        dialog.setContentView(mContentView);
        CoordinatorLayout.LayoutParams layoutParams =
                (CoordinatorLayout.LayoutParams) ((View) mContentView.getParent()).getLayoutParams();
        CoordinatorLayout.Behavior mBehavior = layoutParams.getBehavior();
        if (mBehavior != null && mBehavior instanceof BottomSheetBehavior) {
            ((BottomSheetBehavior) mBehavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
            int height = getScreenHeight(getActivity());
            final double desiredHeight = 0.85 * height;
            mContentView.getLayoutParams().height = height;
            ((BottomSheetBehavior) mBehavior).setPeekHeight((int) desiredHeight);

        }
    }

    public static int getScreenHeight(Context ctx) {
        DisplayMetrics metrics = ctx.getResources().getDisplayMetrics();
        return metrics.heightPixels;
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Button mShowBottomSheetDialog;
    private BottomSheetDialogFragment bottomSheetDialogFragment;

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

        mShowBottomSheetDialog = (Button) findViewById(R.id.showBottomSheet);
        mShowBottomSheetDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                bottomSheetDialogFragment = new ModalBottomSheetFragment();
                bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag());
            }
        });
    }
}

0voto

Sushil Kumar Points 4456

Utiliser ce modèle au lieu de votre modèle ....

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="10"
        android:orientation="vertical">
        <!--The main content goes over here-->
    </LinearLayout>

     </ScrollView>

    <!--The footer view-->
    <LinearLayout
        android:id="@+id/footer_purchase_layout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:weightSum="1">

        <TextView
            android:id="@+id/txt_cancel_purchase"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5"
            android:gravity="left|center_vertical"
            android:text="CLOSE"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/txt_item_purchase_action"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5"
            android:gravity="right|center_vertical"
            android:text="ADD STICKERS"
            android:textSize="14sp" />

    </LinearLayout>
    </LinearLayout>
</FrameLayout>

Note:- Le poids divise votre mise en page en différentes vues qui sont constantes dans votre mise en page ......

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X