android - 引起: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
}
}
解决方案
看起来 RegistroActivity 正在尝试初始化一个片段并且在那里失败了。
原因:java.lang.NullPointerException:尝试在空对象上调用虚拟方法 'void android.widget.TextView.setOnClickListener(android.view.View$OnClickListener)'
此错误消息行意味着您正在尝试在尚未初始化的 textview 上设置侦听器。尝试在 onViewCreated 方法中初始化监听器。
应该管用
推荐阅读
- data-structures - 数据结构的使用
- android - 从谷歌地图android中的可见区域获取邮政编码列表
- scala - 从镶木地板文件读取时出现异常
- php - 我可以在 laravel 的变量数据库中使用 2 foreach 吗?
- java-11 - 字符串到对象的转换 - 在 Java 11 中不起作用
- android-mediaplayer - 使用 Android Studio 的 MediaPlayer
- c# - SaveChangesAsync 方法不保存更改(环境问题)
- import - 如何在 Hybris 中回滚 impex 导入
- http - 如何在颤振中使用会话用户?
- hyperledger-fabric - 如何使用 Hyperledger Fabric CA 管理 MSP?