3

我制作了一个名为 ActionButton 的自定义按钮,我正在尝试引用并行视图层次结构中的另一个视图。我想过使用findViewById(int id),但我一直在使用NullPointerExceptions,所以我尝试通过 RootView 获取引用getRootView(),并从那里获取视图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返回视图本身,或者能给我一个提示,我将如何以其他方式引用它,我将不胜感激。

4

3 回答 3

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 不为空)并且它没有父级或父级不是 View 实例的情况. 此致。

于 2012-06-14T13:34:50.123 回答
0

getRootView() 返回自身,因为在 ActionButton 完成 iflating 时它的父级没有。我的意思是,当您调用 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();
于 2013-04-20T09:10:31.653 回答
0

尝试调用getParent()ViewGroup ,并在需要时将结果转换为。getChildCount()然后,您可以使用和访问其他子视图getChildAt()

于 2012-05-29T15:41:21.583 回答