片段内的片段不能与 ScrollView 一起使用

Posted

技术标签:

【中文标题】片段内的片段不能与 ScrollView 一起使用【英文标题】:Fragment Inside a Fragment Not Working with ScrollView 【发布时间】:2021-12-08 18:22:37 【问题描述】:

当我在带有 ScrollView 的片段内使用片段时,它不起作用。 在我的情况下,FirstFragment 很好。里面的片段没有全屏显示,BooksFragment 中的很多内容都消失了

这是我的 FirstFragment 的 XML:

<?xml version="1.0" encoding="utf-8"?>
<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_
android:layout_
android:background="#DADADA"
tools:context=".FirstFragment">

<ScrollView
    android:layout_
    android:layout_
    android:fillViewport="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <RelativeLayout
        android:layout_
        android:layout_>


        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabLayout"
            android:layout_
            android:layout_
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            app:tabGravity="fill"
            app:tabMode="fixed">

        </com.google.android.material.tabs.TabLayout>

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewPager"
            android:layout_
            android:layout_
            android:layout_below="@id/tabLayout"
            android:layout_alignParentStart="true"
            android:layout_alignParentEnd="true" />

    </RelativeLayout>

</ScrollView>

这是我的FirstFragment 的 JAVA:

public class FirstFragment extends Fragment 


public FirstFragment() 
    // Required empty public constructor



@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);



static class ViewPagerAdapter extends FragmentStateAdapter 
    private final List<Fragment> fragmentList = new ArrayList<>();
    private final List<String> fragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) 
        super(fragmentManager, lifecycle);
    

    public void addFragment(Fragment fragment, String title) 
        fragmentList.add(fragment);
        fragmentTitleList.add(title);
    

    @NonNull
    @Override
    public Fragment createFragment(int position) 
        return fragmentList.get(position);
    

    @Override
    public int getItemCount() 
        return fragmentList.size();
    


ViewPagerAdapter adapter;
ViewPager2 viewPager;
TabLayout tabLayout;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    // Inflate the layout for this fragment

    View view = inflater.inflate(R.layout.fragment_first, container, false);
    viewPager = view.findViewById(R.id.viewPager);
    tabLayout = view.findViewById(R.id.tabLayout);
    initView();
    return view;


private void initView() 
    adapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager(), getActivity().getLifecycle());
    adapter.addFragment(new BooksFragment(), "Books");
    adapter.addFragment(new ComputerFragment(), "Computers");
    viewPager.setAdapter(adapter);

    new TabLayoutMediator(tabLayout, viewPager, ((tab, position) -> 
        tab.setText(adapter.fragmentTitleList.get(position));
    )).attach();



这是我的BooksFragment 的 Xml:

 <?xml version="1.0" encoding="utf-8"?>
<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/frameLayout2"
android:layout_
android:layout_
tools:context=".BooksFragment">

<TextView
    android:id="@+id/textView"
    android:layout_
    android:layout_
    android:text="lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akdlorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd lorem ipsum lorem ipsum how sldj as kye akd"
    android:lineSpacingExtra="20dp"
    android:textSize="20sp"
    android:layout_margin="16dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

 </androidx.constraintlayout.widget.ConstraintLayout>

如果我用简单的话来说这个问题,它会是这样的:

我的第一个片段很好,但内部片段的内容没有显示,所以我该如何解决这个问题?任何帮助将不胜感激。如果您对我的帖子有任何疑问或问题,可以告诉我。

示例:

你们已经知道我在 BooksFragment 的 Xml 中有很长的文本: 但在这张图片中,你明白了。

在这张图片中,甚至没有显示一个文本

在此图像中显示文本因为它的文本长度非常小。

警报:

请不要认为灰色背景是他的 (booksFragment,ComputerFragment)。 FirstFragment的背景是灰色的!不是BooksFragmentComputerFragment

已编辑:

我正在添加这张不同颜色的图片,这样你就知道什么是大小了。

这里是颜色定义

灰色 - MainActivity 浅蓝色 - FirstFragment 红色 - BookFragment

【问题讨论】:

你可以用viewpager2match parent代替wrap content,希望能解决你的问题。 【参考方案1】:

您的代码运行良好,但您的代码有一些小错误,因此您可以按照此代码进行操作 -

<?xml version="1.0" encoding="utf-8"?>
<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_
android:layout_
android:background="#BBF8FF"
tools:context=".FirstFragment">

<ScrollView
    android:layout_
    android:layout_
    android:fillViewport="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <RelativeLayout
        android:layout_
        android:layout_>


        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabLayout"
            android:layout_
            android:layout_
            app:tabGravity="fill"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentStart="true"
            app:tabMode="fixed"/>

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewPager"
            android:layout_
            android:layout_
            android:layout_below="@id/tabLayout"
            android:layout_alignParentStart="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentBottom="true"/>

      </RelativeLayout>

  </ScrollView>
 </androidx.constraintlayout.widget.ConstraintLayout>

【讨论】:

以上是关于片段内的片段不能与 ScrollView 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

ViewPager 中片段内的 ScrollView 内的 Horizo​​ntalListView

每行带有 EditText 的 Listview , Listview 的 FooterView 内的 Scrollview , adjustResize 和 adjustPan 都工作在一起

android如何使用listview而不是scrollview

我应该使用 ScrollView 还是 RecyclerView 在片段中滚动?

在android中的类内的对话框片段的线性布局中添加textview

活动中 TabLayout 内的片段的约束问题