我试图在没有答案的情况下长时间画出形状。我为该视图使用了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);
}
}
答案 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
。
当我说不同的布局时,我的意思是RelativeLayout
,LinearLayout
,ConstraintLayout
等,而不是单独的文件。