web-dev-qa-db-ja.com

ボトムシート横問題

横モードでボトムシートダイアログを表示すると、間違った動作が発生します。この問題は、24。+バージョンのデザインライブラリで発生します。下の画像によると、ボトムシートは横向きでのみ正しく表示されていません。私はBottomSheetDialogクラスを使用していて、私はこのチュートリアルに従っています: http://www.skholingua.com/blog/bottom-sheet-Android 、公開したアプリで問題も発生します。

25. +バージョンをテストしましたが、問題は解決しませんでした。

ランドスケープ24、25。+ライブラリでエラー

Error In landscape

23. +ライブラリと同じ例

same example in 23.+ Library

主な活動

public class MainActivity extends AppCompatActivity {
CoordinatorLayout coordinatorLayout;
private BottomSheetBehavior<View> mBottomSheetBehavior;
private TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    coordinatorLayout = (CoordinatorLayout) findViewById(R.id.main_content);
    textView = (TextView) findViewById(R.id.textView);
    View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);

    //For your bottom sheet to be displayable, you need to create a BottomSheetBehavior.
    //This is created by getting a reference to the container view and calling BottomSheetBehavior.from() on that container.
    mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);

    mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            switch (newState) {
                case BottomSheetBehavior.STATE_DRAGGING:
                    break;
                case BottomSheetBehavior.STATE_COLLAPSED:
                    mBottomSheetBehavior.setPeekHeight(0);
                    break;
                case BottomSheetBehavior.STATE_EXPANDED:
                    break;
                case BottomSheetBehavior.STATE_HIDDEN:
                    break;
                case BottomSheetBehavior.STATE_SETTLING:
                    break;
            }
        }

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

}


public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button1:
            /**
             * For persistent bottom sheet to work, your layout should contain a coordinator layout,
             * and then in any child view of your coordinator layout, you can make it as a persistent bottom sheet
             * by adding a custom property app:layout_behavior and use behavior_peekHeight to define how much
             * of the Bottom Sheet you want visible.
             */
            textView.setText(R.string.dynamic_persistent_txt);
            mBottomSheetBehavior.setPeekHeight(300);
            mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            break;
        case R.id.button2:
            /**
             * You can also display a Dialog in place of a View in the bottom sheet.
             * To do this, get the view from getLayoutInflater and pass it setContentView of the Dialog.
             */
            View view = getLayoutInflater().inflate(R.layout.bottom_sheet_layout, null);
            TextView textView = (TextView) view.findViewById(R.id.textView);
            textView.setText(R.string.dialog_modal_txt);
            BottomSheetDialog dialog = new BottomSheetDialog(this);
            dialog.setContentView(view);
            dialog.show();
            break;
        case R.id.button3:
            /**
             * You can also display a Fragment in place of a View in the bottom sheet.
             * To do this, you class that extends BottomSheetDialogFragment.
             */
            BottomSheetDialogFragment bottomSheetDialogFragment = new BottomSheetDialogFragmentExample();
            bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag());
            break;
    }
}

activity_main.xml

<Android.support.design.widget.CoordinatorLayout     xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/main_content"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    Android:paddingTop="24dp"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <Button
        Android:id="@+id/button1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:onClick="onClick"
        Android:text="Dynamic BottomSheet" />

    <Button
        Android:id="@+id/button2"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:onClick="onClick"
        Android:text="BottomSheetDialog" />

    <Button
        Android:id="@+id/button3"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:onClick="onClick"
        Android:text="BottomSheetDialogFragment" />
</LinearLayout>

<LinearLayout
    Android:id="@+id/bottom_sheet"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:elevation="4dp"
    Android:minHeight="120dp"
    Android:orientation="vertical"
    Android:padding="@dimen/activity_vertical_margin"
    app:behavior_peekHeight="120dp"
    app:layout_behavior="Android.support.design.widget.BottomSheetBehavior">

    <include layout="@layout/bottom_sheet_layout" />

</LinearLayout>

</Android.support.design.widget.CoordinatorLayout>

bottom_sheet_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/CreamyGreen"
Android:orientation="vertical">


<TextView
    Android:id="@+id/textView"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="@string/static_persistent_txt"
    Android:padding="16dp"
    Android:textAppearance="?android:attr/textAppearanceMedium"
    Android:textColor="@Android:color/white" />

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:padding="16dp"
    Android:text="@string/ipsum"
    Android:textColor="@Android:color/white"
    Android:textSize="16sp" />
</LinearLayout>
20

これは回避策です。 (注:このコードはアクティビティ内にあります)

View sheetView;//class level variable

private void setUpBottomSheetDialog() {

    bottomSheetDialog = new BottomSheetDialog(this);

    LayoutInflater inflater = LayoutInflater.from(this);
     sheetView = inflater.inflate(R.layout.bottom_sheet_image_source, (ViewGroup) this.getWindow().getDecorView().getRootView(), false);

    bottomSheetDialog.setContentView(sheetView);

    BottomSheetBehavior mBehavior = BottomSheetBehavior.from((View) sheetView.getParent());

    bottomSheetDialog.setOnShowListener(dialogInterface -> {
        mBehavior.setPeekHeight(sheetView.getHeight());//get the height dynamically
    });
}
8
hyena

BottomSheetDialogFragmentを常に完全に展開して開く(横向きモードでも)には、次のようにします。

OnCreateDialogで、BottomSheetDialogとビューを作成します。このビューをBottomSheetDialogに追加した後、BottomSheetBehavior.from()でビューの親を使用してBottomSheetBehaviorを取得できます。

次に、BottomSheetDialogFragmentのonStartで、STATE_EXPANDEDを指定してBottomSheetBehavior.setStateを呼び出します。

BottomSheetBehavior mBottomBehavior;

public Dialog onCreateDialog(Bundle savedInstanceState) {
    BottomSheetDialog dialog = new BottomSheetDialog(getContext());
    mBinding = SomeBinding.inflate(LayoutInflater.from(getContext()));
    dialog.setContentView(mBinding.getRoot());
    mBottomBehavior = BottomSheetBehavior.from((View) mBinding.getRoot().getParent());
    return dialog;
}

public void onStart() {
    super.onStart();
    mBottomBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}

これが誰かのお役に立てば幸いです。

3
Pepijn

Googleの担当者はこれを意図したとおりに機能していると判断しました。回避策は次のとおりです

画面の高さの魔法の定数があり、これはmin(actualwidth、themewidth)を実行しているように見えます。これは明らかに電話のランドスケープではうまく機能しないため、それをより大きなものにオーバーライドします

<style name="Theme.Main.Reader">
     ...
     <item name="bottomSheetDialogTheme">@style/ReaderBottomSheelDialog</item>
</style>
<style name="ReaderBottomSheelDialog" parent="Theme.Design.BottomSheetDialog">
     <item name="bottomSheetStyle">@style/BottomSheetStyle</item>
</style>

<style name="BottomSheetStyle" parent="Widget.Design.BottomSheet.Modal">
    <item name="behavior_peekHeight">512dp</item>
</style>
3
urSus

この問題を解決するための私の個人的な選択は、onCreateViewの後、すでにBottomSheetDialogFragment

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mainLayout = inflater.inflate(R.layout.fragment_auction_bottom_sheet_dialog, container, false);
    return mainLayout;
}

そしてonStartはビューを作成した後に実行されますので、振る舞いを持つplay

@Override
public void onStart() {
    super.onStart();
    //this expands the bottom sheet even after a config change
    bottomSheetBehavior = BottomSheetBehavior.from((View) mainLayout.getParent());
    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}

次に、常にボトムシートが展開されます

1
Carlos Daniel

BottomSheetDialogダイアログ; BottomSheetBehavior bottomSheetBehavior;

private void createBottomSheet() {
    if (dialog == null){
        dialog = new BottomSheetDialog(this);

        final View view = LayoutInflater.from(this).inflate(R.layout.setting_dialog,
                (ViewGroup)this.getWindow().getDecorView().getRootView(),false);

        dialog.setContentView(view);
        bottomSheetBehavior = BottomSheetBehavior.from((View)view.getParent());
        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                bottomSheetBehavior.setPeekHeight(view.getHeight());
            }
        });
    }
}
1
Tarif Chakder