Android Studio 不渲染布局

Posted

技术标签:

【中文标题】Android Studio 不渲染布局【英文标题】:Android Studio does not render layout 【发布时间】:2021-09-20 02:29:51 【问题描述】:

我目前正在开发一个 android 应用程序,但遇到了我自己无法解决的问题。

简介

我创建了一个新项目并选择“选项卡式活动”作为该项目的模板。您可能知道,使用此模板创建的项目有 2 个 .xml 文件:activity_main.xml(包含 AppBarLayout ViewPager2) 和 fragment_main.xml。它还设置了 MainActivity.kt 以使选项卡工作,并在其中包含 3 个 .kt 文件的 ui.main 包,这些文件负责显示标签内容,例如“片段#1”等

我想要什么

我需要应用程序具有带有标题、徽标和标签导航的顶部操作栏。总的来说,我需要有 3 个不同的选项卡(片段),它们有自己的布局和逻辑。

我做了什么,发生了什么

所以,我已经自定义了 activity_main.xml 布局,然后为我想要在应用程序。 我已经删除了自动生成的代码并编写了自己的代码。由于我更像是 android 开发的初学者,所以我使用 google 来学习如何绑定 tabsfragments 和 main activity一起。我找到了几篇我认为适合我的文章。

完成代码后,我想检查一下我的带有标签的自定义操作栏和半成品 fragment_dashboard.xml 布局的外观。

所以我尝试运行该应用程序并遇到了问题:当应用程序在模拟手机中启动时,只有一个白屏,没有其他任何东西......(在删除它运行的选项卡的自动生成代码之前没有任何问题)

我想做什么

首先我尝试调试MainActivity.kt。我在函数onCreate()的第一行放了一个断点:

super.onCreate(savedInstanceState, persistentState)

但是当我在调试模式下运行应用程序时,调试器不会在这个断点处停止。因此,我得出一个结论:执行甚至没有到达函数onCreate()

所以,问题是:我做错了什么以及如何解决它才能看到标签及其片段?

代码

DashboardFragment.kt

class DashboardFragment() : Fragment() 
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? 
        return inflater.inflate(R.layout.fragment_dashboard, container, false);
    

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
        Log.i("DashboardFragment","onViewCreated")
        super.onViewCreated(view, savedInstanceState)
    

ViewPagerFragmentStateAdapter.kt

class ViewPagerFragmentStateAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) 
    var positionToPageName = mapOf(
        0 to "Dashboard"
    )

    private var _pageNameToFragment = mapOf<String, Fragment>(
        "Dashboard" to DashboardFragment()
    )


    override fun getItemCount(): Int = _pageNameToFragment.size

    override fun createFragment(position: Int): Fragment 
        val pageName = positionToPageName[position]
        val page = _pageNameToFragment[pageName]

        return page ?: DashboardFragment() as Fragment
    

ViewPagerFragmentStateAdapter.kt

class MainActivity : AppCompatActivity() 
    private lateinit var tabLayout: TabLayout
    private lateinit var viewPager: ViewPager2

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) 
        super.onCreate(savedInstanceState, persistentState)

        setContentView(R.layout.activity_main)

        val adapter = ViewPagerFragmentStateAdapter(this)

        viewPager = findViewById(R.id.view_pager)
        viewPager.adapter = adapter

        tabLayout = findViewById(R.id.tabs)
        TabLayoutMediator(tabLayout, viewPager) 
            tab, position -> tab.text = adapter.positionToPageName[position]
        .attach()
    

【问题讨论】:

【参考方案1】:

我已尝试更改 MainActivity.kt 中的一些内容。看来问题只是在 onCreate() 函数的定义中:

override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?)   
    super.onCreate(savedInstanceState, persistentState)

我再次使用“选项卡式活动”模板创建了一个测试项目,并注意到在新项目中缺少 persistentState 参数。所以,我只是将它从我的项目中的定义中删除,并且项目开始运行良好。

现在 onCreate() 的定义如下所示:

override fun onCreate(savedInstanceState: Bundle?)   
    super.onCreate(savedInstanceState)

【讨论】:

以上是关于Android Studio 不渲染布局的主要内容,如果未能解决你的问题,请参考以下文章

由于 Android Studio 中的折叠工具栏导致的渲染问题

在 Android Studio 中渲染时不支持 major.minor 版本 52.0

Android Studio 中导航抽屉预览中的渲染问题

在Android Studio中渲染导航抽屉预览中的问题

Android Studio 渲染问题

android studio 渲染和在模拟器上渲染的区别