linearlayout未在onStart中初始化

时间:2014-03-27 10:00:15

标签: android

我对Android很新,所以不要马上给我开枪!

我在android中使用linearlayout绘制图形,我正在绘制图形并将其设置为线性布局中的背景图像。

linearlayout是相对布局的子元素,在布局xml中定义: relativeLayout还包含一些其他textview和edittext。

    <RelativeLayout
        android:id="@+id/rl"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
        <LinearLayout
            android:id="@+id/ll_graph"
            android:layout_width="fill_parent"
            android:layout_height="200dp"
            android:orientation="vertical"
            android:layout_below="@+id/etMemo" >
        </LinearLayout>

    </RelativeLayout>

在OnCreate中:

    ll_graph = (LinearLayout) findViewById(R.id.ll_graph);

接下来在OnStart中我想绘制图形,但此时ll_graph的宽度和高度为0,因此不显示任何内容。 如果我在表单上放置一个按钮来执行相同的代码,则宽度和高度与预期一致,并且图形将完美绘制。 我在这里缺少什么?

4 个答案:

答案 0 :(得分:0)

在onCreate()和onStart()方法中,Activity不一定可见。而是将您的绘图代码放在onwindowFocusChanged(boolean)中,因为API文档声明“这是该活动对用户是否可见的最佳指标。”

答案 1 :(得分:0)

的解决方案: -

Android将视图分为两个阶段: 测量通过 布局通行证 因此,此代码等待该阶段,并且布局布局后,它将通知您更改。

        ViewTreeObserver vto = ll_graph.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {



    ll_graph.getViewTreeObserver().removeGlobalOnLayoutListener(
                    this);
        int ll_width = ll_graph.getWidth();
                    int ll_height = ll_graph.getHeight();

        }
    });

答案 2 :(得分:0)

此时尚未衡量视图。但是当你按下按钮时,查看

为了在从View外部测量View时执行绘图,您可以将OnPreDrawListener或OnGlobalLayoutListener设置为View的ViewTreeObserver。 在活动的onCreate()上设置它。

    ll_graph.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

        @Override
        public boolean onPreDraw() {
            ll_graph.getViewTreeObserver().removeOnPreDrawListener(this);
            //do your stuff
            return true;
        }
    });

答案 3 :(得分:0)

您还可以将runnuble发布到视图的处理程序。创建视图时,将执行此runnable。

        @Override
        protected void onCreate(final Bundle b) {

        super.onCreate(b);
            ll_graph.post(new Runnable() {
                @Override
                public void run() {
                     ll_graph.setBackgroundResiurce(resId);
                }
            });
    }