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

相关推荐
非凡ghost1 小时前
PowerDirector安卓版(威力导演安卓版)
android·windows·学习·软件需求
独行soc2 小时前
2026年渗透测试面试题总结-19(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
爱装代码的小瓶子3 小时前
【C++与Linux基础】进程间通讯方式:匿名管道
android·c++·后端
兴趣使然HX3 小时前
Android绘帧流程解析
android
JMchen1234 小时前
Android UDP编程:实现高效实时通信的全面指南
android·经验分享·网络协议·udp·kotlin
黄林晴5 小时前
Android 17 再曝猛料:通知栏和快捷设置终于分家了,这操作等了十年
android
有位神秘人5 小时前
Android获取设备中本地音频
android·音视频
JMchen1235 小时前
Android网络安全实战:从HTTPS到双向认证
android·经验分享·网络协议·安全·web安全·https·kotlin
CS创新实验室5 小时前
Pandas 3 的新功能
android·ide·pandas
ujainu6 小时前
护眼又美观:Flutter + OpenHarmony 鸿蒙记事本一键切换夜间模式(四)
android·flutter·harmonyos