You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:24:01