【问题标题】:How can I dynamically add Views that use XML Layouts to the ContentView?如何将使用 XML 布局的视图动态添加到 ContentView?
【发布时间】:2012-11-15 16:40:06
【问题描述】:

在我的主 Activity 中,我创建了一个带有子视图的 FrameLayout,并将其设置为 ContentView。现在,留在同一个 Activity 中,在 onCreate() 完全执行之后,我需要能够从 FrameLayout 中动态添加和删除子视图。我通过使用 Handler 来暂停主线程,然后根据需要添加或删除子视图来实现这一点。

当我处理我以编程方式创建的视图时,这一切都很好,但是当我尝试对使用 XML 布局的视图做同样的事情时,我从我试图添加的 ViewGroup 中得到一个空指针异常到 FrameLayout。

在不使用 Fragments 的情况下,我可以使用哪些具体步骤来实现这一目标?

如果有些人不明白我在问什么,我可以详细说明。如果有帮助,我可以提供代码块,但我认为大多数人都会从我的简短解释中了解我正在做的事情的要点。我只是在寻找能指引我正确方向的人。

这是引发异常的 LogCat 块:

11-15 13:40:42.977: E/AndroidRuntime(14956): FATAL EXCEPTION: main
11-15 13:40:42.977: E/AndroidRuntime(14956): java.lang.NullPointerException
11-15 13:40:42.977: E/AndroidRuntime(14956):    at android.view.ViewGroup.addView(ViewGroup.java:1821)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at android.view.ViewGroup.addView(ViewGroup.java:1808)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at com.beastcodes.framework.impl.AndroidGame.addScreenFragment(AndroidGame.java:207)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at com.beastcodes.framework.impl.AndroidGame.addAllScreenFragments(AndroidGame.java:213)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at com.beastcodes.framework.impl.AndroidGame.access$2(AndroidGame.java:211)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at com.beastcodes.framework.impl.AndroidGame$3.run(AndroidGame.java:61)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at android.os.Handler.handleCallback(Handler.java:587)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at android.os.Looper.loop(Looper.java:130)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at android.app.ActivityThread.main(ActivityThread.java:3691)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at java.lang.reflect.Method.invokeNative(Native Method)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at java.lang.reflect.Method.invoke(Method.java:507)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
11-15 13:40:42.977: E/AndroidRuntime(14956):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 请发布来自 logcat 的异常堆栈跟踪。而I achieved this by using a Handler to pause the main Thread 既不必要又可能有害。我认为 Android 应该让你必须经历巨大的障碍才能在 UI 线程中使用 sleep()。
  • 当我回到我的系统时,我将发布 LogCat,但它只是说我试图添加到 FrameLayout 的 ViewGroup 为空。另外,我不明白使用 Handler 来实现这一点的潜在危害?实际上,我的印象是,这是在不切换到新活动的情况下进行此操作的唯一方法。我怎么能在一个单独的线程中创建一个视图,然后将它加载到主线程的 ContentView 中,以便显示新的视图?
  • 您只需添加子视图然后 invalidate() 父视图。
  • 这是有害的,因为它会阻止您的活动响应 Android,并可能导致 ANR、应用程序无响应、错误。这对用户体验也很不利。但我们将等待编辑并查看。
  • 我在编辑中添加了 LogCat,但 taht katzoft 给出的答案是我的问题的解决方案。在将布局添加到 FrameLayout 之前,我没有正确地膨胀布局。我理解您关于调用 invalidate() 的建议,但这只有在 UI 线程中执行工作时才可行。我尝试添加的视图是由另一个线程创建的,并且根据 Android 文档,该视图只能通过使用处理程序添加 UI 线程。

标签: android view android-framelayout


【解决方案1】:

在将视图添加到 FrameLayout 之前,您必须使用 LayoutInflater 从 XML 中膨胀视图。

【讨论】:

  • 谢谢,这正是我们所需要的。我误解了 LayoutInflater 的目的,但这正是我所缺少的。现在一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2012-05-26
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2021-03-28
  • 2012-07-09
相关资源
最近更新 更多