画一个形状?

时间:2018-04-14 22:23:57

标签: java android view setcontentview

我试图在没有答案的情况下长时间画出形状。我为该视图使用了setContentView(view)。但是,我有另一个setContentView:

setContentView(R.layout.activity_main);//Buttons, Views from XML...
setContentView( mCustomDrawableView);//Custom Shape

问题是,它只显示 ONE 视图的形状。 Buttons上定义的XML消失了。基本上,最后调用setContentView(view)的是唯一被绘制的View。我还试过很多其他方式来绘制形状而没有有效的答案。

我看到多个setContentView相互重叠,但这是部分工作的唯一方式。是否可以显示两种视图另一种绘制形状的方式和XML Views

修改

我的形状是用java制作的,而不是XML

编辑2:

这是我的customShape班级:

 public class CustomDrawableView extends View {
    private ShapeDrawable mDrawable;

    public CustomDrawableView(Context context) {
        super(context);

        int x = 10;
        int y = 10;


        mDrawable = new ShapeDrawable(new RectShape());
        // If the color isn't set, the shape uses black as the default.
        mDrawable.getPaint().setColor(0xff74AC23);
       mDrawable.setBounds(x,y,x+10,y+10);
    }

    protected void onDraw(Canvas canvas) {
        mDrawable.draw(canvas);
    }
}

2 个答案:

答案 0 :(得分:2)

OK ... setContentView是一个接受布局/视图/其他内容的东西,输入定义了你设置它的活动/片段的内容。

当然,您的第一次调用会执行整个布局,第二次调用会将内容设置为您发送给它的内容。

关键是要查看您的视图,然后将其添加到布局中。如果您的初始setContentView xml中有任何视图已命名(+ id)并已定义(布局x = getfromid(r.id.x),则可以使用x.addview(myview)或x.addview将视图添加到该布局中( CustomDrawableView(上下文))。

-edit澄清 -

活动/片段具有您使用setContentView设置的布局。你这样做一次,通常。布局定义视图的放置位置。

因此,你在onCreate中设置了SessionContent(your.xml)。如果你有一个程序化的View类,你可以做两件事:在你的act / frag中添加新的YourView到一个命名和指定的布局(使用xml中定义的任何布局,传递给在setContentView中传递的xml中的frag / act)然后由代码中的布局x = findViewById(R.id.idoflayoutinxmlinfield' android:id =" @ + id / x")定义。

然后你可以x.addview(新的MyView(上下文))或Myview z = new MyView(context)和x.addView(z);

-edit2 -

当您变得更好时,您还可以通过将自定义视图添加到原始xml定义中来将其添加到原始布局。

-edit3 -

叹息。好。这是:

在你的活动java文件中:

RelativeLayout myRellayout;

@Override
public void onCreate(){
    setContenView(your.xml)
    myRelLayout = findViewByID(R.id.myrellayout);
    myRelLayout.addView(new MyCustomView(this));
    //or define your custom view and the add it by:
    //MyCustomView mcv = new MyCustomView(this);
    //myRelLayout.addView(mcv);
}

你的xml应该包含这样的任何布局:

<RelativeLayout
    android:id="@+id/myrellayout"
    android:width="whatever"
    android:height="whatever"
    />

答案 1 :(得分:0)

<强>更新

在您的XML布局中添加SurfaceView,并在您的活动中引用SurfaceView

SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);

要访问surfaceCreated()事件,请向Holder添加回调并实现其方法。您的主要活动类应如下所示:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);

        surfaceView.getHolder().addCallback(new Callback(){

             @Override
             public void surfaceCreated(SurfaceHolder holder) {

             }

             @Override
             public void surfaceDestroyed(SurfaceHolder holder) {

             }

             @Override
             public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

             }
       });

    }
}

surfaceCreated()内,我们将绘制画布。首先锁定画布,在其上绘制,然后将其解锁,然后发布新像素。所以,我们有:

@Override
public void surfaceCreated(SurfaceHolder holder) {

    //Create a canvas, and then lock it to prevent SurfaceView from modifying it.
    Canvas myCanvas = holder.lockCanvas();

    //Edit your canvas here.

}

最后,完成编辑后,请致电holder.unlockCanvasAndPost()。因此,您surfaceCreated()实施的方法如下:

@Override
public void surfaceCreated(SurfaceHolder holder) {

    //Create a canvas, and then lock it to prevent SurfaceView from modifying it.
    Canvas myCanvas = holder.lockCanvas();

    //Edit your canvas here.

    //Unlock the canvas so it can be displayed.
    holder.unlockCanvasAndPost();
}

在您的活动中,您需要将内容视图设置为存储SurfaceView的XML布局文件。因此,总共有所有代码,我们有:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        setContentView(R.layout.activity_main);

        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);

        surfaceView.getHolder().addCallback(new Callback(){

             @Override
             public void surfaceCreated(SurfaceHolder holder) {

                  //Create a canvas, and then lock it to prevent SurfaceView from modifying it.
                 Canvas myCanvas = holder.lockCanvas();

                 //Edit your canvas here.

                 //Unlock the canvas so it can be displayed.
                 holder.unlockCanvasAndPost();

             }

             @Override
             public void surfaceDestroyed(SurfaceHolder holder) {

             }

             @Override
             public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

             }
       });

    }
}

我应该赞扬StackOverflow用户@fiddler,他在2012年10月31日向另一位提问者提供了非常相似的代码,并且是我写答案的资源。

原始答案:

您不能在具有不同参数的相同布局上调用setContentView()两次,并期望它保留第一个调用。您正在将布局完全切换到不同的视图。

相反,为您的活动创建两种不同的布局。一个可能包含所有UI元素,另一个将包含您的自定义形状。

使用View类,使用View.GONE方法将形状的布局设置为setVisibility()。然后,当您准备好显示它时,请使用View.VISIBLE

当我说不同的布局时,我的意思是RelativeLayoutLinearLayoutConstraintLayout等,而不是单独的文件。