新版AndroidStudio通过系统快捷创建带BottomNavigationView的项目踩坑记录

选择上面这个玩意创建的项目

坑点1 :配置的写法和不一样了

镜像的写法:

新的settings.gradle.kts中配置镜像的代码:

Kotlin 复制代码
pluginManagement {
    repositories {
        mavenCentral()
        google {
            content {
                includeGroupByRegex("com\\.android.*")
                includeGroupByRegex("com\\.google.*")
                includeGroupByRegex("androidx.*")
            }
        }
        maven("https://jitpack.io")
        maven("https://maven.aliyun.com/repository/gradle-plugin")
        maven("https://maven.aliyun.com/repository/releases")
        maven("https://maven.aliyun.com/repository/jcenter")
        maven("https://maven.aliyun.com/repository/google")
        maven("https://maven.aliyun.com/repository/central")
        maven("https://maven.aliyun.com/repository/public")

        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        mavenCentral()
        google()
//        maven{
//            url = uri("https://jitpack.io")
//        }
        maven("https://jitpack.io")
        maven("https://maven.aliyun.com/repository/gradle-plugin")
        maven("https://maven.aliyun.com/repository/releases")
        maven("https://maven.aliyun.com/repository/jcenter")
        maven("https://maven.aliyun.com/repository/google")
        maven("https://maven.aliyun.com/repository/central")
        maven("https://maven.aliyun.com/repository/public")
    }
}

rootProject.name = "XXX" //自己的名称
include(":app")
 
导包的写法:

最新导包是使用toml文件来配的

比如我想导入的包是:com.github.getActivity:ShapeDrawable:3.0

那么就需要在libs.versions.toml中这样写:

Kotlin 复制代码
。。。
shapeDrawable = "3.0"

[libraries]
。。。
shapedrawable = { group = "com.github.getActivity", name = "ShapeDrawable", version.ref = "shapeDrawable"}

。。。

在app下的build.gradle中这样使用:

Groovy 复制代码
dependencies {
。。。
    implementation(libs.shapedrawable)
。。。
}

坑点2:导航栏的问题

这个方式创建的项目需要带导航栏 (seekBar ?记不太清),如果你再AndroidManifest文件的application中将主题设置为无导航栏的主题(NoActionBar或者自己定义的无导航栏主题)的话,编译会报错 :

Process: net.zhineng.liumanager, PID: 26836

java.lang.RuntimeException: Unable to start activity ComponentInfo{net.zhineng.liumanager/net.zhineng.liumanager.MainActivity}: java.lang.IllegalStateException: Activity 包名.MainActivity@c355c7d does not have an ActionBar set via setSupportActionBar()

解决办法:使用系统自带的DarkActionBar主题 ,再使用代码隐藏,缺点是每个activity中都要写隐藏代码

Kotlin 复制代码
//kotlin
supportActionBar!!.hide()

//java
if (getSupportActionBar() != null) {
    getSupportActionBar().hide();
}

【Android】does not have an ActionBar set via setSupportActionBar()-CSDN博客

坑点3.findNavController方法报错:

java.lang.RuntimeException: Unable to start activity ComponentInfo{net.zhineng.liumanager/net.zhineng.liumanager.MainActivity}: java.lang.IllegalStateException: Activity 你的包名.MainActivity@22742e6 does not have a NavController set on 2131231061

解决办法:添加initNavController方法的代码

Kotlin 复制代码
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

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

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        supportActionBar!!.hide()

        val navView: BottomNavigationView = binding.navView

        val navController = findNavController(R.id.nav_host_fragment_activity_main)

        val appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications
            )
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }

    fun initNavController() {
        //获取mFragments成员变量
        val mFragmentsField = FragmentActivity::class.java.getDeclaredField("mFragments").apply {
            isAccessible = true
        }
        //获取mCreated成员变量
        val mCreatedField = FragmentActivity::class.java.getDeclaredField("mCreated").apply {
            isAccessible = true
        }
        //获取dispatchActivityCreated方法
        val dispatchActivityCreatedMethod =
            FragmentController::class.java.getDeclaredMethod("dispatchActivityCreated").apply {
                isAccessible = true
            }
        //调用dispatchActivityCreated方法
        dispatchActivityCreatedMethod.invoke(mFragmentsField.get(this))

        //别忘了把mCreated设置为true,防止dispatchActivityCreated在onStart中再次调用
        mCreatedField.set(this, true)
    }
}

Android Navigation 报错does not have a NavController set on xxxxx 解决方案-CSDN博客

坑点4:webView加载写死的Url时加载不出网址

原因:

webView不允许加载显示的url,既http://这样的链接

没有申明网络权限

解决方法

关于第一条的 ,条件允许可以直接将http改为https 看能不能加载,不行的话就使用我找到的别的大佬的方法试试:

【已解决】Android WebView net::ERR_CLEARTEXT_NOT_PERMITTED_android webview 域名异常-CSDN博客 第二条:网络权限在AndroidManifest文件中静态申请一下就行

XML 复制代码
    <uses-permission android:name="android.permission.INTERNET" />

坑点5: 编译报错: Execution failed for task ':app:checkDebugDuplicateClasses'.

解决方法:

项目的gradle.properties文件中添加一行代码:

复制代码
android.enableJetifier = true

好了上面就是我做这个项目碰到的所有问题了,代码这个东西确实是一点点都不能错,dk、gradle 版本以及jdk的版本都要相互对应 ,一个高了或者低了都会导致出问题,项目里面配置的信息也要保证兼容,一招不慎就是全屏标红,这简直是我这种小白的恶梦,这时候就要感谢发布攻略,教程的各位大佬们了,每次碰到的问题一般都有前辈踩坑解决了,感谢各位大佬!所以我也会来总结一下,一方面可以以后自己碰到了回来抄代码,另一方面也希望我的这些经验可以帮助到后来者,不骄不躁,我们共同成长吧!!!

相关推荐
李新_1 小时前
一个复杂Android工程开发前我们要考虑哪些事情?
android·程序员·架构
casual_clover2 小时前
Android 中解决 Button 按钮背景色设置无效的问题
android·button
峥嵘life2 小时前
Android14 通过AMS 实例获取前台Activity 信息
android·安全
pengyu4 小时前
【Kotlin系统化精讲:伍】 | 数据类型之空安全:从防御性编程到类型革命🚀
android·kotlin
叽哥4 小时前
flutter学习第 11 节:状态管理进阶:Provider
android·flutter·ios
2501_916013746 小时前
移动端网页调试实战,跨设备兼容与触控交互问题排查全流程
android·ios·小程序·https·uni-app·iphone·webview
顾林海6 小时前
深入理解Java内存屏障:从原理到实践
android·面试·性能优化
叽哥6 小时前
flutter学习第 10 节:表单与输入
android·flutter·ios
狂浪天涯7 小时前
Android 16 显示系统 | 从View 到屏幕系列 - 10 | SurfaceFling 合成 (三)
android