Android 从另一个片段打开片段

Android 从另一个片段打开片段,android,android-fragments,Android,Android Fragments,我在主活动中有一个片段容器。在这个片段容器中,三个片段正在更改,它们都连接到导航栏,如下所示: 我想在按片段3(ProfileFragment)中的按钮时打开另一个活动。我按下按钮,在ProfileFragment.java中编写了以下代码: newButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {

我在主活动中有一个片段容器。在这个片段容器中,三个片段正在更改,它们都连接到导航栏,如下所示:

我想在按片段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中使用RelativeLayout更改了ScrollView,并在RelativeLayout下编写了ScrollView。我不知道前一个失败的原因,但这是可行的。

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

  • 让ProfileActivity布局只是
    滚动视图
    (基本上删除它下面的
    线性布局
    )。这并不是很理想,因为它将一个
    ScrollView
    (片段的根视图)子级添加到另一个
    ScrollView
    ,使其中一个成为多余的。您应该将片段的根视图更改为非滚动视图,或者
  • 将ProfileActivity的根视图更改为非滚动视图

  • @Ohhhthavarun但是ScrollView没有一个线性布局子级?所有其他布局或组件都在我的线性布局中。哦,对不起,我错过了!您是否正在向视图动态添加任何视图?@ohhhtatvarun不,我只想在片段容器中查看此片段。我更新了帖子,你能看看片段容器吗,有什么问题吗?你能发布有ScrollView的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>
    
    <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>
    
    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)