从另一个片段中打开片段

时间:2020-09-05 08:38:35

标签: android android-fragments

我的主要活动中有一个片段容器。在此片段容器内,三个片段正在变化,并全部连接到导航栏,如下所示:

enter image description here

我想在片段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>

ProfileActivity XML文件:

<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)

出什么问题了?谢谢大家。

更新:解决方案

我在ProfileActivity中使用RelativeLayout更改了ScrollView,并在RelativeLayout下编写了ScrollView。我不知道为什么前一个失败了,但这行得通。

1 个答案:

答案 0 :(得分:2)

您正在侦听器中调用的FragmentTransaction.replace()方法会从给定容器中删除所有片段,然后再用提供的片段替换它们,并添加新片段的根{{1} }的布局。在这种特定情况下,活动的根视图是一个View子级的ScrollView。但是,此LinearLayout并不是不同片段的布局,因此在调用LinearLayout时不会将其删除。因此,将新片段的布局添加到容器视图时,实际上是在已经具有直接子级的FragmentTransaction.replace()上调用ScrollView.addView()。我可以看到两种解决您的异常的方法(哪种方法更适合您的设计/布局,您可以自行决定):

  1. 将ProfileActivity布局设置为ScrollView(基本上删除其下的ScrollView)。这不是很理想,因为它向另一个LinearLayout添加了一个ScrollView(您的片段的根视图)子级,从而使其中一个冗余。您应该将片段的根视图更改为ScrollView,或者
  2. 将ProfileActivity的根视图更改为Scrollview