我的应用中有一个自定义视图,我使用视图中的onDraw()
函数绘制。它还需要来自ACtivity的一些数据来绘制图形。因此,我没有使用标准setContentView(R.layout.myview)
,而是使用以下内容 -
MyView mv = new MyView(this, userData);
setContentView(mv);
这似乎有效,直到我在自定义视图上方添加了textview
。然后我意识到上面的代码根本没有显示textview。此外,onFinishInflate()
永远不会被调用。在这种情况下,我是否必须自己夸大布局?如果是这样,我也必须自己调用onDraw()
函数吗?
谢谢, - P
答案 0 :(得分: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
答案 1 :(得分: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);
}
}