Android单Activity架构下如何使Fragment全屏显示
核心思路
利用Navigation的目的地监听控制视图显隐,同时在DetailsFragment中替换Activity的ActionBar为自身Toolbar,无需新建Activity即可满足需求。
1. 主Activity监听导航目的地,控制底部导航与Toolbar
在MainActivity中添加OnDestinationChangedListener,根据当前导航目的地动态切换底部导航和Activity自带Toolbar的显示状态:
class MainActivity : AppCompatActivity() { private lateinit var navController: NavController private lateinit var bottomNavView: BottomNavigationView private lateinit var activityToolbar: Toolbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) navController = findNavController(R.id.nav_host_fragment) bottomNavView = findViewById(R.id.bottom_nav) activityToolbar = findViewById(R.id.activity_toolbar) // 初始化Activity的Toolbar setSupportActionBar(activityToolbar) // 监听导航页面切换 navController.addOnDestinationChangedListener { _, destination, _ -> when (destination.id) { R.id.detailsFragment -> { // 进入详情页时隐藏底部导航和Activity Toolbar bottomNavView.visibility = View.GONE activityToolbar.visibility = View.GONE } else -> { // 其他页面恢复显示 bottomNavView.visibility = View.VISIBLE activityToolbar.visibility = View.VISIBLE } } } // 关联底部导航与Navigation组件 bottomNavView.setupWithNavController(navController) } }
2. 配置DetailsFragment的Toolbar,替换Activity的ActionBar
第一步:编写DetailsFragment布局
在fragment_details.xml中添加自定义Toolbar:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.appcompat.widget.Toolbar android:id="@+id/details_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> <!-- 详情内容区域 --> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="详情内容展示" android:padding="16dp" /> </LinearLayout>
第二步:在DetailsFragment中设置Toolbar为ActionBar
class DetailsFragment : Fragment() { private lateinit var detailsToolbar: Toolbar private val navController by lazy { findNavController() } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_details, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) detailsToolbar = view.findViewById(R.id.details_toolbar) // 将当前Fragment的Toolbar设置为Activity的ActionBar (activity as AppCompatActivity).setSupportActionBar(detailsToolbar) // 显示返回按钮 (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) // 处理返回按钮点击事件 detailsToolbar.setNavigationOnClickListener { navController.popBackStack() } } override fun onDestroyView() { super.onDestroyView() // 销毁Fragment时恢复Activity原Toolbar,避免影响其他页面 val mainActivity = activity as MainActivity mainActivity.setSupportActionBar(mainActivity.activityToolbar) mainActivity.supportActionBar?.setDisplayHomeAsUpEnabled(false) } }
3. 列表项跳转逻辑示例
在RecyclerView的Adapter中,通过Navigation组件跳转到DetailsFragment:
// 列表项点击事件 itemView.setOnClickListener { val directions = ListFragmentDirections.actionListFragmentToDetailsFragment(itemId) findNavController().navigate(directions) }
内容的提问来源于stack exchange,提问作者DeKekem
相关产品推荐
相关产品推荐

