即使布局完成后,View.setLayoutParams()也无效

时间:2016-10-12 15:00:15

标签: android android-layout

我正在使用Android TV应用,需要制作进度条以指示已经播放了多少内容。我觉得我所写的应该是有效的,但它不是。

我有LinearLayout android:orientation="horizontal"android:weightSum=100作为进度条的容器,实际进度条是容器内的FrameLayoutandroid:layout_width="0dp"android:layout_weight="0",以确保在没有任何进展的情况下不会绘制进度条。

在活动代码中我试图改变进度条的权重,如下所示:

ViewGroup.LayoutParams lp = progressView.getLayoutParams();
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(lp.width, lp.height, progress);
progressView.setLayoutParams(params);

progressView,当然是我试图操纵的进度条对象,而progress是预期的新权重)

我最初在活动的onCreate()方法中运行此代码,直到我记得在视图布局正确之前,您无法对视图的维度进行任何操作。从那时起,我尝试使用onResume() postDelayed@Override public void onResume() { super.onResume(); progressView.postDelayed(new Runnable() { @Override public void run() { setProgress(); } }, 1000); } 中运行此功能:

ViewTreeObserver
onCreate()期间

progressView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (!progressBarRefreshed) { setProgress(); } } }); 这样的setProgress()

match_parent

我甚至尝试将代码作为附加到同一活动中的按钮的onClick事件运行(在这两种情况下LayoutParams都是使用上面发布的代码执行权重更改的函数)。我已验证(我从代码中删除了日志消息以使其更具可读性)初始宽度为0,高度为-1(setLayoutParams())且权重为0,并且新{{对象的宽度为0,高度为-1,权重等于我设置的宽度。但是在{{1}}调用之后,视图仍然具有权重0并且屏幕上也没有变化。我在这里错过了什么明显无足轻重的事情?

1 个答案:

答案 0 :(得分:0)

设置布局参数后尝试调用progressView.requestLayout()