android - 布局宽度和高度被忽略

标签 android layout

我有一个带有内部布局的对话框和一个带有视频流的 SurfaceTexture。当我从视频中收到 widthheight 时,我会像这样调整布局:

private void resizeView(final VideoFormatInfo info) {
        final Size size = calculateSize(info.getWidth(), info.getHeight());
        mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {

                final ViewGroup.LayoutParams layoutParams = mInnerLayout.getLayoutParams();
                layoutParams.width = size.x;
                layoutParams.height = size.y;
                Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y));
                mInnerLayout.setLayoutParams(layoutParams);
            }
        });
    }

现在我有一个全屏按钮,可以将布局调整到整个屏幕。但是当我按下它时,布局会保留在屏幕的一小块区域。

当我检查日志时,size.xsize.y 的正确值在那里(屏幕的边界),但布局未正确调整大小.

内部布局被添加到名为“VideoPlayer”的自定义 View 中。我将视频播放器背景的颜色设置为红色,所以当我切换到全屏时,整个屏幕都变成红色,除了中间的视频流。这意味着底层 View 正在正确调整大小,但 innerLayout 不是出于某种原因。

有趣的是,我在视频渲染上有另一个布局,它创建了一个“闪光效果”来模拟拍摄快照时的相机闪光灯。当触发闪光效果时,视频会调整到整个屏幕。

这是我的布局树:

VideoPlayerView (CustomView, not VideoView)
     innerLayout (RelativeLayout)
         videoSurfaceTexture (SurfaceTextureView)
         flashLayout (RelativeLayout)

我还设置了这个用于调试:

 @Override
            public void onSurfaceTextureSizeChanged(final SurfaceTexture surfaceTexture, final int width, final int height) {
                Log.d(TAG, "onSurfaceTextureSizeChanged size=" + width + "x" + height + ", st=" + surfaceTexture);

                Log.i(TAG, String.format("innerlayout bounds are %d,%d", mInnerLayout.getLayoutParams().width, mInnerLayout.getLayoutParams().height));
            }

当我按下全屏时,内部布局上的值是正确的值(整个屏幕的值),但布局没有调整大小。我可以看出布局没有调整大小,因为我将其背景颜色更改为绿色并添加了一些填充,我可以在屏幕中央看到它占用了很小的空间。

看起来好像 View 没有随着布局更改而更新。

我的想法已经用完了。我尝试了 invalidate()postInvalidate()forceLayout() 但它们不起作用。

最佳答案

您错过了 forceLayout() 的一个重要部分:

This method does not call requestLayout() or forceLayout() on the parent.

所以让父级也做一个布局:

mInnerLayout.setLayoutParams(layoutParams);
mInnerLayout.forceLayout();
mInnerLayout.getParent().requestLayout();

关于android - 布局宽度和高度被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38970918/

相关文章:

java - Eclipse IDE 频繁关闭

android - 缓存位图 - Android

ios - intrinsicContentSize 与 sizeThatFits。有什么不同?每个的用例是什么?

java - 使用循环删除某些布局 View

apache-flex - 如何防止 itemRenderer 中的容器超出列表容器的宽度?

rest - 如何使 flutter 中的无限滚动布局? (更新)

java - 找不到参数的方法 compile() [com.android.support :cardview-v7:27. 0.2]

Android软键盘首先显示数字 View

java - 如何使用 PhantomReference 报告 Android/Java 中的内存泄漏

Android 4.4 WebView 缩放居中