我知道如何使用 View.getRootView() 获取根视图。我还可以从参数为 View 的按钮的 onClick
事件中获取视图。但是我怎样才能在 activity 中获得 view?
setContentView()
告诉它应该呈现哪个资源,并且您提供的视图已经是根。如果您需要该视图的句柄,只需在 XAML 中为其添加一个 ID,findViewById()
就可以了。
如果您需要活动的根视图(以便您可以在那里添加内容),请使用
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 代替。
这是我用来获取分配给 setContentView
的 XML 文件中的根视图的方法:
final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
ActionBar
?
我在 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@#######
请确认。
从当前活动中获取根视图。
在我们的活动中,我们可以获得 root
视图:
ViewGroup rootView = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
或者
View rootView = getWindow().getDecorView().getRootView();
在 Kotlin 中,我们可以做得更短一些:
val rootView = window.decorView.rootView
以防万一有人需要更简单的方法:
下面的代码给出了整个活动的视图:
View v1 = getWindow().getDecorView().getRootView();
要在活动中获取特定视图,例如活动中的 imageView,只需添加要获取的视图的 id:
View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1);
希望这可以帮助某人
findViewById(R.id.imageView1);
。
Kotlin 扩展解决方案
使用它来简化 Activity 中的访问。然后您可以直接从 Activity 中引用 rootView
,或者在它之外引用 activity.rootView
:
val Activity.rootView get() = window.decorView.rootView
如果您想为 Fragments 添加相同的内容以保持一致性,请添加:
val Fragment.rootView get() = view?.rootView
对于使用 Data Binding Library 的人,要获取当前活动的根,只需使用:
View rootView = dataBinding.getRoot();
对于 Kotlin 用户来说,它甚至更简单:
val rootView = dataBinding.root
anyview.getRootView();
将是最简单的方法。
获取当前活动的视图
在任何 onClick 中,我们将获得“视图视图”,通过使用“视图”获取 rootView。
视图视图 = view.getRootView();
并在片段中获取视图
视图视图 = FragmentClass.getView();
另一个 Kotlin 扩展解决方案
如果您的活动视图在 xml 中声明(例如 activity_root.xml
),请打开 xml 并为根视图分配一个 id:
android:id="@+id/root_activity"
现在在您的班级中,使用以下命令导入视图:
import kotlinx.android.synthetic.main.activity_root.root_activity
您现在可以使用 root_activity
作为视图。
如果你在一个活动中,假设只有一个根视图,你可以像这样得到它。
ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
然后你可以把它投射到你真正的班级
或者你可以使用
getWindow().getDecorView();
请注意,这将包括操作栏视图,您的视图位于操作栏视图下方
Activity
类中没有这样的方法。