не могу найти, как выровнять элемент фрагмента по центру экрана, не изменив высоту контейнера в соответствии с родительским [xml-вопрос]

#android #xml #android-studio #kotlin #android-fragments

#Android #xml #android-студия #котлин #android-фрагменты

Вопрос:

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

[вот почему я не могу настроить его на соответствие родительским. потому что тогда другие фрагменты не поместятся. Кроме того, я не могу выделить первый фрагмент в отдельное действие, потому что это часть учебного проекта, и большая его часть уже была построена с использованием тестов.]

В первом фрагменте, который у меня есть, есть одна кнопка, и высота этого фрагмента установлена в соответствии с родительским элементом [который является контейнером с содержимым обертки].

кнопка внутри фрагмента выровнена по центру экрана для xml-фрагмента. но, поскольку для контейнера включена функция переноса, кнопка теперь находится вверху в основном действии.

теперь установка высоты фрагмента в качестве некоторого фиксированного значения может решить проблему, когда высота устройства фиксирована. но в других случаях местоположение кнопки может отображаться не так, как требуется.

Вы найдете скриншот ниже, который даст вам лучшее понимание моей проблемы.

снимок экрана Android studio

вверху находится макет фрагмента, а внизу-основной макет действия. все, что я хочу, — это чтобы кнопка находилась в центре экрана независимо от размера экрана.

основная активность —

 lt;?xml version="1.0" encoding="utf-8"?gt; lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  android:id="@ id/container"  android:layout_width="match_parent"  android:layout_height="match_parent"gt;   lt;!-- TODO: Add a FragmentContainerView with navigation/mobile_navigation as the navHost --gt;  lt;ScrollView  android:layout_width="match_parent"  android:layout_height="match_parent"gt;   lt;androidx.fragment.app.FragmentContainerView  android:id="@ id/nav_host_fragment"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:name="androidx.navigation.fragment.NavHostFragment"  app:defaultNavHost="true"  app:navGraph="@navigation/mobile_navigation" /gt;  lt;/ScrollViewgt;  lt;/androidx.constraintlayout.widget.ConstraintLayoutgt;  

fragment activity —

 lt;?xml version="1.0" encoding="utf-8"?gt; lt;androidx.constraintlayout.widget.ConstraintLayout  xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  xmlns:tools="http://schemas.android.com/tools"  android:id="@ id/layout_start_order"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context=".ui.order.StartOrderFragment"gt;   lt;Button  android:id="@ id/start_order_btn"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_marginStart="@dimen/base_margin"  android:layout_marginTop="@dimen/base_margin"  android:layout_marginEnd="@dimen/base_margin"  android:text="@string/start_order"  app:layout_constraintBottom_toBottomOf="parent"  app:layout_constraintEnd_toEndOf="parent"  app:layout_constraintStart_toStartOf="parent"  app:layout_constraintTop_toTopOf="parent"/gt;  lt;/androidx.constraintlayout.widget.ConstraintLayoutgt;  

I also tried turning the fragment layout into a binding layout and setting the height manually. but, it’s giving a val cannot be assigned error. [the same binding variable allows me to change the button text.] the screenshot below is of the same attempt.

изображение попытки котлина

тот же код котлина, что и выше —

 package com.example.lunchtray.ui.order  import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.example.lunchtray.R import com.example.lunchtray.databinding.FragmentStartOrderBinding  class StartOrderFragment : Fragment() {   // Binding object instance corresponding to the fragment_start_order.xml layout  // This property is non-null between the onCreateView() and onDestroyView() lifecycle callbacks,  // when the view hierarchy is attached to the fragment.  private var _binding: FragmentStartOrderBinding? = null   // This property is only valid between onCreateView and  // onDestroyView.  private val binding get() = _binding!!   override fun onCreateView(  inflater: LayoutInflater,  container: ViewGroup?,  savedInstanceState: Bundle?  ): View? {  _binding = FragmentStartOrderBinding.inflate(inflater, container, false)  val root: View = binding.root  // Navigate to entree menu  binding.startOrderBtn.setOnClickListener {  // TODO: navigate to the EntreeMenuFragment  findNavController().navigate(R.id.action_startOrderFragment_to_entreeMenuFragment)  }  return root  }   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {  super.onViewCreated(view, savedInstanceState)  binding.layoutStartOrder.height = 1 //error  binding.startOrderBtn.text = "wwmfkkf" //so, binding variable isn't the problem  //todo - remove button text assignment  }   /**  * This fragment lifecycle method is called when the view hierarchy associated with the fragment  * is being removed. As a result, clear out the binding object.  */  override fun onDestroyView() {  super.onDestroyView()  _binding = null  } }  

Мы ценим любую форму помощи. Спасибо.

Комментарии:

1. Вы пробовали установить высоту прокрутки на 0dp?

2. это не имеет значения, потому что вид прокрутки уже заполняет весь экран. [да, я пытался]. Я просто хочу, чтобы размер фрагмента был таким же, как и его контейнер. но, поскольку контейнер находится в режиме прокрутки, его высота установлена в значение wrap_content. Итак, теперь кнопка находится вверху, потому что вид прокрутки начинается сверху, а действие фрагмента не заполняет экран [потому что включен wrap_content]. Я попытался установить высоту фрагмента в коде котлина. но код возвращает размер экрана вместо размера контейнера фрагментов, из-за чего размер фрагмента превышает предел прокрутки.

3. Добавьте android:layout_gravity="center" в элемент FragmentContainerView.

4. Я хочу, чтобы экран заполнился только одним отдельным фрагментом. остальные должны начинаться сверху. поэтому, по сути, если возможно, я хочу установить высоту этого фрагмента так, чтобы он просто соответствовал его родительскому[контейнеру], чтобы фрагмент идеально вписывался в представление прокрутки и не был прокручиваемым, это также автоматически центрирует кнопку. но сопоставление родительского элемента не может быть реализовано в файле представления фрагмента, поскольку контейнер фрагмента находится внутри представления прокрутки, а элементы внутри представления прокрутки не могут иметь высоту, соответствующую родительскому элементу. таким образом, вместо этого он просто оборачивается, как показано на рисунке выше основной деятельности.