Android碎片高度

时间:2019-02-01 14:27:02

标签: android layout android-recyclerview fragment

我有一个片段,以编程方式放置在 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。该怎么办?我期待着您的回音。

2 个答案:

答案 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类的子代)。