【问题标题】:Get root view from current activity从当前活动中获取根视图
【发布时间】:2011-05-28 00:39:41
【问题描述】:

我知道如何使用View.getRootView() 获取根视图。我还可以从按钮的onClick 事件中获取视图,其中参数是View。但是我怎样才能在activity 中获得视图

【问题讨论】:

  • 在活动中,通常您使用setContentView() 告诉它应该呈现哪个资源,并且您提供的视图已经是根。如果您需要该视图的句柄,只需在 XAML 中为其添加一个 ID,findViewById() 就可以了。
  • 我的计划是动态附加代码..所以如果我的用户使用 api 我希望它能够自动检测东西.. Boulder 的解决方案有效!
  • @xandy:一个轻微的错字:XAML -> XML。

标签: android android-activity view


【解决方案1】:

另一个 Kotlin 扩展解决方案

如果您的活动视图在 xml 中声明(例如 activity_root.xml),请打开 xml 并为根视图分配一个 id:

android:id="@+id/root_activity"

现在在您的班级中,使用以下命令导入视图:

import kotlinx.android.synthetic.main.activity_root.root_activity

您现在可以使用root_activity 作为视图。

【讨论】:

    【解决方案2】:

    对于那些使用Data Binding Library 的人,要获取当前活动的根,只需使用:

    View rootView = dataBinding.getRoot();
    

    对于 Kotlin 用户来说,它更简单:

    val rootView = dataBinding.root
    

    【讨论】:

      【解决方案3】:

      Kotlin 扩展解决方案

      使用它来简化 Activity 中的访问。那么你可以直接在Activity中引用rootView,或者在Activity之外引用activity.rootView

      val Activity.rootView get() = window.decorView.rootView
      

      如果您想为 Fragments 添加相同的内容以保持一致性,请添加:

      val Fragment.rootView get() = view?.rootView
      

      【讨论】:

        【解决方案4】:

        如果您需要活动的根视图(以便您可以在那里添加内容),请使用

        findViewById(android.R.id.content).getRootView()
        

        据报道,在某些设备上您必须使用

        getWindow().getDecorView().findViewById(android.R.id.content)
        

        改为。

        请注意,正如 Booger 报告的那样,这可能位于某些设备上的导航栏(带有后退按钮等)的后面(但在大多数设备上似乎并非如此)。

        如果您需要查看使用setContentView() 方法添加到活动中的视图,那么正如 pottedmeat 所写,您可以使用

        final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
                    .findViewById(android.R.id.content)).getChildAt(0);
        

        但最好在你的 xml 布局中将 id 设置为这个视图,然后使用这个 id。

        【讨论】:

        • 实际上只是 findViewById(android.R.id.content) 给了我根视图。如果在某些情况下不是这样,我可以从 findViewById(android.R.id.content).getRootView() 获取根视图。感谢您的回答。我在哪里可以了解有关 android.R 的更多信息?我不知道。
        • 你可以在这里查看我想developer.android.com/reference/android/R.html这只是android资源参考。我个人了解了 android.R.id.content 然后在 hierarchyviewer 中检查布局。
        • 我注意到此视图似乎包含状态栏,因此如果您正在寻找活动的可见部分,请使用@pottedmeat 的答案。
        • @Lalith,您能否详细说明何时需要执行 findViewById(android.R.id.content).getRootView()?了解一般规则会非常有用。
        • @batbrat 使用操作栏时我需要在 Android 5.0+ 中使用 .getRootView()
        【解决方案5】:

        在 Kotlin 中我们可以做得更短一些:

        val rootView = window.decorView.rootView
        

        【讨论】:

        • 它,取windows的根,如果你显示一个snack它会在导航栏中显示消息
        【解决方案6】:

        anyview.getRootView(); 将是最简单的方法。

        【讨论】:

          【解决方案7】:

          获取当前活动的视图

          在任何 onClick 中,我们将获得“View view”,通过使用 'view' 获取 rootView。

          查看视图 = view.getRootView();

          并在片段中获取视图

          视图视图 = FragmentClass.getView();

          【讨论】:

            【解决方案8】:

            从当前活动中获取根视图。

            在我们的活动中,我们可以通过以下方式获得root 视图:

            ViewGroup rootView = (ViewGroup) ((ViewGroup) this
                        .findViewById(android.R.id.content)).getChildAt(0);
            

            View rootView = getWindow().getDecorView().getRootView();
            

            【讨论】:

              【解决方案9】:

              如果你在一个activity中,假设只有一个root view,你可以这样获取。

              ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
                      .findViewById(android.R.id.content)).getChildAt(0);
              

              然后您可以将其投射到您的真实班级

              或者你可以使用

              getWindow().getDecorView();
              

              注意这将包括操作栏视图,您的视图位于操作栏视图下方

              【讨论】:

              • Activity类中没有这种方法。
              • window.decorView 或 window.decorView 作为 ViewGroup - 如果您需要将其转换为 ViewGroup
              【解决方案10】:

              万一有人需要更简单的方法:

              以下代码给出了整个活动的视图:

              View v1 = getWindow().getDecorView().getRootView();

              要在活动中获取特定视图,例如活动中的 imageView,只需添加要获取的视图的 id:

              View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1);
              

              希望这对某人有所帮助

              【讨论】:

              • 如果你想要特定的视图,你可以在活动上调用findViewById(R.id.imageView1);
              【解决方案11】:

              这是我用来获取在分配有setContentView 的 XML 文件中找到的根视图:

              final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
                          .findViewById(android.R.id.content)).getChildAt(0);
              

              【讨论】:

              • 这个答案给出了没有状态栏的视图——这就是我想要的。我正在寻找活动可见部分的像素宽度+高度。这个可行,谢谢!
              • 这不包括ActionBar!
              • 有没有办法同时包含ActionBar
              • 这里的关键词是“在 XML 文件中找到的根视图”。谢谢。
              • 这应该是正确的标记答案。这会将 Snackbar 放置在您的 Activity 中(在根目录下),这就是它应该在的位置(我很确定没有人愿意将他们的信息放在导航按钮后面)
              【解决方案12】:

              我只在 android 4.0.3 中测试过这个:

              getWindow().getDecorView().getRootView()
              

              给出相同的观点

              anyview.getRootView();
              
              com.android.internal.policy.impl.PhoneWindow$DecorView@#########
              

              getWindow().getDecorView().findViewById(android.R.id.content)
              

              给它的孩子

              android.widget.FrameLayout@#######
              

              请确认。

              【讨论】:

              • Android2.3.3好像一样
              • Works in 4.3 是我发现的最简单的方法和最少的代码。
              • 最好使用 SnackBar
              • getWindow().getDecorView().getRootView().getHeight() 返回显示高度。
              • getWindow().getDecorView().getRootView() 不推荐用于小吃店,会和系统导航栏重叠,findViewById(android.R.id.content)会更好。跨度>
              猜你喜欢
              • 2012-12-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多