Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 调整主布局内容的大小以适应底部图纸?_Android_Android Layout_Android Coordinatorlayout_Bottom Sheet - Fatal编程技术网

Android 调整主布局内容的大小以适应底部图纸?

Android 调整主布局内容的大小以适应底部图纸?,android,android-layout,android-coordinatorlayout,bottom-sheet,Android,Android Layout,Android Coordinatorlayout,Bottom Sheet,我正在尝试创建一个布局,其中包含一个持久的底部工作表和一个嵌套的ScrollView,以提供主要内容。不幸的是,当底部工作表展开时,它会遮挡NestedScrollView,并且它的底部项目无法访问 调整主嵌套滚动条大小以适应展开的底部工作表的最佳方法是什么 例如: <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_heigh

我正在尝试创建一个布局,其中包含一个持久的底部工作表和一个嵌套的ScrollView,以提供主要内容。不幸的是,当底部工作表展开时,它会遮挡NestedScrollView,并且它的底部项目无法访问

调整主嵌套滚动条大小以适应展开的底部工作表的最佳方法是什么

例如:

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

    <!-- I want this view resized dependent on bottom sheet expansion -->
    <android.support.v4.widget.NestedScrollView
        android:id="@+id/layout_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

       <!-- content goes here -->

    </android.support.v4.widget.NestedScrollView>

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/layout_bottomsheet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

        <!-- bottom sheet content goes here -->

    </android.support.v4.widget.NestedScrollView>

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

有一种方法可以获得所需的信息,避免遮住底部纸张后面的视图并处理其接触

您需要扩展
BottomSheetDialogFragment

public class MyBottomSheetDialogFragment extends BottomSheetDialogFragment {

    @Override
    public void onStart() {
        super.onStart();
        if(getDialog() != null && getDialog().getWindow() != null) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    }
在onStart()中,您可以删除背景暗显,以便清除背景视图

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View rootView = View.inflate(getContext(), R.layout.your_bottom_sheet_layout, null);
    dialog.setContentView(rootView);
    dialog.setCanceledOnTouchOutside(false);
    // set your children views

    dialog.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialogInterface) {
            // Do stuff when the dialog is visible on screen
            Window window = getDialog().getWindow();
            if(window != null) {
                window.setCallback(windowCallback);
            }
        }
    });
}
在setupDialog()中,通过设置如下窗口回调,使布局膨胀,并避免在外部触摸时关闭对话框:

private Window.Callback windowCallback = new Window.Callback() {

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            onBackPressed();
        }
        return false;
    }

    @Override
    public boolean dispatchKeyShortcutEvent(KeyEvent event) {
        return false;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        return onDispatchTouchEvent(event);
    }

    @Override
    public boolean dispatchTrackballEvent(MotionEvent event) {
        return false;
    }

    @Override
    public boolean dispatchGenericMotionEvent(MotionEvent event) {
        return false;
    }

    @Override
    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
        return false;
    }

    @Nullable
    @Override
    public View onCreatePanelView(int featureId) {
        return null;
    }

    @Override
    public boolean onCreatePanelMenu(int featureId, Menu menu) {
        return false;
    }

    @Override
    public boolean onPreparePanel(int featureId, View view, Menu menu) {
        return false;
    }

    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {
        return false;
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        return false;
    }

    @Override
    public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) {

    }

    @Override
    public void onContentChanged() {

    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {

    }

    @Override
    public void onAttachedToWindow() {

    }

    @Override
    public void onDetachedFromWindow() {

    }

    @Override
    public void onPanelClosed(int featureId, Menu menu) {

    }

    @Override
    public boolean onSearchRequested() {
        return false;
    }

    @Override
    public boolean onSearchRequested(SearchEvent searchEvent) {
        return false;
    }

    @Nullable
    @Override
    public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {
        return null;
    }

    @Nullable
    @Override
    public ActionMode onWindowStartingActionMode(ActionMode.Callback callback, int type) {
        return null;
    }

    @Override
    public void onActionModeStarted(ActionMode mode) {

    }

    @Override
    public void onActionModeFinished(ActionMode mode) {

    }
};
通过设置此回调,您需要管理每一次触摸。这有点棘手,但你可以获得目标。 onDispatchTouchEvent(事件)必须如下所示:

@Override
protected boolean onDispatchTouchEvent(MotionEvent event) {

    // check if the dialog is being touched
    float eventX = event.getRawX();
    float eventY = event.getRawY();
    int location[] = new int[2];
    yourDialogRootView.getLocationOnScreen(location);
    boolean isDialogBeingTouched = eventX > (location[0] - leftPaddingX)
            && eventX < (location[0] + view.getWidth())
            && eventY > (location[1])
            && eventY < (location[1] + view.getHeight());

    if (isDialogBeingTouched) {
        checkForAClick(event);
    }

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (isDialogBeingTouched) {
                // the dialog is touched so handle its touch
                return true;
            }
    }

    // dialog not touched so let the activity handle the touch normally
    return getActivity().dispatchTouchEvent(event);
}
protected boolean checkForAClick(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            startX = event.getX();
            startY = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            float endX = event.getX();
            float endY = event.getY();
            if (isAClick(startX, endX, startY, endY)) {
                // handle click on your dialog as you prefer
                onBottomSheetClick(event);
            }
            break;
    }
    return false;
}

private static int CLICK_ACTION_THRESHOLD = 50;

public boolean isAClick(float startX, float endX, float startY, float endY) {
    float differenceX = Math.abs(startX - endX);
    float differenceY = Math.abs(startY - endY);
    if (differenceX > CLICK_ACTION_THRESHOLD || differenceY > CLICK_ACTION_THRESHOLD) {
        return false;
    }
    return true;
}

我知道这个解释有点长,但我希望能有所帮助。

您找到解决问题的方法了吗?