繁体   English   中英

查看通货膨胀和自定义视图

[英]View Inflation and custom views

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

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

在我在 customview 上方添加textview之前,这似乎有效。 然后我意识到上面的代码根本没有显示 textview。 也永远不会调用onFinishInflate() 在这种情况下,我是否必须自己膨胀布局? 如果是这样,我也必须自己调用onDraw() function 吗?

谢谢,-P

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

您应该在这里拥有一个包含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);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM