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

Posted

技术标签:

【中文标题】将 Android API 从 27 降级到 21 (KOTLIN) 后出错【英文标题】:Error after downgrade Android API from 27 to 21 (KOTLIN) 【发布时间】:2018-12-01 14:33:57 【问题描述】:

我试图将我的应用程序从 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: 致命异常: main 进程:com.ddm.xposed.digi_com,PID:2279 java.lang.RuntimeException:无法启动活动 ComponentInfocom.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(本机方法) 在 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: Binary XML file line #16: Error inflating class android.support.design.widget.NavigationView 在 android.view.LayoutInflater.createView(LayoutInflater.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) 在 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(本机方法) 在 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) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Constructor.newInstance(Native Method) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:288) 在 android.view.LayoutInflater.createView(LayoutInflater.java:607) 在 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.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(本机方法) 在 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

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的回答了吗? 你的compiledSdkVersion是什么。应该是21。另外,所有的支持库版本都应该是21.+ @Sagar 它有效!对此有什么解释吗? @RahulKumar 我使用 API 21 编译,是的,lib 也是 21 我已将解释添加为您可以查看的答案。 【参考方案1】:

根据我对此SO的回答

您遇到此问题是因为您有资源 仅 drawable-v26 并且您试图在 v21 中引用它们。将它们移动到drawable文件夹或drawable-v21(如果这些 低版本不需要资源)

说明:

当您请求提供替代资源的资源时,Android 会根据当前设备配置选择在运行时使用哪个替代资源。

假设您当前的操作系统版本是 23:

操作系统通过将设备配置与可用的替代资源进行比较来尝试从drawable-v23 中选择可绘制对象。

基于documentation:

系统根据以下逻辑决定使用哪些资源: Android寻找最佳匹配资源的流程图如下

优先级基于here定义的表

它实际上适用于消除选择。它将首先消除drawable-v24及以上,并尝试在drawable-v23及以下查找drawable。因为它在drawable-v23 和下面找不到drawables,所以抛出异常

【讨论】:

以上是关于将 Android API 从 27 降级到 21 (KOTLIN) 后出错的主要内容,如果未能解决你的问题,请参考以下文章

从 API 24 降级到 API 23

处理Android SDK版本和定位

FusedLocation 不会触发 android api <= 21 的 locationcallback

如何降级我的 SDK 版本?

我如何将 Laravel 的 Bootstrap 4 降级到 3.3.7

使用 Transition 从 Fragment 启动 Activity(API 21 支持)