Java 如何以固定宽度和高度显示Webview

Java 如何以固定宽度和高度显示Webview,java,android,layout,webview,Java,Android,Layout,Webview,对不起,我一直在搜索这个论坛,没有得到确切的答案。所以我问我自己 我有一个类,显示两种布局,glView和webview,目标纵向屏幕为640x960。我计划拆分布局。所以看起来我的背景画在(0,0640480)或肖像屏幕的一半,我希望我的网络视图绘制在(0481640479),它占据了从中间到底部的另一半。然而,我失败了,不知道如何实现我想要的布局。如何设置webView的大小和位置 PS:如果我将布局设置为对齐底部,那么WebVIEW实际上是在中间到底部的位置,但是我需要指定确切的位置。最

对不起,我一直在搜索这个论坛,没有得到确切的答案。所以我问我自己

我有一个类,显示两种布局,glView和webview,目标纵向屏幕为640x960。我计划拆分布局。所以看起来我的背景画在(0,0640480)或肖像屏幕的一半,我希望我的网络视图绘制在(0481640479),它占据了从中间到底部的另一半。然而,我失败了,不知道如何实现我想要的布局。如何设置webView的大小和位置

PS:如果我将布局设置为对齐底部,那么WebVIEW实际上是在中间到底部的位置,但是我需要指定确切的位置。最糟糕的是。。当它加载url时,它将使用整个屏幕,覆盖我的所有第一个布局,我迷路了。那么如何使webview将加载的url显示到webview指定的宽度和高度

谢谢。。对不起,我的英语不好

无论如何,这是我的代码(我是通过编程创建的,我没有使用任何xml布局)


您可以使用
LinearLayout
而不是
RelativeLayout
来分割屏幕。只需将
GLSurfaceView
WebView
的高度设置为0,重量设置为1即可。在您的情况下,代码将是:

LinearLayout layout = new LinearLayout(this); // Use LinearLayout instead of Relative

glView = new GLSurfaceView(this);
glView.setRenderer(this);
glView.setZOrderMediaOverlay(false);

// height is 0, weight is 1
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1);
layout.addView(glView, params);

webView = new WebView(this);
this.showWV(false); //handler message , i hide it in certain screen.
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);

// height is 0, weight is 1
params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1);
layout.addView(webView, params);

webView.loadUrl("http://stackoverflow.com");

setContentView(layout);
或者,您可以对硬编码的高度和宽度值使用
RelativeLayout

RelativeLayout layout = new RelativeLayout(this); // Use LinearLayout instead of Relative

glView = new GLSurfaceView(this);
glView.setRenderer(this);
glView.setZOrderMediaOverlay(false);
glView.setId(123); // set id

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(640, 480);
layout.addView(glView, params);

webView = new WebView(this);
this.showWV(false); //handler message , i hide it in certain screen.
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);

params = new RelativeLayout.LayoutParams(640, 480);
params.addRule(RelativeLayout.BELOW, glView.getId()); // set WebView position is below GLSurfaceView
layout.addView(webView, params);

webView.loadUrl("http://stackoverflow.com");

setContentView(layout);
UPD: 不使用硬编码值,使用不可见视图:

RelativeLayout layout = new RelativeLayout(this); // Use LinearLayout instead of Relative

// create a fake view with zero size and place it to center of RelativeLayout
View fakeView = new View(this); 
fakeView.setId(24736); 
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(0, 0);
params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
layout.addView(fakeView, params);

glView = new GLSurfaceView(this);
glView.setRenderer(this);
glView.setZOrderMediaOverlay(false);
glView.setId(123); // set id

params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
params.addRule(RelativeLayout.ABOVE, fakeView.getId()); // set position is above fakeView
layout.addView(glView, params);

webView = new WebView(this);
this.showWV(false); //handler message , i hide it in certain screen.
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);

params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
params.addRule(RelativeLayout.BELOW, fakeView.getId()); // set WebView position is below fakeView
layout.addView(webView, params);

webView.loadUrl("http://stackoverflow.com");

setContentView(layout);

您可以使用
RelativeLayout.LayoutParams
类执行此操作:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(640, 480);
params.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
webView.setLayoutParams(params);

然后将webview添加到布局中。您可以使用新的LayoutParams实例和
addRule(RelativeLayout.ALIGN\u PARENT\u bottom,RelativeLayout.TRUE)在屏幕底部找到另一个视图

为什么不想使用xml布局?即使我使用布局也没关系,我只是在修改mario zachner开始android游戏电子书的示例游戏代码,使用他的框架(他不使用任何布局)。我试图在这里完成的是将webview设置在适当的位置,手动设置其宽度和高度,同时加载url的精确大小,而不是将其自身放大并占据整个屏幕。谢谢,我坚持使用相对布局,我认为,我几乎可以正确使用您提供的代码,唯一的问题是硬编码的值,是否有任何方法将其更改为百分比以适应不同的分辨率。如果在
RelativeLayout
的中心使用虚假的不可见视图,则是可能的。查看我的更新答案。我的思路是正确的,除了我现在正在考虑保持显示或隐藏网络视图的原始目的外,其他一切都正常。如您所见,我的
this.showWV(false)这是调用我不希望webview(及其布局)出现的UI线程的处理程序,代码设置webview不可见性。在使用代码之前,它是有效的,我的意思是我可以控制webview的可见性。但现在,它不起作用了。WebVIEW(或空白布局)从一开始我就不想要了。我的意思是,当我将处理程序msg设置为true时,仅在特定屏幕上显示它。谢谢你!,我玩弄了一下布局,最终我只懂了一点点,就可以让它按我想要的那样工作了。。我通过提供
layout.removeView(fakeView)解决了这个问题;和布局。removeView(webView)这样,布局将不再显示。虽然屏幕或视图之间的转换不太好,但有时会显示全黑,而glview看起来像是闪烁,消失了,首先显示webview,然后是glview。。但我认为这是另一个问题。我很高兴我能控制网络视图。再次感谢!。祝你有一个快乐的一天。谢谢你,我正在尝试与erakitin的答案一起使用。@ganero注意,我的awnser会将视图设置为固定大小,因此在小于或大于640x960的屏幕上,视图可能无法正确定位/调整大小。没错,我尝试过。这就是为什么我需要另一种方法。谢谢
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(640, 480);
params.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
webView.setLayoutParams(params);