Android开发:如何让Fragment内容显示在Toolbar与底部导航栏之间
问题描述
我是Android应用开发新手,希望将fragment_home.xml中的LinearLayout显示在顶部Toolbar和底部导航栏之间,但目前该布局显示在Toolbar上方,无法调整至下方。
相关代码
fragment_home.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_width="match_parent" android:layout_height="match_parent" tools:context=".ui.home.HomeFragment"> <LinearLayout android:id="@+id/fragment_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> <include layout="@layout/recent_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" /> <include layout="@layout/recent_message" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
activity_main.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" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#262626"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/purple_500" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:layout_constraintTop_toTopOf="parent" app:title="@string/username" app:titleTextColor="@color/black"> <ImageView android:layout_width="40dp" android:layout_height="40dp" android:id="@+id/userIconToolbar" android:layout_alignParentEnd="true" android:layout_gravity="end" android:layout_marginEnd="10dp" android:clickable="true" android:src="@drawable/user_pb_default" /> </androidx.appcompat.widget.Toolbar> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/nav_view" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="0dp" android:layout_marginEnd="0dp" android:background="#404040" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:menu="@menu/bottom_nav_menu" app:itemTextColor="@drawable/bottom_nav_item_color" app:itemIconTint="@drawable/bottom_nav_item_color" app:labelVisibilityMode="labeled" /> <fragment android:id="@+id/nav_host_fragment_activity_main" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:layout_constraintBottom_toTopOf="@id/nav_view" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="1.0" app:navGraph="@navigation/mobile_navigation" /> </androidx.constraintlayout.widget.ConstraintLayout>
HomeFragment.java
public class HomeFragment extends Fragment { private FragmentHomeBinding binding; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { HomeViewModel homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class); binding = FragmentHomeBinding.inflate(inflater, container, false); View root = binding.getRoot(); return root; } @Override public void onDestroyView() { super.onDestroyView(); binding = null; } }
MainActivity.java
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbarUserIconClick(); BottomNavigationView navView = findViewById(R.id.nav_view); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(R.id.navigation_home, R.id.navigation_direct, R.id.navigation_groups, R.id.navigation_settings).build(); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main); NavigationUI.setupWithNavController(binding.navView, navController); } public void toolbarUserIconClick() { ImageView imageView = (ImageView) findViewById(R.id.userIconToolbar); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Link To Profile Settings Here Toast.makeText(getBaseContext(), "Hello World", Toast.LENGTH_SHORT).show(); } }); } }
当前效果

解决方法
问题核心是activity_main.xml中NavHostFragment的约束设置错误,导致Fragment内容覆盖Toolbar区域,修改步骤如下:
- 调整NavHostFragment的顶部约束:将
app:layout_constraintTop_toTopOf="parent"改为app:layout_constraintTop_toBottomOf="@id/toolbar",让Fragment区域被限制在Toolbar下方。 - 移除多余的垂直偏移属性:删除
app:layout_constraintVertical_bias="1.0",避免Fragment内容偏向底部。
修改后的NavHostFragment代码:
<fragment android:id="@+id/nav_host_fragment_activity_main" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:layout_constraintBottom_toTopOf="@id/nav_view" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/toolbar" app:navGraph="@navigation/mobile_navigation" />
另外,为了让fragment_home.xml中的LinearLayout布局更合理,可以给它添加顶部约束,绑定到父布局顶部:
<LinearLayout android:id="@+id/fragment_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent">
完成以上修改后,LinearLayout就会正确显示在Toolbar和底部导航栏之间的区域。
内容的提问来源于stack exchange,提问作者Zagro
相关产品推荐
相关产品推荐

