java - 将 Android API 从 27 降级到 21 (KOTLIN) 后出错
问题描述
我试图将我的应用程序从 api 27 降级到 21,因为我的目标 api 从 21 到 27。但它只能在 API 26 和 27 上运行。降级后我尝试在 API 21 上安装然后应用程序无法打开(它停止工作打开后)
这是我的 main_activity
package com.ddm.xposed.digi_com
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.design.widget.NavigationView
import android.support.v4.view.GravityCompat
import android.support.v7.app.ActionBarDrawerToggle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.widget.Toast
import com.felhr.usbserial.UsbSerialDevice
import com.felhr.usbserial.UsbSerialInterface
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar_main.*
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
var unlock : Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
val toggle = ActionBarDrawerToggle(
this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
drawer_layout.setDrawerListener(toggle)
toggle.syncState()
nav_view.setItemIconTintList(null);
nav_view.setNavigationItemSelectedListener(this)
displayScreen(-1)
}
override fun onBackPressed() {
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
} else {
super.onBackPressed()
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
when (item.itemId) {
R.id.action_settings -> return true
else -> return super.onOptionsItemSelected(item)
}
}
fun displayScreen(id: Int){
val fragment = when(id){
R.id.nav_connect -> {
ConnectFragment()
}
else -> {
ConnectFragment()
}
}
supportFragmentManager.beginTransaction().replace(R.id.relativeLayout,fragment).commit()
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
// Handle navigation view item clicks here.
displayScreen(item.itemId)
drawer_layout.closeDrawer(GravityCompat.START)
return true
}
}
然后这是调试的错误
E/AndroidRuntime:致命异常:主进程:com.ddm.xposed.digi_com,PID:2279 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.ddm.xposed.digi_com/com.ddm.xposed.digi_com.MainActivity }: android.view.InflateException: 二进制 XML 文件第 16 行:在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 在 android.app.ActivityThread.handleLaunchActivity 的类 android.support.design.widget.NavigationView 膨胀时出错(ActivityThread.java:2360) 在 android.app.ActivityThread.access$800(ActivityThread.java:144) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Handler.dispatchMessage(Handler .java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang .reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java :694) 原因:android.view.InflateException:二进制 XML 文件第 16 行:在 android.view 的 android.view.LayoutInflater.createView(LayoutInflater.java:633) 处的 android.view.LayoutInflater.createView 类 android.support.design.widget.NavigationView 膨胀错误.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:414) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:504) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:806)。 view.LayoutInflater.inflate(LayoutInflater.java:365) 在 android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249) 在 android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)在 com.ddm.xposed.digi_com.MainActivity.onCreate(MainActivity.kt:32) 在 android.app.Activity.performCreate(Activity.java:5937) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 在 android.app.ActivityThread.access$800(ActivityThread.java:144)在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android。 app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal。操作系统。ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 原因:java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor。 newInstance(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:288) at android.view.LayoutInflater.createView(LayoutInflater.java:607) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java: 743) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:504) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:414) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:365) 在 android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249) 在 android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity .java:106) 在 com.ddm.xposed.digi_com.MainActivity.onCreate(MainActivity.kt:32) 在 android.app.Activity.performCreate(Activity.java:5937) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation. java:1105) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 在 android.app。ActivityThread.access$800(ActivityThread.java:144) 在 android.os.Looper 的 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)。 loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect.Method.invoke(Method. java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 原因:android.content .res.Resources$NotFoundException:资源 ID在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Looper.loop( Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect.Method.invoke(Method.java: 372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 引起:android.content.res .Resources$NotFoundException:资源 ID在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Looper.loop( Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect.Method.invoke(Method.java: 372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 引起:android.content.res .Resources$NotFoundException:资源 IDapp.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread .main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 原因:android.content.res.Resources$NotFoundException:资源 IDapp.ActivityThread$H.handleMessage(ActivityThread.java:1278) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread .main(ActivityThread.java:5221) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 原因:android.content.res.Resources$NotFoundException:资源 IDdispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit .main(ZygoteInit.java:694) 引起:android.content.res.Resources$NotFoundException:资源IDdispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit .main(ZygoteInit.java:694) 引起:android.content.res.Resources$NotFoundException:资源ID在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal 的 java.lang.reflect.Method.invoke(Method.java:372) 调用(本机方法)。 os.ZygoteInit.main(ZygoteInit.java:694) 引起:android.content.res.Resources$NotFoundException:资源ID在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal 的 java.lang.reflect.Method.invoke(Method.java:372) 调用(本机方法)。 os.ZygoteInit.main(ZygoteInit.java:694) 引起:android.content.res.Resources$NotFoundException:资源ID
0x7f060057
at android.content.res.Resources.getValue(Resources.java:1233) at android.content.res.Resources.getDrawable(Resources.java:756) at android.content.Context.getDrawable(Context.java:402) at android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21.java:26) at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:319) at android.support.v7.internal.widget.TintManager.getDrawable(TintManager.java:145) at android.support.v7.internal.view.menu.MenuItemImpl.getIcon(MenuItemImpl.java:422) at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.prepareMenuItems(NavigationMenuPresenter.java:393) at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.<init>(NavigationMenuPresenter.java:255) at android.support.design.internal.NavigationMenuPresenter.getMenuView(NavigationMenuPresenter.java:97) at android.support.design.widget.NavigationView.<init>(NavigationView.java:149) at android.support.design.widget.NavigationView.<init>(NavigationView.java:88) at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:288) at android.view.LayoutInflater.createView(LayoutInflater.java:607) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at android.view.LayoutInflater.inflate(LayoutInflater.java:365) at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106) at com.ddm.xposed.digi_com.MainActivity.onCreate(MainActivity.kt:32) at android.app.Activity.performCreate(Activity.java:5937) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221)
解决方案
根据我对此SO的回答
您遇到此问题是因为您只有 drawable-v26 中的资源,并且您试图在 v21 中引用它们。将它们移动到drawable文件夹或drawable-v21(如果低版本不需要这些资源)
解释:
当您请求提供替代资源的资源时,Android 会根据当前设备配置选择在运行时使用哪个替代资源。
假设您当前的操作系统版本是 23:
drawable-v23
操作系统通过将设备配置与可用的替代资源进行比较来尝试从中选择可绘制对象。
根据文档:
系统通过以下逻辑来决定使用哪些资源:Android如何找到最佳匹配资源的流程图如下
优先级基于此处定义的表
它实际上适用于消除选择。它将首先消除drawable-v24
和上方并尝试找到可绘制的内容drawable-v23
和下方。由于它无法在其中drawable-v23
和下方找到可绘制对象,因此会引发异常
推荐阅读
- mysql - 与子查询相比,为什么左外连接查询给出不同的结果?
- javascript - 在 Showdown 中忽略多个 \n 实例
- python - Python 没有检测到 Heroku 配置
- image - 用于签署 Node/Cloudinary 的签名字符串无效
- java - Hibernate如何使实体类的模式名称可配置
- java - isShowing() 与 isDisplayable()
- arrays - 在屏幕上访问和显示嵌套数组 React Native
- c++ - C++中多线程并发向单个MySQL表插入数据
- dart - 错误:映射 Dart 映射时,“类型‘字符串’不是‘int’类型的子类型”
- android - 为什么不播放通知设置?安卓工作室