我可以想到一两种方法来做到这一点。
您可以确保所有活动布局的根布局是 a RelativeLayout
,然后使用必要的参数将视图添加到该视图中,以使其在视图中居中。这意味着布局是第一个孩子,RelativeLayout
并且您的图像被添加为第二个孩子,因此将出现在第一个孩子的顶部。
或者
您可以通过扩展来创建自己的布局管理器ViewGroup
。您可能需要对其进行一些调整,但本质上ViewGroup
应该是这样的。
public class Article2 extends ViewGroup {
private View layout;
private ImageView theImage;
private Context ctx;
public Article2(Context context,View layout) {
super(context);
ctx = context;
this.layout = layout;
this.addView(layout);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
for(int i = 0;i<this.getChildCount();i++){
final View child = this.getChildAt(i);
measureChild(child, widthMeasureSpec, heightMeasureSpec);
}
setMeasuredDimension(widthSpecSize, heightSpecSize);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
layout.layout(left, top, right, bottom);
if(theImage!= null){
theImage.layout(right/2 - theImage.getMeasuredHeight()/2, bottom/2 -theImage.getMeasuredHeight()/2, right/2 + theImage.getMeasuredHeight()/2, bottom/2 + theImage.getMeasuredHeight()/2);
}
}
public void startImage(String url){
theImage = new ImageView(ctx);
new GetImage(url).execute();
}
private class GetImage extends AsyncTask<Void,Void,Boolean>{
String url=null;
public GetImage(String url){
this.url = url;
}
@Override
protected Boolean doInBackground(Void... arg0) {
if(url!=null&&url.length()>0){
try {
theImage.setImageBitmap(BitmapFactory.decodeStream((InputStream)new URL(url).getContent()));
} catch (MalformedURLException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}else{
return false;
}
}
@Override
protected void onPostExecute(Boolean addView){
if(addView){
addView(theImage);
}
}
}
}
编辑
忘记添加如何使用上面的类。
而onCreate()
不是像这样将内容视图设置为布局文件
setContentView(R.layout.MyLayout);
而是这样做
Article2 article2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.MyLayout, null);
article2 = new Article2(this,v);
setContentView(article2);
}
通过这种方式,您只需将上面的 5 行放入每个活动中即可使其正常工作
要显示图像,只需调用parentActivity.article2.startImage(url)
它,它就会将图像放置在您在屏幕中心提供的视图顶部
请注意,我没有在其中放置任何东西来删除图像,一旦图像被放置,您可能只需要使用article2.removeViewAt(1)
,但我还没有测试过。