当前位置: 首页 > article >正文

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

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

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

镜像的写法:

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

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中这样写:

。。。
shapeDrawable = "3.0"

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

。。。

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

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
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方法的代码

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文件中静态申请一下就行

    <uses-permission android:name="android.permission.INTERNET" />

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

解决方法:

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

android.enableJetifier = true

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


http://www.kler.cn/a/504837.html

相关文章:

  • C++并发编程之std::partial_sum的并行版本
  • 二十三种模式-适配器模式
  • 每日学习30分轻松掌握CursorAI:Cursor插件系统与扩展功能
  • 【数据结构学习笔记】19:跳表(Skip List)
  • 主数据系统建设模式分析
  • html中鼠标位置信息
  • 服务器、电脑和移动手机操作系统
  • HDMI接口
  • 代码随想录算法训练营第十三天(2)|541. 反转字符串II
  • 在服务器上增加新网段IP的路由配置
  • msxml安装失败怎么办,如何解决
  • 如何通过 Zero Trust 模型防止内外部威胁?
  • H3CNE-12-静态路由(一)
  • hot100_240. 搜索二维矩阵 II
  • Spring boot面试题---- Spring Boot 自动配置的原理
  • 数字人助力企业出海增长,魔珐科技亮相2025晋江跨境电商峰会
  • LeetCode:131. 分割回文串
  • Elasticsearch实战指南:从入门到高效使用
  • 【优选算法篇】:分而治之--揭秘分治算法的魅力与实战应用
  • vue3+ts+element-plus 输入框el-input设置背景颜色
  • 【机器学习】实战:天池工业蒸汽量项目(二)特征工程
  • java 设计模式 建造者模式
  • 基于 STM32 连接 Mini MP3 播放器的实践探索
  • 使用vue3实现语音交互的前端页面
  • 《解决OpenMP运行时库副本问题:解锁高效编程》
  • 用sql 基线 替换执行计划