ScrollView.layoutParam возвращает Framelayout.layoutParam - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь динамически установить поле для представления с прокруткой. Удивительно, но мой код возвращает FrameLayout.layoutParam вместо ScrollView.LayoutParam, вот мой код, который вызывает исключение приведения класса

ScrollView.LayoutParams scrollViewParam = new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT, ScrollView.LayoutParams.MATCH_PARENT);
            scrollViewParam.setMargins(0, 0, 0, 500);
            scrollView.setLayoutParams(scrollViewParam);

вот трассировка стека

java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.constraint.ConstraintLayout$LayoutParams
        at android.support.constraint.ConstraintLayout.getViewWidget(ConstraintLayout.java:877)
        at android.support.constraint.ConstraintLayout.setChildrenConstraints(ConstraintLayout.java:643)
        at android.support.constraint.ConstraintLayout.updateHierarchy(ConstraintLayout.java:631)
        at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:971)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:141)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:724)
        at android.view.View.measure(View.java:22071)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2422)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1504)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1761)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
        at android.view.Choreographer.doCallbacks(Choreographer.java:723)
        at android.view.Choreographer.doFrame(Choreographer.java:658)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Итак, что не так с моим кодом?

1 Ответ

0 голосов
/ 04 декабря 2018

Каждое представление имеет параметры макета, связанные с его родительской ViewGroup.

В вашем случае ваш ScrollView должен находиться внутри ConstraintLayout (или его подкласса).Поэтому, когда вы попытаетесь установить его параметры макета, он будет расширять экземпляр ConstraintLayout.LayoutParams.

Измените код с помощью этого, и он должен работать просто отлично:

ConstraintLayout.LayoutParams scrollViewParam = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT);
            scrollViewParam.setMargins(0, 0, 0, 500);
            scrollView.setLayoutParams(scrollViewParam);
...