【问题标题】:Android, Can add Fragment in XML, but not via Code [duplicate]Android,可以在 XML 中添加片段,但不能通过代码 [重复]
【发布时间】: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 按钮),你最终仍然可以重新打开这个问题。

标签: android xml fragment


【解决方案1】:

尝试在您的代码中更改以下行:

val params = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)

收件人:

val params = ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT, ScrollView.LayoutParams.MATCH_PARENT);

【讨论】:

    【解决方案2】:

    您的 Fragment 似乎已经有布局参数。除了更改它们,您应该像这样修改现有参数。

        ViewGroup.LayoutParams params = yourfragment.getView().getLayoutParams();
        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
        params.height = ViewGroup.LayoutParams.MATCH_PARENT;
        contactsFragment.getView().requestLayout();
    

    答案是 java 语言,但你会从这里得到概念。

    【讨论】:

      猜你喜欢
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多