我试图在旋转屏幕后获得imageView的宽度和高度,但它总是返回0 注意:onWindowFocusChanged在旋转后不会被调用,因为我手动处理旋转。当我尝试这段代码时
ViewTreeObserver vto = mImgView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
mImgView.getViewTreeObserver().removeOnPreDrawListener(this);
viewWidth = mImgView.getWidth();
Log.e("Width =",viewWidth +"");
return true;
}
});
它被调用两次并返回不同的值,其中一个是正确的!! 我的图像视图显示代码如下
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Configuration config=getResources().getConfiguration();
if(config.orientation == Configuration.ORIENTATION_PORTRAIT)
{
setContentView(R.layout.quran_display_act);
mImgtView = (ImageView) findViewById(R.id.rightImg_view);
mImgtView.setImageBitmap(bitmap);
//TODO hereee
float viewWidth = mImgtView.getWidth();
...
}
答案 0 :(得分:0)
那是什么,为什么再次调用setContentView?如果您想手动处理方向更改,请删除configChanges ="方向"如果它在那里,从清单。然后每次旋转屏幕时,都会重建整个活动。所以你只需将你发布的if-else语句放在onCreate()中并单独保留onConfigurationChanged。 This article应该有所帮助。
编辑:
在方向更改时切换布局没有问题。以上只是官方方式之一。需要注意的重要一点是:setContentView可能不会被多次调用!请参阅setContentView() is not enough to switch between layouts?或Calling setContentView() multiple times。经验法则:总是在super.onCreate下面的onCreate里面调用setContentView,然后再也不要。
因此,如果您想在更改方向时在运行时切换布局,则必须删除" setContentView(R.layout.quran_display_act);"并使用别的东西。最值得注意的选择是:
ViewFlipper,在这种情况下,您的默认布局是ViewFlipper的第一个子项,您必须将quran_display_act.xml中的所有内容移动到主布局XML,并使其成为ViewFlipper的第二个子项。然后在方向更改时调用ViewFlipper上的next()而不是setContentView。
显示和隐藏布局。在这里,您还必须将quran_display_act.xml中的所有内容移动到活动的主要布局中。在要切换的布局上调用setVisibility(View.HIDE),并在要显示的布局上调用setVisibility(View.VISIBLE)。
使用Fragments,这是迄今为止最灵活,最有效的选择。
使用选项1和2,您可以使用getWidth()和getHeight()来轻松测量ImageView的网站。选项3有点困难,但仍有可能。
答案 1 :(得分:0)
试试这样 通过扩展ImageView类
创建自定义图像视图覆盖onMeasure()方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if(getMeasuredWidth()!=0 && getMeasuredHeight()!=0)
{
//write your code here
//it gets called many times ,so write a condition also to stop executing the same several times.
}
}