【发布时间】:2020-01-30 09:50:28
【问题描述】:
我有一个片段,当通过 XML 添加时,
<fragment
class="my.fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="config" />
它已成功添加到视图中,我可以与之交互。 但是,当我尝试以编程方式添加它时,在滚动视图中,作为第二个孩子:
val layout = FrameLayout(this)
val params = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)
layout.layoutParams = params
layout.id = View.generateViewId()
scrollview_container.addView(layout, params)
val f2 = MyFragment.newInstance(Gson().toJson(asset))
val trans = supportFragmentManager.beginTransaction()
trans.add(layout.id, f2, "config")
trans.addToBackStack(null)
trans.commit()
我收到以下错误(对不起,它很长)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: my.process, PID: 4950
java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.view.ViewGroup$MarginLayoutParams
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6819)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:24530)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24530)
at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1414)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.widget.ScrollView.onMeasure(ScrollView.java:452)
at android.view.View.measure(View.java:24530)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:735)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481)
at android.view.View.measure(View.java:24530)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:24530)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24530)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:24530)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24530)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:742)
at android.view.View.measure(View.java:24530)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3006)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1833)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2122)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1721)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7598)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966)
at android.view.Choreographer.doCallbacks(Choreographer.java:790)
at android.view.Choreographer.doFrame(Choreographer.java:725)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
此堆栈跟踪中没有应用程序代码,只有 Android SDK 调用。我也尝试将我的片段添加到 NavHostFragment 中,但我仍然遇到同样的错误。
有什么想法吗? 提前致谢!
【问题讨论】:
-
ViewGroup.MarginLayoutParams是预期的。我什至等了一会儿才按下“关闭”按钮。 -
@MartinZeitler 很好,你已经等了,但除了我的问题与边距无关,使用 val params = ViewGroup.MarginLayoutParams(ViewGroup.MarginLayoutParams.MATCH_PARENT, ViewGroup.MarginLayoutParams.MATCH_PARENT)似乎不起作用。所以,请尝试以明智和完整的方式回答。
-
这个问题通常有点不清楚,因为不知道
scrollview_container是什么......似乎你在ScrollView上设置FrameLayout.LayoutParams(预计@987654331 @ 作为第二个参数),而不是在FrameLayout上设置它们。 -
然后首先要求澄清。 scrollview_container 是滚动视图的唯一子项。它是一个LinearLayout,其中添加了我创建的FrameLayout。然后在 FrameLayout 中尝试添加片段。
-
请先阅读How to create a Minimal, Reproducible Example,然后再尝试教育我。一旦你有了这样一个(注意edit 按钮),你最终仍然可以重新打开这个问题。