如何初始化依赖于视图属性的东西

时间:2017-01-14 18:52:56

标签: android android-layout glsurfaceview

说我有这个课程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>

3 个答案:

答案 0 :(得分:1)

我从你的问题中理解了什么。您需要oncreate()中的视图属性。但无法这样做。原因是此时UI尚未初始化。有工作。 这个链接可能有所帮助。

getWidth() and getHeight() of View returns 0

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