Высота фрагмента Android - PullRequest
       14

Высота фрагмента Android

0 голосов
/ 01 февраля 2019

У меня есть фрагмент, который помещен в FrameLayout на MainActivity программно.Во фрагменте мне нужно было GridView .Но это будет исправлено 9 строк и 3 столбца.Там не было бы прокрутки.Итак, я разместил RecyclerView и создал свой собственный LayoutManager, расширяющийся от GridLayoutManager.

@Override
public boolean canScrollVertically() {
    return false;
}

эта часть кода обеспечивала блокировку прокрутки.Мне нужен параметр Высота этого FrameLayout и отправить его из фрагмента в адаптер RecyclerView.Потому что я планировал получить размер и разделить его на 9, а затем применить эту новую высоту к каждому элементу.

@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 голосов
/ 01 февраля 2019

Если вы позвоните

yourLayout.getHeight();

в onCreate(), onStart() или onResume(), в большинстве случаев он вернет 0.

Лучший способ получить высотумакет в одном из этих методов таков:

int height;

yourLayout.post( new Runnable() {
        @Override
        public void run() {
            height = yourLayout.getHeight();
        }
    });

Все представления имеют объект-обработчик, таким образом, вы используете обработчик вашего макета (который является потомком класса View).

0 голосов
/ 01 февраля 2019

onCreateView() слишком рано.Вы можете прикрепить ViewTreeObserver к макету вашего фрагмента и зафиксировать значение, когда оно имеет ненулевое значение высоты и ширины.Я считаю, что вы можете использовать ViewTreeObserver для этого:

    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if(view.getHeight() > 0 && view.getWidth() > 0) {
                //cache values
                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...