在嵌套TabLayout的Fragment中无法显示Snackbar问题求助
修复方案
你遇到的Snackbar不显示问题可通过以下三处修改解决:
- 调整Snackbar锚点:嵌套在TabLayout中的Fragment不能直接使用自身根View作为Snackbar的锚点,该View会被父容器限制无法完整渲染Snackbar,改为使用Activity全局根布局或者页面内的FloatingActionButton作为锚点即可。
- 更新网络状态判断逻辑:你当前使用的
activeNetworkInfo已在API 29(Android 10)中废弃,高版本系统中该方法返回值会出现异常,导致无网络时也不会触发Snackbar展示逻辑。 - 检查清单文件权限:确保你已经在
AndroidManifest.xml中添加了网络状态访问权限,否则网络判断逻辑会直接报错无法执行,所需权限如下:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
修改后的核心代码如下:
class Books : Fragment(), bookadapter.OnBookItemClicklistner { lateinit var addbooks: FloatingActionButton lateinit var bookrecyclerView: RecyclerView lateinit var bookadapter: bookadapter lateinit var database: FirebaseDatabase lateinit var databaseReference: DatabaseReference lateinit var auth: FirebaseAuth var booklist = arrayListOf<Booksmodel>() lateinit var bookprogressbar: ProgressBar override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment val view = inflater.inflate(R.layout.fragment_books, container, false) setHasOptionsMenu(true) addbooks = view.findViewById(R.id.booksFAB) bookrecyclerView = view.findViewById(R.id.bookrecyclerview) bookrecyclerView.setHasFixedSize(true) bookprogressbar = view.findViewById(R.id.bookprogressbar) bookprogressbar.visibility = View.VISIBLE auth = FirebaseAuth.getInstance() database = FirebaseDatabase.getInstance() databaseReference = database.getReference("Books") booklist.clear() bookrecyclerView.layoutManager = LinearLayoutManager(context) showbooks() addbooks.setOnClickListener { startActivity(Intent(context, Addbooks::class.java)) } if (!isconnected(requireContext())) { // 方法1:使用Activity根布局作为锚点 val snackbar = Snackbar.make(requireActivity().findViewById(android.R.id.content), "No Internet", Snackbar.LENGTH_INDEFINITE) // 方法2:如果希望Snackbar不遮挡FAB,可直接锚定到FAB // val snackbar = Snackbar.make(addbooks, "No Internet", Snackbar.LENGTH_INDEFINITE) snackbar.show() } return view } private fun isconnected(context: Context): Boolean { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager // 适配全版本系统的网络判断逻辑 return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val network = connectivityManager.activeNetwork ?: return false val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) } else { @Suppress("DEPRECATION") val networkInfo = connectivityManager.activeNetworkInfo networkInfo != null && networkInfo.isConnectedOrConnecting } } }
如果修改后还存在Snackbar被底部导航栏或者其他页面控件遮挡的情况,只需要将承载Fragment的Activity根布局替换为CoordinatorLayout即可。
内容的提问来源于stack exchange,提问作者Ashish Dawkhar
相关产品推荐
相关产品推荐

