如何使视图可拖动,直到它变为全高,然后使其可滚动?

时间:2016-03-03 02:32:13

标签: java android

所以我有点困境。我创建了一个功能类似于底页的活动。我的许多用户要求的一个功能是能够在底部工作表完全展开后制作它,然后工作表将滚动,以便他们可以查看其余项目。我尝试将我的线性布局放在nestedscrollview中,但这只会导致崩溃。请不要建议我使用支持底层表,因为它没有我需要的所有工作。提前谢谢!

这是底部工作表的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/totalScreen"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignTop="@+id/fab"
    android:layout_gravity="bottom|center"
    android:gravity="bottom|center_vertical"
    android:orientation="vertical">

    <TextView
        android:id="@+id/sheetTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#424242"
        android:padding="12dp"
        android:text="Dummy Title"
        android:textSize="18sp" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignTop="@+id/sheetTitle"
        android:layout_marginEnd="20dp"
        android:layout_marginTop="-28dp"
        android:visibility="invisible"
        app:fabSize="normal" />

    <LinearLayout
        android:id="@+id/sheetScreen"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/sheetTitle"
        android:background="#424242"
        android:gravity="bottom|center_vertical"
        android:orientation="vertical"
        android:paddingBottom="8dp">

    </LinearLayout>

</RelativeLayout>

这是ontouch侦听器,它允许底部表单行为:

ID: 
protected LinearLayout main;
protected RelativeLayout full;

protected void setAdjustableTouchListener() {
        full.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        mDragStartY = event.getY();
                        mPointerOffset = event.getRawY() + main.getMeasuredHeight();
                        return true;
                    case MotionEvent.ACTION_UP:                        DisplayMetrics metrics = new DisplayMetrics();
                        getWindowManager().getDefaultDisplay().getMetrics(metrics);
                        int sheetHeight = (int) (metrics.heightPixels - event.getY());
                        if (mDragStartY < (event.getY() + TAP_DRIFT_TOLERANCE) && mDragStartY > (event.getY() - TAP_DRIFT_TOLERANCE)
                                && ((SystemClock.elapsedRealtime() - mDraggingStarted) < SINGLE_TAP_MAX_TIME)
                                && sheetHeight > (main.getMeasuredHeight() + findViewById(R.id.sheetTitle).getMeasuredHeight())) {
                            result = "Dismissed";
                            finish();
                        } else {
                            if (main.getMeasuredHeight() > (viewConversion + heightDifference)) {
                                ResizeAnimation a = new ResizeAnimation(main);
                                a.setDuration(500);
                                a.setParams(main.getMeasuredHeight(), extendedViewHeight);
                                main.startAnimation(a);
                                state = 2;
                            } else if (main.getMeasuredHeight() < (viewConversion + heightDifference)
                                    && main.getMeasuredHeight() > viewConversion) {
                                ResizeAnimation a = new ResizeAnimation(main);
                                a.setDuration(500);
                                a.setParams(main.getMeasuredHeight(), viewConversion);
                                main.startAnimation(a);
                                state = 1;
                            } else if (main.getMeasuredHeight() < viewConversion && main.getMeasuredHeight() > (viewConversion / 2)) {
                                ResizeAnimation a = new ResizeAnimation(main);
                                a.setDuration(500);
                                a.setParams(main.getMeasuredHeight(), viewConversion);
                                main.startAnimation(a);
                                state = 1;
                            } else if (main.getMeasuredHeight() < (viewConversion / 2)) {
                                result = "Dismissed";
                                finish();
                            }
                        }
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        if (mPointerOffset - event.getRawY() < extendedViewHeight)
                            setPrimaryContentHeight((int) (mPointerOffset - event.getRawY()));
                        return true;
                    default:
                        return true;
                }
            }
        });
    }

以下是实际设置工作表新高度的方法:

protected boolean setPrimaryContentHeight(int newHeight) {
    // the new primary content height should not be less than 0 to make the
    // handler always visible
    newHeight = Math.max(0, newHeight);
    // the new primary content height should not be more than the SplitView
    // height minus handler height to make the handler always visible
    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) main.getLayoutParams();
    if (newHeight >= 0) {
        params.height = newHeight;
        // set the primary content parameter to do not stretch anymore and
        // use the height specified in the layout params
    }
    main.setLayoutParams(params);
    return true;
}

以下是使用NestedScrollView时发生的崩溃:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nick.mowen.sceneplugin/com.nick.mowen.sceneplugin.ui.BottomSheetActivity}: android.view.InflateException: Binary XML file line #32: Binary XML file line #32: Error inflating class android.support.v4.widget.NestedScrollView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5466)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.view.InflateException: Binary XML file line #32: Binary XML file line #32: Error inflating class android.support.v4.widget.NestedScrollView
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at com.nick.mowen.sceneplugin.ui.BottomSheetActivity.onCreate(BottomSheetActivity.java:37)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5466) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: android.view.InflateException: Binary XML file line #32: Error inflating class android.support.v4.widget.NestedScrollView
at android.view.LayoutInflater.createView(LayoutInflater.java:645)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129) 
at com.nick.mowen.sceneplugin.ui.BottomSheetActivity.onCreate(BottomSheetActivity.java:37) 
at android.app.Activity.performCreate(Activity.java:6251) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5466) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance(Native Method)
at android.view.LayoutInflater.createView(LayoutInflater.java:619)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129) 
at com.nick.mowen.sceneplugin.ui.BottomSheetActivity.onCreate(BottomSheetActivity.java:37) 
at android.app.Activity.performCreate(Activity.java:6251) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5466) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.view.NestedScrollingChildHelper.setNestedScrollingEnabled(boolean)' on a null object reference
at android.support.v4.widget.NestedScrollView.setNestedScrollingEnabled(NestedScrollView.java:212)
at android.view.View.<init>(View.java:4256)
at android.view.ViewGroup.<init>(ViewGroup.java:573)
at android.widget.FrameLayout.<init>(FrameLayout.java:97)
at android.widget.FrameLayout.<init>(FrameLayout.java:92)
at android.support.v4.widget.NestedScrollView.<init>(NestedScrollView.java:189)
at android.support.v4.widget.NestedScrollView.<init>(NestedScrollView.java:185)
at java.lang.reflect.Constructor.newInstance(Native Method) 
at android.view.LayoutInflater.createView(LayoutInflater.java:619) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129) 
at com.nick.mowen.sceneplugin.ui.BottomSheetActivity.onCreate(BottomSheetActivity.java:37) 
at android.app.Activity.performCreate(Activity.java:6251) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5466) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

1 个答案:

答案 0 :(得分:0)

好的,解决了这个问题,我最后做的只是添加一个recyclerview代替linearlayout。然后我只是重写了LayoutManager,因此当我将它设置为:

时它只能滚动
main.setLayoutManager(new LinearLayoutManager(this) {
            @Override
            public boolean canScrollVertically() {
                return canScroll && super.canScrollVertically();
            }
        });