gpt4 book ai didi

android - 在 View 上调用 getWidth()/getHeight() 的正确时机是什么时候?

转载 作者:行者123 更新时间:2023-11-30 03:15:17 24 4
gpt4 key购买 nike

编辑 --> 拜托,这不是为什么 getWidth()/getHeight() 返回零的问题。

我在 Activity 中有一个 fragment 。我正在动态将 SubViews(红色)添加到水平方向的 LinearLayout(RowView,蓝色),它是 Fragment(绿色)的 subview 。有多少 subview ( subview )被添加到 LinearLayout 是在运行时确定的。

enter image description here

subview 的宽度必须固定为 200dp。因此,当动态添加 subview 到线性布局时,我想检查是否有足够的空间放置另一个 subview ,或者是否需要启动一个新的行。 RowView 的宽度应该是可变的,不一定等于屏幕大小。

为了检查是否有足够的空间,我只是简单地查看所有 SubView 的组合宽度是否小于 Linearlayout 的宽度——一个 SubView 的宽度。在我的自定义 LinearLayout (RowView) 中,如下所示:

public void addSubView(SubView v) {

int childcount = getChildCount();
int totalChildWidth = 0;

for(int i = 0; i < childcount; i++) {
totalChildWidth += getChildAt(i).getWidth();
}

if(totalChildWidth < getWidth() - 200) { // there is space left in this row
addView(v);
}
}

问题很简单,LinearLayout 的 getWidth() 和已添加的 subview 的 getWidth() 返回 0,因此,检查是否有足够的空间出错。

原因是当 View (用户界面)尚未在屏幕上呈现时,我正在调用 getWi´dtdh(),所以我的问题是什么时候是正确的时间调用我的 addSubView() 方法?目前,我在创建Fragment时调用它,这显然是错误的:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.fragment, container, false);

RowView row = (RowView) v.findViewById(R.id.rowView);
ArrayList<SubView> subViews = DBManager.getSubViewList(); // connects to a database and returns all available subviews

for(int i = 0; i < subViews.size(); i++) {
row.addSubView(subViews.get(i));
}

return v;
}

那么在哪里调用我的 addSubView(...) 方法以确保其中的 getWidth() 不会返回 0?通常,什么时候是正确的时刻(哪个回调方法,根据 Activity 生命周期)getWidth()getHeight() View被调用,哪里保证不返回0?

到目前为止我尝试了什么:

  • 在 Fragments onActivityCreated(...) 中调用我的 RowView 的 addSubView(...) --> 不起作用
  • 在 RowViwes onSizeChanged(...) 方法中连接到数据库,那里的所有 addSubView(...) --> 不起作用<
  • 按照上面的代码进行操作,但处理程序有 500 毫秒的延迟 --> 可以工作,因为 UI 已呈现,但对我来说不是一个合适的解决方案

最佳答案

您尝试做的是行不通的,因为在您想知道元素的宽度时布局尚未完成。有两种解决方法。第一个是确定布局的实际宽度,这在您的情况下很容易,因为它是实际的屏幕宽度:

int width = getActivity().getResources().getDisplayMetrics().widthPixels

通过将 200dp 转换为像素,使用此值来确定可以在一行中添加多少个 subview :

int viewWidth = (int) (200 * (getActivity().getResources().getDisplayMetrics().densityDpi / 160f));

然后您可以计算一行的最大 View 数:

int maxViewsToAdd = (int) width/viewWidth;

另一个解决方案是globalLayoutListener,你可以找到描述here .但这似乎并不适用于所有情况。

关于android - 在 View 上调用 getWidth()/getHeight() 的正确时机是什么时候?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20245768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com