说我有这个课程MyView
:
public class MyView extends GLSurfaceView {
private MyRenderer mRenderer;
public MyView(Context ctx, AttributeSet attrs) {
super(ctx, attrs);
init(ctx);
}
private void init(Context ctx) {
mRenderer = new MyRenderer(ctx);
setRenderer(mRenderer);
}
@Override
public void setBackground(Drawable background) {
mRenderer.setBackground(background);
}
}
MyActivity
像这样膨胀:
public class MyActivity extends Activity {
private MyView mView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
protected void init() {
setContentView(R.layout.my_layout);
mView = (MyView) findViewById(R.id.my_view);
}
}
据我所知,setBackground
中的setContentView
会在init
中调用MyView
之前调用mRenderer
,因此<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/background" >
<com.developer.app.MyView
android:id="@+id/my_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/background"
/>
<TextView
android:id="@+id/left_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:background="@drawable/left_arrow"
/>
<TextView
android:id="@+id/right_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="@drawable/right_arrow"
/>
<TextView
android:id="@+id/home_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:background="@drawable/home"
/>
</RelativeLayout>
尚未初始化。
它似乎是一个捕获22,因为视图的属性不能在没有视图初始化的情况下设置,这在设置属性后会发生。
这是布局:
<html>
<body>
<div id="BodyWrapper">
<h1> This is an HTML Page </h1>
</div><!-- End BodyWrapper -->
</body>
</html>
答案 0 :(得分:1)
我从你的问题中理解了什么。您需要oncreate()中的视图属性。但无法这样做。原因是此时UI尚未初始化。有工作。 这个链接可能有所帮助。
答案 1 :(得分:1)
你是对的。如果解析了setBackground()
属性,则会从View
的构造函数调用android:background
。在你的情况下,它在这里调用:
super(ctx, attrs);
如果您想将背景设置为mRenderer
,可以在init
中执行此操作:
private void init(Context ctx) {
mRenderer = new MyRenderer(ctx);
setRenderer(mRenderer);
final Drawable background = getBackground();
if (background != null) {
mRenderer.setBackground(background);
}
}
并在setBackground
中添加一个空检查,因为可以从超类&#39;中调用此方法。在将某个值设置为mRenderer
@Override
public void setBackground(Drawable background) {
if (mRenderer != null) {
mRenderer.setBackground(background);
}
}
答案 2 :(得分:0)
你初始化了它的三个函数,例如xml和java正如你所做的那样。
public class MyEditText extends EditText {
public MyEditText(Context context) {
super(context);
this.setTextColor(Color.parseColor("#4789da"));
this.setBackgroundResource(R.drawable.edittext_back);
this.setTextSize(18);
this.setPadding(5,5,5,5);
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.setTextColor(Color.parseColor("#4789da"));
this.setBackgroundResource(R.drawable.edittext_back);
this.setTextSize(18);
this.setPadding(5,5,5,5);
}
public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.setTextColor(Color.parseColor("#4789da"));
this.setBackgroundResource(R.drawable.edittext_back);
this.setTextSize(18);
this.setPadding(5,5,5,5);
}
}