【问题标题】:Check ownership of android.view.View检查 android.view.View 的所有权
【发布时间】:2013-07-24 11:20:55
【问题描述】:
有没有办法检查某个视图(例如按钮等)是否属于片段? View.getContext() 为我提供活动,片段没有自己的上下文。但是,我需要某种解决方法来确定按钮是否是片段的一部分并检索片段名称或类或其他任何内容。
用例:View.OnClickListener 为我提供了onClick(View view) 中的视图。现在我可以找到关于这个视图对象的几乎所有内容:它的类型(例如按钮)、它的资源 id,甚至它来自 XML 文件的资源名称都可以使用活动上下文来解析。但是,无法确定视图是片段的一部分还是直接位于 Activity 内部。
【问题讨论】:
标签:
android
android-layout
android-fragments
android-view
【解决方案1】:
我可以想到两种方法:
作为先决条件,您需要能够遍历屏幕上可见的片段列表(即该视图可能是其子视图的候选者)。然后你可以:
-
重复调用View.getParent(),直到返回的视图是您正在检查的片段的根视图,或者您到达视图层次结构的顶部。例如
boolean isViewPartOfFragment(View view, Fragment fragment) {
View fragmentRootView = fragment.getView();
while (view != null) {
if (view == fragmentRootView) {
return true;
}
view = (View) view.getParent();
}
return false;
}
-
或者,对于每个片段,您可以在根视图上调用 findViewById() 或 findViewByTag() 以查看该视图是否是其视图层次结构的一部分(尽管这些执行树搜索可能会产生较慢的方法) .例如
boolean isViewPartOfFragment2(View view, Fragment fragment) {
Object tag = new Object();
view.setTag(tag); // careful, will overwrite any existing tag!
View foundView = fragment.getView().findViewByTag(tag);
return (view == foundView);
}
尽管对此进行了更多思考,但您使用其中一种方法这一事实表明,可能有一种更简单的方法可以实现您的最终目标。你在哪里设置视图的OnClickListener?您是否可以在拥有视图的片段内设置侦听器,从而通过引用直接可用的片段来调用?