Android 视图和自定义视图

Android 视图和自定义视图,android,android-layout,Android,Android Layout,我的应用程序中有一个自定义视图,我使用视图中的onDraw()函数绘制该视图。此外,还需要活动中的一些数据来绘制图形。因此,我没有使用标准的setContentView(R.layout.myview) MyView mv = new MyView(this, userData); setContentView(mv); 在我在customview上面添加了一个textview之前,这似乎是可行的。然后我意识到上面的代码根本不显示textview。另外,永远不会调用onfinish充气()。在

我的应用程序中有一个自定义视图,我使用视图中的
onDraw()
函数绘制该视图。此外,还需要活动中的一些数据来绘制图形。因此,我没有使用标准的
setContentView(R.layout.myview)

MyView mv = new MyView(this, userData);
setContentView(mv);
在我在customview上面添加了一个
textview
之前,这似乎是可行的。然后我意识到上面的代码根本不显示textview。另外,永远不会调用
onfinish充气()。在这种情况下,我必须自己给布局充气吗?如果是这样,我是否也必须自己调用
onDraw()
函数

谢谢, -P

onfinish充气()

最终确定从中展开视图 XML。这被称为最后一次 毕竟是通货膨胀的阶段 添加了视图

当您通过代码(
新建…
)创建视图时,您并没有将其膨胀。。。另一方面,如果您在XML中声明它,或者使用类似
getLayoutInflater().inflate(R.layout.your_视图,null,null)的东西然后您正在对其进行充气(并且将调用
onFinishInflate

无论您如何操作,都将始终调用
onDraw
方法;因此,您不必手动调用它

顺便说一下。。。将自定义视图保留在XML上总是一个好主意,即使它需要数据。因此,您至少有两种选择:

setContentView(R.layout.your_layout);
YourCustom custom = (YourCustom)findViewById(R.id.custom);
custom.setUserData(userData);
或者。。。您可以从自定义视图获取该数据(不推荐):


这里应该有一个包含
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/MyActivity.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);
    }

}
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);
    }

}
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);
    }

}