首页 > 解决方案 > 引起:android.view.InflateException

问题描述

我正在尝试打开我的应用程序,但这会导致充气错误

日志:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.pokedex, PID: 10007
java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.example.pokedex/com.example.pokedex.ui.main.MainActivity}: 
android.view.InflateException: Binary XML file line #14 in com.example.pokedex:layout/main_activity: 
Binary XML file line #14 in com.example.pokedex:layout/main_activity: Error inflating class 
androidx.fragment.app.FragmentContainerView
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at 
android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
 Caused by: android.view.InflateException: Binary XML file line #14 in 
com.example.pokedex:layout/main_activity: Binary XML file line #14 in 
com.example.pokedex:layout/main_activity: Error inflating class 
androidx.fragment.app.FragmentContainerView
 Caused by: android.view.InflateException: Binary XML file line #14 in 
com.example.pokedex:layout/main_activity: Error inflating class 
androidx.fragment.app.FragmentContainerView
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void 
android.widget.TextView.setOnClickListener(android.view.View$OnClickListener)' on a null object 
reference
    at com.example.pokedex.ui.entrada.EntradaFragment.onCreate(EntradaFragment.kt:31)
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:2936)
    at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:472)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2177)
    at 
androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2094)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1990)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3122)
    at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:3045)
    at androidx.fragment.app.Fragment.onCreate(Fragment.java:1867)
    at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:264)
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:2936)
    at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:472)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2177)
    at 
androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2094)
    at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1959)
    at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:311)
    at androidx.fragment.app.FragmentContainerView.<init>(FragmentContainerView.java:176)
    at 
  androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView
(FragmentLayoutInflaterFactory.java:52)
    at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
    at 
androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:313)
    at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:292)
    at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1067)
E/AndroidRuntime:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:995)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:959)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:1121)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:1124)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:680)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:532)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
    at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696)
    at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170)
    at com.example.pokedex.ui.main.MainActivity.onCreate(MainActivity.kt:41)
    at android.app.Activity.performCreate(Activity.java:8000)
    at android.app.Activity.performCreate(Activity.java:7984)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at 
android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

产生错误的片段行:

 reg_novo_user.setOnClickListener {
        val intent = Intent(activity, RegistroActivity::class.java)
        startActivity(intent)
    }

此代码位于我正在使用 firebase 实现登录的条目片段中

就在我的 startActivity 下方,我有一个“finish()”,但是由于我在一个片段中,所以我不得不删除它,我不知道问题是否在于没有这个方法

活动主要 XML:

    <?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.main.MainActivity">

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/pokemons_activity_nav_host"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/nav_graph" />


    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/main_activity_bottom_navigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="@color/bottomNavigation"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/botao_nav_menu" />


</androidx.constraintlayout.widget.ConstraintLayout>

<com.google.android.material.navigation.NavigationView
    android:id="@+id/navView"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header"
    app:menu="@menu/nav_drawer_menu" />

</androidx.drawerlayout.widget.DrawerLayout>

类 MainActivity

package com.example.pokedex.ui.main

import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider
import androidx.fragment.app.FragmentTransaction
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupWithNavController
import com.example.pokedex.R
import com.example.pokedex.ui.listaFavPokemons.ListaFavPokemonsFragment
import com.example.pokedex.ui.listaPokemons.ListaPokemonsFragment
import kotlinx.android.synthetic.main.lista_fav_pokemons.*
import kotlinx.android.synthetic.main.main_activity.*
import kotlinx.android.synthetic.main.nav_header.*
import java.io.File
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.*

@Suppress("DEPRECATION")
class MainActivity : AppCompatActivity() {

private lateinit var toggle: ActionBarDrawerToggle
var currentPath: String? = null
val TAKE_PICTURE = 1
val SELECT_PICTURE = 2
lateinit var favFragment: ListaFavPokemonsFragment
lateinit var listaFragment: ListaPokemonsFragment

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)
    configBottomNavegacao()
    configNavDrawer()

    val navHostFragment = supportFragmentManager
        .findFragmentById(R.id.pokemons_activity_nav_host) as NavHostFragment
    val navController = navHostFragment.navController

    main_activity_bottom_navigation.setupWithNavController(navController)

    toggle = ActionBarDrawerToggle(this, drawerLayout, R.string.open, 
R.string.close )
    drawerLayout.addDrawerListener(toggle)
    toggle.syncState()

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

    navView.setNavigationItemSelectedListener {
        when(it.itemId){
            R.id.drawer_Home -> dispatchHome()
            R.id.drawer_camera -> dispatchCameraIntent()
            R.id.drawer_fav -> dispatchFavoritosIntent()
            R.id.drawer_maps -> dispatchMaps()
        }
        true
    }
}

private fun dispatchHome() {
    listaFragment = ListaPokemonsFragment()
    supportFragmentManager
        .beginTransaction()
        .replace(R.id.pokemons_activity_nav_host, listaFragment)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
        .commit()
}

private fun dispatchMaps() {
    val intent = Intent(this, MapsActivity::class.java)
    startActivity(intent)
}

private fun dispatchFavoritosIntent() {
    favFragment = ListaFavPokemonsFragment()
    supportFragmentManager
        .beginTransaction()
        .replace(R.id.pokemons_activity_nav_host, favFragment)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
        .commit()
}

private fun configNavDrawer() {
    val navHostFragment = supportFragmentManager
        .findFragmentById(R.id.pokemons_activity_nav_host) as NavHostFragment
    val navController = navHostFragment.navController

    // verifica onde vai ou nao mostrar o drawer
    navController.addOnDestinationChangedListener { controller, destination, 
 arguments ->
        when(destination.id){
            R.id.listaPokemons -> mostraNavDrawer()
            R.id.listaFavPokemons -> mostraNavDrawer()
            R.id.search -> mostraNavDrawer()
            R.id.detalhesPokemons -> mostraNavDrawer()
        else -> ocultaNavDrawer()
        }
    }
}

private fun mostraNavDrawer() {
    navView.visibility = View.VISIBLE
}
private fun ocultaNavDrawer(){
    navView.visibility = View.GONE
}

// controle bottom navigation
private fun configBottomNavegacao() {
    val navHostFragment = supportFragmentManager
        .findFragmentById(R.id.pokemons_activity_nav_host) as NavHostFragment
    val navController = navHostFragment.navController

    // verifica onde vai ou nao mostrar o bottom navigation
    navController.addOnDestinationChangedListener { controller, destination, 
 arguments ->
        when(destination.id){
            R.id.listaPokemons -> mostraBottomNav()
            R.id.listaFavPokemons -> mostraBottomNav()
            //R.id.search -> mostraBottomNav()
            R.id.detalhesPokemons -> mostraBottomNav()
            else -> ocultaBottomNavigation()
        }

    }

}

//oculta o botao de navegaçao
private fun ocultaBottomNavigation() {
    main_activity_bottom_navigation.visibility = View.GONE
}

// exibe o botao de navegaçao
private fun mostraBottomNav() {
    main_activity_bottom_navigation.visibility = View.VISIBLE
}

// abre o menu lateral (exibe ele)
override fun onOptionsItemSelected(item: MenuItem): Boolean {
    if(toggle.onOptionsItemSelected(item)){
        return true
    }
    return super.onOptionsItemSelected(item)
}
// recebo a foto
override fun onActivityResult(requestCode: Int, resultCode: Int, data: 
Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == TAKE_PICTURE && resultCode == Activity.RESULT_OK) {
        try {
            val file = File(currentPath)
            val uri = Uri.fromFile(file)
            imagem_usuario.setImageURI(uri)
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
    if (requestCode == SELECT_PICTURE && resultCode == Activity.RESULT_OK) {
        try {
            val uri = data!!.data
            imagem_usuario.setImageURI(uri)
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

// abre a camera
private fun dispatchCameraIntent() {
    val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    if (intent.resolveActivity(packageManager) != null) {
        var photoFile: File? = null
        try {
            photoFile = createImage()
        } catch (e: IOException) {
            e.printStackTrace()
        }
        if (photoFile != null) {
            var photoUri = FileProvider.getUriForFile(this,
                "com.example.pokedex.fileprovider", photoFile)
            intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri)
            startActivityForResult(intent, TAKE_PICTURE)
        }
    }
}
    //cria a imagem
private fun createImage(): File {
    val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    val imageName = "JPEG_" + timeStamp + "_"
    var storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    var image = File.createTempFile(imageName, ".jpg", storageDir)
    currentPath = image.absolutePath
    return image
 }

}

标签: androidkotlinmobile

解决方案


看起来 RegistroActivity 正在尝试初始化一个片段并且在那里失败了。

原因:java.lang.NullPointerException:尝试在空对象上调用虚拟方法 'void android.widget.TextView.setOnClickListener(android.view.View$OnClickListener)'

此错误消息行意味着您正在尝试在尚未初始化的 textview 上设置侦听器。尝试在 onViewCreated 方法中初始化监听器。

应该管用


推荐阅读