#android #xml #android-studio #kotlin #android-fragments
#Android #xml #android-студия #котлин #android-фрагменты
Вопрос:
давайте начнем с основной деятельности. в моей основной деятельности есть фрагментный контейнер с высотой, установленной для обертывания содержимого, и он заключен в вид прокрутки. Вид прокрутки заполняет экран.
[вот почему я не могу настроить его на соответствие родительским. потому что тогда другие фрагменты не поместятся. Кроме того, я не могу выделить первый фрагмент в отдельное действие, потому что это часть учебного проекта, и большая его часть уже была построена с использованием тестов.]
В первом фрагменте, который у меня есть, есть одна кнопка, и высота этого фрагмента установлена в соответствии с родительским элементом [который является контейнером с содержимым обертки].
кнопка внутри фрагмента выровнена по центру экрана для xml-фрагмента. но, поскольку для контейнера включена функция переноса, кнопка теперь находится вверху в основном действии.
теперь установка высоты фрагмента в качестве некоторого фиксированного значения может решить проблему, когда высота устройства фиксирована. но в других случаях местоположение кнопки может отображаться не так, как требуется.
Вы найдете скриншот ниже, который даст вам лучшее понимание моей проблемы.
вверху находится макет фрагмента, а внизу-основной макет действия. все, что я хочу, — это чтобы кнопка находилась в центре экрана независимо от размера экрана.
основная активность —
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. Я хочу, чтобы экран заполнился только одним отдельным фрагментом. остальные должны начинаться сверху. поэтому, по сути, если возможно, я хочу установить высоту этого фрагмента так, чтобы он просто соответствовал его родительскому[контейнеру], чтобы фрагмент идеально вписывался в представление прокрутки и не был прокручиваемым, это также автоматически центрирует кнопку. но сопоставление родительского элемента не может быть реализовано в файле представления фрагмента, поскольку контейнер фрагмента находится внутри представления прокрутки, а элементы внутри представления прокрутки не могут иметь высоту, соответствующую родительскому элементу. таким образом, вместо этого он просто оборачивается, как показано на рисунке выше основной деятельности.