查看getRootView返回自身

时间:2012-05-29 15:03:26

标签: android android-layout

我有一个名为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会返回视图本身,或者可以提示我如何以其他方式引用它,我将非常感激。

3 个答案:

答案 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();