视图膨胀和自定义视图

4

我在我的应用程序中有一个自定义视图,使用View中的onDraw()函数进行绘制。此外,它需要一些来自Activity的数据来绘制图形。因此,我不使用标准的setContentView(R.layout.myview),而是使用以下代码 -

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

这似乎可以正常工作,直到我在自定义视图上方添加了一个textview。然后我意识到上面的代码根本不显示textview。此外,onFinishInflate()从未被调用。这种情况下,我是否需要自己填充布局?如果是这样,我是否也需要自己调用onDraw()函数?
谢谢, - P
2个回答

6

onFinishInflate ()

完成从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

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接