简体   繁体   English

将Android API从27降级到21(KOTLIN)后出现错误

[英]Error after downgrade Android API from 27 to 21 (KOTLIN)

I tried to downgrade my app from api 27 to 21 because my target api is from 21 to 27. But it can only run on API 26 and 27. After downgrade i try to install on API 21 then the app cannot open (it stopped working after open) 我尝试将我的应用程序从api 27降级到21,因为我的目标api是从21降到27。但是它只能在API 26和27上运行。降级后,我尝试在API 21上安装,然后该应用程序无法打开(它停止工作打开后)

Here is my main_activity 这是我的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
    }


}

Then this is the error on debug 这是调试错误

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.ddm.xposed.digi_com, PID: 2279 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ddm.xposed.digi_com/com.ddm.xposed.digi_com.MainActivity}: android.view.InflateException: Binary XML file line #16: Error inflating class android.support.design.widget.NavigationView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 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) 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. 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.support.design.widget.NavigationView,位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298),位于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(本机方法),位于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) Caused by: android.view.InflateException: Binary XML file line #16: Error inflating class android.support.design.widget.NavigationView at android.view.LayoutInflater.createView(LayoutInflater.java:633) 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.perfo os.ZygoteInit.main(ZygoteInit.java:694)原因:android.view.InflateException:二进制XML文件行#16:错误膨胀了android.view.LayoutInflater.createView(LayoutInflater)类android.support.design.widget.NavigationView .java:633),位于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)在com.ddm.xposed.digi_com.MainActivity.onCreate(MainActivity.kt:32)上的android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)在android.app.Activity.performCreate(Activity.java: 5937),位于android.app.ActivityThread.perfo,位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) rmLaunchActivity(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) 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) Caused by: 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) rmLaunchActivity(ActivityThread.java:2251)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)在android.app.ActivityThread.access $ 800(ActivityThread.java:144)在android.app.ActivityThread $ H.handleMessage( android.os.Handler.dispatchMessage(Handler.java:102)上的ActivityThread.java:1278)android.app.ActivityThread.main(ActivityThread.java:5221)上android.os.Looper.loop(Looper.java:135)上的ActivityThread.java:1278) ),位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java)的java.lang.reflect.Method.invoke(Method.java:372)处的java.lang.reflect.Method.invoke(本机方法) :899),位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694),由以下原因引起:java.lang.reflect.Constructor.newInstance(本机方法)处的java.lang.reflect.InvocationTargetException .reflect.Constructor.newInstance(Constructor.java:288)在android.view.LayoutInflater.createView(LayoutInflater.java:607)在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(Handle 在android.view.LayoutInflater.rInflate(LayoutInflater.java:806)在android.view.LayoutInflater.inflate(LayoutInflater.java:504)在android.view.LayoutInflater.inflate(LayoutInflater.java:414)在android.view。 android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249)上的LayoutInflater.inflate(LayoutInflater.java:365)在com.android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)上.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 $ android.os.Handler.dispatchMessage(Handle)上的H.handleMessage(ActivityThread.java:1278) r.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) Caused by: android.content.res.Resources$NotFoundException: Resource ID r.java:102)位于android.os.Looper.loop(Looper.java:135)位于android.app.ActivityThread.main(ActivityThread.java:5221)位于java.lang.reflect.Method.invoke(本机方法)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:899)处的com.android.internal.os.ZygoteInit.main处的java.lang.reflect.Method.invoke(Method.java:372) (ZygoteInit.java:694)由:android.content.res.Resources $ NotFoundException:资源ID

0x7f060057 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) 

Based on my answer on this SO 根据我的回答对这个SO

You are experiencing this issue because you have resources in drawable-v26 only and you are trying to reference them in v21. 您正在遇到此问题,因为您仅在drawable-v26中拥有资源,并且试图在v21中引用它们。 Either move them to drawable folder or drawable-v21 (if these resources are not required in lower version) 将它们移动到drawable文件夹或drawable-v21(如果较低版本中不需要这些资源)

Explanation: 说明:

When you request a resource for which you provide alternatives, Android selects which alternative resource to use at runtime, depending on current device configuration. 当您请求提供替代资源的资源时,Android会根据当前设备配置选择运行时要使用的替代资源。

Lets say your current OS version is 23: 假设您当前的操作系统版本为23:

OS tries selects drawables from drawable-v23 by comparing the device configuration to available alternative resources. 操作系统尝试通过将设备配置与可用替代资源进行比较,从drawable-v23选择可drawable-v23

Based on the documentation : 根据文档

The system arrives at its decision for which resources to use with the following logic: The flowchart of how Android finds the best-matching resource is as follows 系统根据以下逻辑决定使用哪种资源:Android如何找到最匹配的资源的流程图如下

Android如何找到最匹配的资源的流程图。

The precedence is based on the table defined here 优先级基于此处定义的表

It actually works on selection by elimination. 它实际上适用于消除选择。 It will first eliminate drawable-v24 and above and try to find the drawable in drawable-v23 and below. 它将首先消除drawable-v24及更高版本,并尝试在drawable-v23及更低版本中找到drawable。 Since it cannot find the drawables in drawable-v23 and below it throws the exception 由于无法在drawable-v23及以下版本中找到可drawable-v23 ,因此引发异常

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM