Android 调整主布局内容的大小以适应底部图纸?
我正在尝试创建一个布局,其中包含一个持久的底部工作表和一个嵌套的ScrollView,以提供主要内容。不幸的是,当底部工作表展开时,它会遮挡NestedScrollView,并且它的底部项目无法访问 调整主嵌套滚动条大小以适应展开的底部工作表的最佳方法是什么 例如: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
<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;
}
我知道这个解释有点长,但我希望能有所帮助。您找到解决问题的方法了吗?