将Android API从27降级到21(KOTLIN)后发生错误

时间:2018-06-22 07:04:36

标签: java android gradle 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 / Android运行时:致命异常:主要                     程序: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(本机方法)                         在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.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(本地方法)                         在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)

1 个答案:

答案 0 :(得分:1)

根据我对此SO的回答

  

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

说明:

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

可以说您当前的操作系统版本是23:

OS尝试通过将设备配置与可用的备用资源进行比较来从import boto3, json # Create IAM client iam = boto3.resource('iam') policy = iam.Policy('arn:aws:iam::ACCCOUNT_ID:policy/CustomS3Policy') version = policy.default_version policyJson = version.document policyJson['Statement'][0]['Resource'].append('arn:aws:s3:::anotherbucket/*') print(policyJson) client = boto3.client('iam') response = client.delete_policy( PolicyArn='arn:aws:iam::ACCCOUNT_ID:policy/CustomS3Policy' ) print(response) response = client.create_policy( PolicyName='CustomS3Policy', PolicyDocument=json.dumps(policyJson) ) print(response) 中选择可绘制对象。

基于documentation

系统通过以下逻辑决定要使用哪些资源: Android如何找到最匹配的资源的流程图如下

Flowchart of how Android finds the best-matching resource.

优先级基于定义的here

它实际上可以通过消除进行选择。它将首先消除drawable-v23及以上的内容,并尝试在drawable-v24及以下的内容中找到可绘制对象。由于无法在drawable-v23中找到可绘制对象,因此它会引发异常