Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.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_Bottom Sheet - Fatal编程技术网

Android 安卓;顶页“;相当于;底页“;?

Android 安卓;顶页“;相当于;底页“;?,android,bottom-sheet,Android,Bottom Sheet,我想实现一个“底部工作表”类型的布局,但是“底部”工作表将是一个MapFragment,这与上/下拖动视图不太一样 我有一个可能很幼稚的想法,将逻辑“翻转”到“顶层”设计,在这里,您向上/向下拖动顶层以显示更多/更少的底层MapFragment ie:从这个… …像这样的东西… 考虑到支持设计工具,这是可能的,还是我必须自己推出类似的产品?这是我在上面评论的解决方案的基础。 我稍后会回来充实一下 @Override protected void onCreate( @Null

我想实现一个“底部工作表”类型的布局,但是“底部”工作表将是一个MapFragment,这与上/下拖动视图不太一样

我有一个可能很幼稚的想法,将逻辑“翻转”到“顶层”设计,在这里,您向上/向下拖动顶层以显示更多/更少的底层MapFragment

ie:从这个…

…像这样的东西…


考虑到支持设计工具,这是可能的,还是我必须自己推出类似的产品?

这是我在上面评论的解决方案的基础。 我稍后会回来充实一下

@Override
protected void onCreate(
        @Nullable
                Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    if (isFinishing())
    {
        return;
    }


    setContentView(R.layout.activity_home);

    ...

    mGroupBottomSheetFiller = (ViewGroup) findViewById(R.id.groupBottomSheetFiller);

    final NestedScrollView bottomSheetMap = (NestedScrollView) findViewById(R.id.bottomSheetMap);
    mBottomSheetMapBehavior = BottomSheetBehavior.from(bottomSheetMap);
    mBottomSheetMapBehavior.setBottomSheetCallback(new BottomSheetCallback()
    {
        @Override
        public void onStateChanged(
                @NonNull
                        View bottomSheet,
                int newState)
        {
            //Log.e(TAG, "mBottomSheetMapBehavior.onStateChanged(bottomSheet, newState=" +
            //             bottomSheetBehaviorStateToString(newState) + ')');
            int visibility = isBottomSheetExpanded(mBottomSheetMapBehavior) ? View.VISIBLE : View.GONE;
            mImageBottomSheetMapClose.setVisibility(visibility);
        }

        @Override
        public void onSlide(
                @NonNull
                        View bottomSheet,
                float slideOffset)
        {
            //Log.e(TAG, "mBottomSheetMapBehavior.onStateChanged(bottomSheet, slideOffset=" + slideOffset + ')');
            resizeMap();
        }
    });
    bottomSheetMap.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener()
    {
        @Override
        public void onGlobalLayout()
        {
            //Log.e(TAG, "onGlobalLayout()");
            bottomSheetMap.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            resizeMap();
        }
    });

    ...
}

private void resizeMap()
{
    int screenHeightPixels = PbPlatformUtils.getScreenHeightPixels();
    //Log.e(TAG, "resizeMap: screenHeightPixels=" + screenHeightPixels);

    int[] location = new int[2];
    mGroupMap.getLocationInWindow(location);
    //Log.e(TAG, "resizeMap: getLocationInWindow=" + Arrays.toString(location));

    LayoutParams groupMapLayoutParams = mGroupMap.getLayoutParams();
    groupMapLayoutParams.height = screenHeightPixels - location[1];
    mGroupMap.requestLayout();
}

public static String bottomSheetBehaviorStateToString(int state)
{
    String s;
    switch (state)
    {
        case BottomSheetBehavior.STATE_COLLAPSED:
            s = "STATE_COLLAPSED";
            break;
        case BottomSheetBehavior.STATE_DRAGGING:
            s = "STATE_DRAGGING";
            break;
        case BottomSheetBehavior.STATE_EXPANDED:
            s = "STATE_EXPANDED";
            break;
        case BottomSheetBehavior.STATE_HIDDEN:
            s = "STATE_HIDDEN";
            break;
        case BottomSheetBehavior.STATE_SETTLING:
            s = "STATE_SETTLING";
            break;
        default:
            s = "UNKNOWN";
            break;
    }
    return s + '(' + state + ')';
}

private static boolean isBottomSheetExpanded(
        @NonNull
                BottomSheetBehavior bottomSheetBehavior)
{
    return bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED;
}

private void bottomSheetMapExpand()
{
    mGroupBottomSheetFiller.setVisibility(View.VISIBLE);
    int peekHeightPx = getResources().getDimensionPixelSize(R.dimen.home_bottom_sheet_map_peek_height);
    mBottomSheetMapBehavior.setPeekHeight(peekHeightPx);
    mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    mBottomSheetMapBehavior.setHideable(false);
}

private void bottomSheetMapCollapse()
{
    mGroupBottomSheetFiller.setVisibility(View.VISIBLE);
    int peekHeightPx = getResources().getDimensionPixelSize(R.dimen.home_bottom_sheet_map_peek_height);
    mBottomSheetMapBehavior.setPeekHeight(peekHeightPx);
    mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
    mBottomSheetMapBehavior.setHideable(false);
}

private void bottomSheetMapHide()
{
    mBottomSheetMapBehavior.setHideable(true);
    mBottomSheetMapBehavior.setPeekHeight(0);
    mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
    mGroupBottomSheetFiller.setVisibility(View.GONE);
}

我找到了一个
TopSheetBehavior
实现,并尝试使其保持最新:

事实证明,它在我的情况下非常有效。我发现许多其他
TopSheetBehavior
不完整或崩溃,但这一个没有崩溃,只需替换行为参数即可正常工作:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:behavior_hideable="true"
        app:behavior_peekHeight="56dp"
        app:layout_behavior="your.package.components.TopSheetBehavior">

        <!-- Your content goes here -->

    </LinearLayout>


我想你会报名参加大量的举重活动来完成两件事。首先,创建自定义实现。其次,确定您的实现如何与android实现冲突,并针对这些场景进行防御。我个人认为,材料设计语言已经到位,可以直观地传达用户期望与应用程序交互的方式。像这样的东西对于个人学习来说可能是很好的,但是一旦你进入市场,你需要期望每个人都不会理解如何使用你的应用程序。我最后只是添加了一个底部布局,顶部有一个工具栏,允许用户将工具栏向上拖动。诀窍是在用户拖动工具栏时调整地图的大小。如果有人感兴趣,我可以发布我的代码。我想看看@swooby,我正在尝试做一些事情similar@odiggity您可以检查我的答案,我最终使它完全按照BottomSheetBehavior工作,但是从顶部开始。您是否遇到了此解决方案的兼容性问题?如果您在playstore中有一个使用此功能的可用应用程序,那么最好查看它:)您可以在@swooby处查看我的答案,也许它更接近您要查找的内容。至少,它的行为和我想象的一样,一张表相当于一张表。看起来不错@CarlosAlbertoMartínezGadea,但我的回答中的实现符合我对现有生产应用程序的需求,所以我还没有尝试移植到你的应用程序上。如果有一天我会把你的答案作为首选答案!谢谢这是最好的方法。它工作得很顺利,很好。我能在封闭源代码项目中使用这个精确的解决方案吗?或者我应该提供一些参考资料吗?@ViktorVostrikov是的,你可以。它在Apache许可下。关于Apache许可证下代码的使用,这里您有几个问题得到了回答:@CarlosAlbertoMartínezGadea但是有人说我仍然需要以某种方式编写库的所有者。。我不知道我应该提供凭证。另外,我最近做了一个正确的行为。