2011-06-10 85 views
4

我在我的应用程序中使用视图中的onDraw()函数绘制自定义视图。还需要来自ACtivity的一些数据来绘制图形。因此,而不是使用标准setContentView(R.layout.myview)我使用以下 -查看通货膨胀和自定义视图

MyView mv = new MyView(this, userData); 
setContentView(mv); 

这似乎工作,直到我加入了customview上方textview。然后我意识到上面的代码根本不显示textview。 onFinishInflate()也永远不会被调用。在这种情况下,我必须自己膨胀布局吗?如果是这样,我也必须自己拨打onDraw()函数?

谢谢, - P

回答

4

你应该在这里是一个包含布局TextView和您的MyView,然后在您的活动中,找到您的自定义视图并传递您的用户数据。您的MyView可以在其onDraw()期间使用。也许是这样的:

res/layout/main.xml

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="veritcal"> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Hello World" /> 
    <my.package.MyView 
     android:id="@+id/myview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

src/my/package/MyView.java

public class MyView extends View { 
    UserData mUserData = null; 
    public void setUserData(userData) { 
     mUserData = userData; 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     performCustomDrawingWithUserData(mUserData); 
     super.onDraw(canvas); 
    } 

} 

src/my/package/MyActivity.java

public class MyActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // pass the user data into myview here. 
     MyView myView = (MyView) findViewById(R.id.myview); 
     myView.setUserData(userData); 
    } 

} 
6

onFinishInflate()

的Finalize从 XML充气的图。这被称为最后的 阶段的通货膨胀,毕竟孩子 意见已被添加。

当您创建的代码视图(new ...)你是不是夸大它......而另一方面,如果声明它在XML或者你使用类似getLayoutInflater().inflate(R.layout.your_view,null,null);那么你充气它(onFinishInflate )将被调用。

无论你如何做,onDraw方法总是会被调用;所以你不必手动调用它。

顺便说一句...将自定义视图保留在XML上总是一个好主意,即使它需要数据。所以,你至少有两个选项:

setContentView(R.layout.your_layout); 
YourCustom custom = (YourCustom)findViewById(R.id.custom); 
custom.setUserData(userData); 

或...你可以获取从自定义视图(不推荐)数据:

// inside your custom view... 
UserData userData = Someclass.getUserData(getContext()); 
// etc... so that you don't have to pass it from the activity