【问题标题】:Activity to Fragment活动碎片化
【发布时间】:2019-07-06 17:08:33
【问题描述】:

我是第一次使用 Fragments,我正在尝试从 Activity 导航到 Fragment。导航应该由将我带到所述片段的 OnClickListener (ImageView) 处理。但是,我的片段并没有占据整个屏幕。我已经在传入的视图以及应该保存片段的框架上设置了匹配父级。所以总的来说,我不确定我是否对 XML 或 Java 有误解。我将在下面提供尽可能多的内容;

public class recipe_detail extends AppCompatActivity {


    TextView mIngredientsTV;
    RecyclerView ingredientsRecyclerView;
    RecyclerView stepsRecyclerView;
    ImageView mBakingGif;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recipe_detail);


        mBakingGif.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.add(R.id.frag_container, new VideoFragment());
                ft.commit();
            }
        });


}



public class VideoFragment extends Fragment {

    ImageView mThumbnailImage;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {


        return inflater.inflate(R.layout.video_fragment, container, true);

    }


    // This event is triggered soon after onCreateView().
    // Any view setup should occur here.  E.g., view lookups and attaching view listeners.
    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {


        mThumbnailImage = view.findViewById(R.id.exo_player_view);


        Drawable myDrawable = getResources().getDrawable(R.drawable.ic_launcher_background);
        mThumbnailImage.setImageDrawable(myDrawable);


    }

}

<!--Activity to be Replaced-->

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/ScrollView01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">


    <RelativeLayout
        android:id="@+id/parent_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/ingredients_header"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical">
            <TextView
                android:id="@+id/ingredients_text_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/Ingredients_header"
                android:textColor="#000"
                android:textSize="18sp"
                android:textStyle="bold"
                tools:text="INGREDIENTS" />


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginTop="10dp"
                android:background="#E0F2F1"
                android:orientation="vertical">


                <android.support.v7.widget.RecyclerView
                    android:id="@+id/ingredients_recycler_view"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />


            </LinearLayout>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:text="@string/steps_label"
                android:textColor="#000"
                android:textSize="20sp"
                android:textStyle="bold" />


            <ImageView
                android:id="@+id/video_thumbnail"
                android:layout_width="match_parent"
                android:layout_height="250dp"
                android:layout_marginTop="20dp"
                android:background="@color/colorPrimaryDark" />

        </LinearLayout>


     <!-- Frame to hold fragment-->
        <FrameLayout
            android:id="@+id/frag_container"
            android:background="@android:color/darker_gray"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </RelativeLayout>

</ScrollView>

<!--Fragment to be infalted-->

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/exo_content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <ImageView
        android:id="@+id/exo_player_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <TextView
        android:id="@+id/description_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/exo_player_view" />


    <TextView
        android:id="@+id/short_description_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/description_tv" />

    <Button
        android:id="@+id/previous_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="Prev" />

    <Button
        android:id="@+id/next_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:text="Next" />

</RelativeLayout>

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    您正在膨胀的片段将始终占用与容纳它的容器一样多的空间。在您的情况下,容器(FrameLayout)的高度为 WRAP_CONTENT。因此,片段将只占用显示其内容所需的空间量。您可以做的是将 FrameLayout 的高度设置为 MATCH_PARENT。这样片段就会占据整个屏幕空间。

    请注意,在另一个视图上添加片段时,请务必记住为片段布局提供一些背景颜色(默认情况下它是透明的)。否则,您之前的视图也将通过片段保持可见。

    编辑(解释性评论)

    您需要像这样将 FrameLayout 从 ScrollView 中移出

    <FrameLayout 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">
    
        <ScrollView
            android:id="@+id/ScrollView01"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
    
            <RelativeLayout
                android:id="@+id/parent_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
    
                <LinearLayout
                    android:id="@+id/ingredients_header"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="center"
                    android:orientation="vertical">
    
                    <TextView
                        android:id="@+id/ingredients_text_view"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/Ingredients_header"
                        android:textColor="#000"
                        android:textSize="18sp"
                        android:textStyle="bold"
                        tools:text="INGREDIENTS" />
    
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginTop="10dp"
                        android:background="#E0F2F1"
                        android:orientation="vertical">
    
                        <android.support.v7.widget.RecyclerView
                            android:id="@+id/ingredients_recycler_view"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content" />
                    </LinearLayout>
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="20dp"
                        android:text="@string/steps_label"
                        android:textColor="#000"
                        android:textSize="20sp"
                        android:textStyle="bold" />
    
                    <ImageView
                        android:id="@+id/video_thumbnail"
                        android:layout_width="match_parent"
                        android:layout_height="250dp"
                        android:layout_marginTop="20dp"
                        android:background="@color/colorPrimaryDark" />
                </LinearLayout>
            </RelativeLayout>
        </ScrollView>
    
        <!-- Frame to hold fragment-->
        <FrameLayout
            android:id="@+id/frag_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </FrameLayout>
    

    我所做的是将片段容器移出 ScrollView。然而,由于一个活动/片段只能有 1 个根元素,我添加了一个 FrameLayout 作为 ScrollView 和 FrameLayout 的父级。

    【讨论】:

    • "请注意,在另一个视图上添加片段时,请务必记住为片段布局提供一些背景颜色(默认情况下它是透明的)。否则,您之前的视图也将通过片段保持可见。 '' 注意.....但是,我已将 WRAP_CONTENT 更改为 MATCH_PARENT,现在我有一个 IllegalStateException:指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()
    • 我现在已经修复了 IllegalStateException 并将 WRAP_CONTENT 更改为 MATCH_PARENT 但 Fragment 仍然出现在整个屏幕的一半。
    • @pureskill75 为您的 FrameLayout 提供以下属性。 android:layout_alignParentTop="true"
    • 不会驳船。但是,如果我在传入布局中更改视图的尺寸,则会出现移动,但我不知道这是否是处理 UI 的好方法?
    • 我认为问题是由于您的片段容器位于滚动视图内。作为一个小测试,将片段容器移到滚动视图之外,并将其宽度和高度设置为 MATCH_PARENT。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多