마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

스크롤뷰 안에 배치된 프래그먼트에 컨텐츠 표시할때 컨텐츠 표시 길이에 따라 하단 네비게이션 바의 높이가 바뀝니다

0 추천
수고 많으십니다.

지금 개발하는 앱은 화면 상단에 스크롤뷰를 두고 그 안에 데이터 바인딩으로 프래그먼트 표시를 하는 구조구요. 화면 하단에 하단 네비게이션 바를 두고 프래그먼트를 옮겨다니게 구성했습니다.

그런데 프래그먼트에 충분한 량의 컨텐츠가 아니게 표시되면 (화면의 5분의 3정도까지, 또는 그보다 적게 되면) 하단 네비게이션 바의 높이가 5px~8px 정도씩 바뀝니다. 스크롤해서 봐야 할 정도의 컨텐츠가 표시되면 의도한대로 높이가 표시되구요.

혹시 보고된 사례가 있나요?

레이아웃 XML에서 하단 네비게이션 바의 android:height를 설정해도 안되구요. weight를 줘도 안됩니다. XML 문제라면 스크롤뷰의 android:height 설정이나 weight 설정도 잘 해놔야 할듯한데 이게 문제일까요 아니면 다른 문제가 있을까요?
청색공책 (500 포인트) 님이 2022년 2월 10일 질문
XML레이아웃을 확인하는게 빠르므로 해당 내용을 올려보세요.
답변 감사드립니다.

activity_main.xml:

<layout 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">

    <data/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/darkBeige"
        android:layout_margin="0dp"
        android:paddingBottom="0dp"
        android:orientation="vertical"
        tools:context="info.shutterpress.idols.MainActivity">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:defaultNavHost="true"
            app:navGraph="@navigation/nav_main" />

        <com.google.android.material.bottomnavigation.BottomNavigationView
            app:menu="@menu/menu_bottom_navigation"
            android:id="@+id/bottom_navigation_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight=".1"
            android:padding="10dp"
            android:theme="@style/Theme.bottomNavApp"
            app:backgroundTint="@color/beige"
            app:background="@color/beige"
            app:itemIconTint="@color/black"
            app:itemTextColor="@color/black" />

    </LinearLayout>
</layout>

fragment_recyclerview.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout 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">
    <data>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="35dp"
        android:id="@+id/recyclerview_fragment">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/idols_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            tools:context="info.shutterpress.idols.MainActivity"
            tools:listitem="@layout/item_view"/>

    </LinearLayout>
</layout>

fragment_main.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="0dp"
        android:paddingBottom="0dp"
        android:layout_margin="0dp"
        android:background="@color/darkBeige"
        android:gravity="start"
        android:orientation="vertical">
        <TextView
            android:padding="4dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/app_name"
            android:paddingTop="10dp"
            android:gravity="center"
            android:textSize="35sp"
            android:textColor="#FFFFFF"
            android:textStyle="bold"/>

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/darkBeige"
            android:layout_margin="0dp"
            android:paddingTop="0dp"
            android:paddingBottom="0dp"
            android:scrollbarSize="12dip" >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="0dp"
                android:paddingBottom="0dp"
                android:layout_margin="0dp"
                android:background="@color/darkBeige"
                android:gravity="start"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/welcome_message"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@color/darkBeige"
                    android:layout_margin="0dp"
                    android:paddingTop="0dp"
                    android:padding="20dp"
                    android:gravity="start"
                    android:textSize="@dimen/text_size_main"
                    android:lineSpacingExtra="@dimen/line_spacing_main"
                    android:text="@string/welcome_message"
                    android:textColor="#de000000" />

            </LinearLayout>
        </ScrollView>
    </LinearLayout>
</layout>

그외 다른 프래그먼트 XML도 있습니다.

1개의 답변

0 추천

LinearLayout 안에 있는 뷰들에 weight를 사용하시려면  orientation에 해당하는 쪽을 0dp 주셔야 합니다. 위의 경우는 vertical이므로 layout_height="0dp"를 주셔야 합니다.

<androidx.fragment.app.FragmentContainerView
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp" <!--- 0dp -->
            android:layout_weight="1"
            app:defaultNavHost="true"
            app:navGraph="@navigation/nav_main" />

        <com.google.android.material.bottomnavigation.BottomNavigationView
            app:menu="@menu/menu_bottom_navigation"
            android:id="@+id/bottom_navigation_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" 
            android:layout_weight=".1". <!--- 필요없어 보임 -->
            android:padding="10dp"
            android:theme="@style/Theme.bottomNavApp"
            app:backgroundTint="@color/beige"
            app:background="@color/beige"
            app:itemIconTint="@color/black"
            app:itemTextColor="@color/black" />

 weight를 사용하는 다른 뷰들도 리뷰해 보세요. wrap_content/match_parent 만 사용하시던가 wrap_content="0dp" + weight를 사용하시던가 둘중의 하나만 하세요.

spark (226,420 포인트) 님이 2022년 2월 10일 답변
아하 그렇군요! 조언주신대로 해보니 됩니다. 컨테이너뷰의 layout_height를 0dp로, layout_weight는 1로 하단네비게이션뷰는 layout_weight 삭제, 나머지는 그대로 해두니 됩니다!! 감사합니다!
...