创建自定义视图以编程方式支持更改LayoutParams

时间:2016-12-24 13:17:07

标签: android android-custom-view

我在FrameLayout中使用自定义视图lyricView。它在正常情况下运作良好:

enter image description here

出于某种原因,我希望lyricview可以以两种尺寸,单行尺寸和全屏尺寸显示。我在FrameLayout上注册一个OnClickListener,这样用户可以通过点击窗口在两种尺寸之间切换。所以我尝试在程序中更改LayoutParams。

点击之前

(单线模式)

  • 布局文件

    <io.hefuyi.listener.widget.LyricView
    android:id="@+id/lyric_view"
    android:layout_marginTop="55dp"
    android:layout_width="match_parent"
    android:layout_height="32dp"
    android:layout_gravity="center"
    android:visibility="visible"/>
    
  • 歌词效果很好

enter image description here

点击(全屏模式)后

  • 代码段

                            FrameLayout.LayoutParams lyricLayout = (FrameLayout.LayoutParams) lyricView.getLayoutParams();
                            lyricLayout.height = FrameLayout.LayoutParams.MATCH_PARENT;
                            lyricLayout.topMargin = DensityUtil.dip2px(mContext, 55);
                            lyricLayout.bottomMargin = iconContainer.getHeight();
                            lyricView.setLayoutParams(lyricLayout);
                            isLyricFullScreen = true;
    
  • 更改布局参数不起作用

enter image description here

显然,我没有改变lyricview布局失败,因为如果它有效,歌词将在屏幕中心绘制。

那么,如何让lyricView以编程方式支持更改LayoutParams?

2 个答案:

答案 0 :(得分:0)

解决方案:

  1. 我注意到在xml中你已经将32dp的高度设置为歌词视图,而在程序中你正在改变帧布局的布局参数。请更改歌词视图的布局参数而不是帧布局,因为歌词视图的高度仍为32 dp。

  2. 如果不起作用,请尝试在程序中的歌词视图中调用requestLayout()

答案 1 :(得分:0)

我认为问题出在iconContainer.getHeight()

你确定这条线会产生某个视图的高度吗?如果这段代码在iconContainer布局之前运行(这是最可能的情况),那么getHeight将得到0。

如果出现此问题,您应该向GlobalLayoutChangeListener viewTreeObserver添加iconContainer,在听众中获取高度并使用该高度。