我有一个名为ActionButton的自定义Button,我正在尝试引用另一个位于并行视图层次结构中的视图。我考虑过使用findViewById(int id)
,但我一直收到NullPointerExceptions
,所以我尝试通过getRootView()
引用RootView,然后从那里获得findViewById(int id)
的视图。问题是现在getRootView
而不是返回布局或null,它返回调用该方法的ActionButton。
这是我的ActionButton,我试图获得参考:
public class ActionButton extends Button {
protected void onFinishInflate(){
super.onFinishInflate();
log(getRootView() == this) //true, what I don't understand...
ConnectionLayer connectionLayer = (ConnectionLayer) findViewById(R.id.connection_layer); //Returns null...
}
}
概述我的layout.xml文件:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
(much more xml elements)
<com.cae.design.reaction.ui.ActionButton
android:id="@+id/actionButton"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_gravity="center_vertical" />
</LinearLayout>
<com.cae.design.reaction.ui.ConnectionLayer
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/connection_layer"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.cae.design.reaction.ui.ConnectionLayer>
</FrameLayout>
如果您能向我解释为什么getRootView
会返回视图本身,或者可以提示我如何以其他方式引用它,我将非常感激。
答案 0 :(得分:2)
如果您要查看getRootView方法的源代码:
public View getRootView() {
if (mAttachInfo != null) {
final View v = mAttachInfo.mRootView;
if (v != null) {
return v;
}
}
View parent = this;
while (parent.mParent != null && parent.mParent instanceof View) {
parent = (View) parent.mParent;
}
return parent;
}
你会看到,如果视图没有附加到视图层次结构(并且mAttachInfo.mRootView不为null)并且它没有父项或者父项不是,那么此方法返回自身的唯一情况就是这种情况一个View实例。 最好的问候。
答案 1 :(得分:0)
尝试调用getParent(),然后根据需要将结果转换为ViewGroup
。然后,您可以使用getChildCount()
和getChildAt()
访问其他子视图。
答案 2 :(得分:0)
getRootView()返回自身,因为在ActionButton完成iflate时它的父节点没有。我的意思是当你调用getRootView()时,ActionButton没有连接到LinearLayout。我需要根视图时这样做:
new Thread(new Runnable() {
@Override
public void run()
{
// wait until LinearLayout will finish inflating and this
// view will be connected to it
while(getRootView() == this) {}
// do your buisness now
}
}).start();