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

相关推荐
风浅月明3 分钟前
[Android]页面间传递model列表
android
法迪5 分钟前
Android自带的省电模式主要做什么呢?
android·功耗
风浅月明6 分钟前
[Android]AppCompatEditText限制最多只能输入两位小数
android
没有晚不了安18 分钟前
1.11作业
android
zhangphil21 分钟前
Android Coil3缩略图、默认占位图placeholder、error加载错误显示,Kotlin(1)
android·kotlin
貂蝉空大1 小时前
uni-app开发安卓和ios app 真机调试
android·ios·uni-app
少年芒2 小时前
Leetcode 490 迷宫
android·算法·leetcode
IT猿手2 小时前
2025最新智能优化算法:鲸鱼迁徙算法(Whale Migration Algorithm,WMA)求解23个经典函数测试集,MATLAB
android·数据库·人工智能·算法·机器学习·matlab·无人机
兰琛3 小时前
12.1 Android中协程的基本使用
android
liujingtech5 小时前
Kotlin实践下来 takeIf 并不是所有场景的银弹
android