Открытие фрагмента из другого фрагмента

#android #android-fragments

#Android #android-фрагменты

Вопрос:

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

введите описание изображения здесь

Я хочу открыть другое действие при нажатии кнопки во фрагменте 3 (ProfileFragment). Я поместил кнопку и написал этот код в ProfileFragment.java:

 newButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            SettingsFragment nextFrag= new SettingsFragment();
            getActivity().getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_profile, nextFrag)
                    .addToBackStack(null)
                    .commit();
        }
    });
  

Я не получаю ошибку при открытии приложения, но после нажатия кнопки приложение закрывается, и я получаю эту ошибку:

ScrollView может содержать только один прямой дочерний элемент.

Но в XML-файле ScrollView уже есть один дочерний элемент.

XML-файл фрагмента, который я хочу открыть:

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/whiteColor"
tools:context=".FragmentClasses.SettingsFragment">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <TextView
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:background="@drawable/bottomsheet_settings"
        android:fontFamily="@font/inter_bold"
        android:gravity="center"
        android:letterSpacing="-0.03"
        android:text="Settings"
        android:textColor="@color/whiteColor"
        android:textSize="15sp" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="25dp"
        >

        <TextView
            android:id="@ id/textview1_settings"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Name"
            android:fontFamily="@font/inter_semibold"
            android:textColor="#686868"
            android:textSize="17sp"
            android:letterSpacing="-0.03"
            />

        <TextView
            android:id="@ id/textview2_settings"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="John"
            android:fontFamily="@font/inter_semibold"
            android:textColor="#454545"
            android:textSize="17sp"
            android:letterSpacing="-0.03"
            android:layout_alignParentRight="true"/>

    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/profileLine"/>



</LinearLayout>



</ScrollView>
  

XML-файл ProfileActivity:

 <ScrollView 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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/whiteColor"
android:id="@ id/fragment_profile"
tools:context=".FragmentClasses.ProfileFragment">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">


    <ImageView
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:src="@drawable/profile__image_example"
        android:scaleType="centerCrop"/>


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false"
        android:paddingLeft="25dp"
        android:paddingRight="25dp"
        android:paddingTop="15dp">

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="John"
                android:id="@ id/nameProfile"
                android:fontFamily="@font/inter_bold"
                android:letterSpacing="-0.03"
                android:textSize="22sp"
                android:textColor="#313131"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="USA"
            android:layout_below="@id/nameProfile"
            android:textSize="16sp"
            android:textColor="#A7A7A7"
            android:letterSpacing="-0.03"
            android:fontFamily="@font/inter_semibold"/>

        <Button
            android:id="@ id/newButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/settings_icon"
            android:layout_alignParentRight="true"
            android:layout_marginTop="15dp"/>


    </RelativeLayout>

    </LinearLayout>

    </ScrollView>
  

Основная деятельность XML-файл:

 <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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".D.Main_Activity">

<com.google.android.material.tabs.TabLayout
    android:layout_width="match_parent"
    android:layout_height="55dp"
    app:layout_constraintBottom_toBottomOf="parent"
    android:id="@ id/navigationBar"
    app:tabRippleColor="@null"
    app:tabIndicator="@null"
    android:background="@drawable/dialog_holo_tablayout"
    android:elevation="5dp"
    app:tabMinWidth="75dp"/>

<RelativeLayout
    android:id="@ id/toolbarFriendpie"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:gravity="center"
    app:layout_constraintTop_toTopOf="parent"
    android:background="@drawable/dialog_holo_light_frame"
    android:elevation="3dp"
    >

    <ImageView
        android:id="@ id/mainLogo_Friendpie"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:src="@drawable/friendpie_text_logo"/>


</RelativeLayout>


<androidx.viewpager.widget.ViewPager
    android:id="@ id/fragmentContainer"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toTopOf="@id/navigationBar"
    app:layout_constraintTop_toBottomOf="@ id/toolbarFriendpie" />

</androidx.constraintlayout.widget.ConstraintLayout>
  

И, наконец, это ошибка logcat:

 Process: com.example.test_friendpie, PID: 16929
java.lang.IllegalStateException: ScrollView can host only one direct child
    at android.widget.ScrollView.addView(ScrollView.java:446)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:887)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
  

В чем проблема? Спасибо вам за все.

ОБНОВЛЕНИЕ: РЕШЕНИЕ

Я изменил ScrollView на RelativeLayout в своем ProfileActivity и написал ScrollView в RelativeLayout. Я не знаю, почему предыдущий не удался, но это работает.

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

1. @OhhhThatVarun Но у ScrollView нет одного дочернего элемента линейного макета? Все остальные макеты или компоненты находятся в моем LinearLayout.

2. О, извините, я пропустил это! Вы добавляете какое-либо представление динамически в представление?

3. @OhhhThatVarun Нет, я просто хочу просмотреть этот фрагмент в моем контейнере фрагментов. Я обновил сообщение, можете ли вы посмотреть контейнер фрагмента, есть ли там какие-либо проблемы?

4. можете ли вы опубликовать XML-код, который имеет ScrollView? Также опубликуйте логи

5. Поделитесь своей полной ошибкой. Кроме того, поделитесь макетом, содержащим ScrollView . Ошибка возникает при переключении на SettingsFragment , возможно, у него есть ScrollView , который выдает ошибку.

Ответ №1:

FragmentTransaction.replace() Метод, который вы вызываете внутри вашего прослушивателя, удаляет все фрагменты из данного контейнера, прежде чем заменить их предоставленным фрагментом, добавляя корень нового фрагмента View в макет. В данном конкретном случае корневой вид действия — это a, у ScrollView которого уже есть LinearLayout дочерний элемент. Это LinearLayout , однако, не макет другого фрагмента и как таковой не удаляется при вызове FragmentTransaction.replace() . В результате, добавляя макет нового фрагмента в представление контейнера, вы фактически вызываете ScrollView.addView() на ScrollView , у которого уже есть прямой дочерний элемент. Я вижу два способа решения вашего исключения (какой из них лучше подходит для вашего дизайна / макета, решать вам):

  1. Пусть макет ProfileActivity будет таким же, ScrollView (по сути, удалите LinearLayout под ним). На самом деле это не идеально, поскольку оно добавляет ScrollView дочерний элемент (корневой вид вашего фрагмента) к другому ScrollView , делая любой из них избыточным. Вы должны либо изменить корневой вид фрагмента, чтобы он не был Scrollview , либо
  2. Измените корневое представление ProfileActivity, чтобы оно не было ScrollView .

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

1. Второе решение работает для меня. Спасибо за ваше время.