我有一个片段,以编程方式放置在 MainActivity 上的 FrameLayout 中。在该片段中,我需要一个 GridView 。但是它将有固定的9行和3列。没有滚动。因此,我放置了RecyclerView并从GridLayoutManager扩展了自己的LayoutManager。
@Override
public boolean canScrollVertically() {
return false;
}
这部分代码提供了阻止滚动的功能。 我需要该FrameLayout的 Height 参数,并将其从Fragment发送到RecyclerView Adapter。因为,我计划获取大小,并将其划分为9,然后将新的Height应用于每个项目。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_catalog_list, container, false);
// Set the adapter
if (view instanceof RecyclerView) {
Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
DisplayMetrics displaymetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
recyclerView.setLayoutManager(new NonScrollGridLayoutManager(context, columnCount));
recyclerView.setAdapter(new CatalogRecyclerViewAdapter(DummyContent.ITEMS, catalogListener, height - 200));
}
return view;
}
如您在代码中所见,我从窗口指标中得到了高度尺寸。 不是来自片段的布局。
然后在RecyclerViewAdapter中,计算高度
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fragment_catalog, parent, false);
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = layoutHeight / 9;
view.setLayoutParams(params);
return new ViewHolder(view);
}
我正在尝试从片段的布局中获取“高度”值。但是它总是返回0。该怎么办?我期待着您的回音。
答案 0 :(得分:1)
onCreateView()
还为时过早。您可以将ViewTreeObserver
附加到Fragment的布局,并在高度和宽度值不为零时捕获该值。我相信您可以为此使用ViewTreeObserver
:
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if(view.getHeight() > 0 && view.getWidth() > 0) {
//cache values
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
});
答案 1 :(得分:0)
如果您致电
yourLayout.getHeight();
在onCreate()
,onStart()
或onResume()
中,大多数情况下它将返回0。
在其中一种方法中获取布局高度的更好方法是:
int height;
yourLayout.post( new Runnable() {
@Override
public void run() {
height = yourLayout.getHeight();
}
});
所有视图都有一个Handler对象,通过这种方式,您可以使用Layout的Handler(它是View
类的子代)。