【问题标题】:SwipeRefreshLayout Attempt to invoke virtual method on a null object reference [duplicate]SwipeRefreshLayout 尝试在空对象引用上调用虚拟方法 [重复]
【发布时间】:2020-12-13 05:15:53
【问题描述】:

我是安卓开发新手。我现在才做了大约一个月,所以如果这是一个简单的问题,我深表歉意。 尝试运行我的应用程序时,我不断收到以下错误

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.swiperefreshlayout.widget.SwipeRefreshLayout.setOnRefreshListener(androidx.swiperefreshlayout.widget.SwipeRefreshLayout$OnRefreshListener)' on a null object reference
        at edu.cogswell.tn.prism.MainActivity.onCreate(MainActivity.kt:54)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

这是我的代码

package (package name)
import android.app.AlertDialog
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.gson.Gson
import edu.cogswell.tn.prism.`interface`.NewsService
import edu.cogswell.tn.prism.adapter.viewHolder.ListSourceAdapter
import edu.cogswell.tn.prism.common.Common
import edu.cogswell.tn.prism.modle.WebSite
import io.paperdb.Paper
import kotlinx.android.synthetic.main.fragment_central.*
import retrofit2.Call
import retrofit2.Response
import javax.security.auth.callback.Callback

class MainActivity : AppCompatActivity() {

    lateinit var layoutManager: LinearLayoutManager
    lateinit var myService: NewsService
    lateinit var adapter: ListSourceAdapter
    lateinit var dialog: AlertDialog
    var mSwipeRefreshLayout: SwipeRefreshLayout? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNaigationView)
        val navController = findNavController(R.id.fragment)

        val appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.central,
                R.id.leftWing,
                R.id.rightWing
            )
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        bottomNavigationView.setupWithNavController(navController)

        Paper.init(this)

        myService = Common.newsService

        swipe_to_refresh_centreal.setOnRefreshListener {
            loadWebSiteSource(true)
        }

        recycler_view_source_news_central.setHasFixedSize(true)
        layoutManager = LinearLayoutManager(this)
        recycler_view_source_news_central.layoutManager = layoutManager

        //dialog = SpotsDialog.Builder().setContext(this).build()

        loadWebSiteSource(false)

    }

    private fun loadWebSiteSource(isRefresh: Boolean) {
        if(!isRefresh){
            val cache = Paper.book().read<String>("cache")
            if(cache != null && !cache.isBlank() && cache != "null"){
                val website = Gson().fromJson<WebSite>(cache, WebSite::class.java)
                adapter = ListSourceAdapter(baseContext, website)
                adapter.notifyDataSetChanged()
                recycler_view_source_news_central.adapter = adapter
            }
            else{
                dialog.show()
                myService.sources.enqueue(object:retrofit2.Callback<WebSite>{
                    override fun onResponse(call: Call<WebSite>, response: Response<WebSite>) {
                        adapter = ListSourceAdapter(baseContext,response!!.body()!!)
                        adapter.notifyDataSetChanged()
                        recycler_view_source_news_central.adapter = adapter

                        Paper.book().write("cache", Gson().toJson(response!!.body()!!))
                        dialog.dismiss()
                    }

                    override fun onFailure(call: Call<WebSite>, t: Throwable) {
                        Toast.makeText(baseContext,"Failed",Toast.LENGTH_SHORT).show()
                    }
                })
            }
        }
        else{
            swipe_to_refresh_centreal.isRefreshing = true

            myService.sources.enqueue(object:retrofit2.Callback<WebSite>{
                override fun onResponse(call: Call<WebSite>, response: Response<WebSite>) {
                    adapter = ListSourceAdapter(baseContext,response!!.body()!!)
                    adapter.notifyDataSetChanged()
                    recycler_view_source_news_central.adapter = adapter

                    Paper.book().write("cache", Gson().toJson(response!!.body()!!))
                    swipe_to_refresh_centreal.isRefreshing=false
                }

                override fun onFailure(call: Call<WebSite>, t: Throwable) {
                    Toast.makeText(baseContext,"Failed",Toast.LENGTH_SHORT).show()
                }
            })
        }
    }
}

这里是xml代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    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/swipe_to_refresh_centreal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Central">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler_view_source_news_central"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10dp" />

    </RelativeLayout>

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

不太清楚为什么我不断收到此错误。我正在使用本教程https://www.youtube.com/watch?v=mvVcqzJYAbY 供参考。

提前谢谢你。

【问题讨论】:

  • 将此视为欺骗,因为加载存在于不同布局中的视图等同于加载当前布局中不存在的视图。那返回空值。片段上的欺骗几乎不适用,但添加它是因为它解释了合成的作用,即调用 findViewById,如果当前视图中不存在视图,则返回 null。

标签: android android-layout kotlin


【解决方案1】:

我看到你在这里使用了 kotlin 合成属性。它已被弃用。所以我建议改用任何其他乐器。在我看来,即使 findViewById 也更好。 那么这里有什么问题。这是与 kotlin 合成属性相关的常见问题 - 错误的导入。 看,你在一个活动中做了所有的动作,但是被导入了

import kotlinx.android.synthetic.main.fragment_central.*

所以这一行从名为fragment_central 的布局中导入视图。但是您反而夸大了activity_main。所以这里根本就不存在这种观点。

【讨论】:

  • 你会改变什么来解决这个问题?什么是 Kotlin 合成属性?对不起,如果这是一个愚蠢的问题,我真的不明白所有的术语。
  • 首先移除 import kotlinx.android.synthetic.main.fragment_central.*。在 onCreate 方法中将其更改为类似 val swipeToRefreshCentreal = findViewById(R.id.swipe_to_refresh_centreal) 并使用此变量
【解决方案2】:

您正在导入错误的布局。你能试试这个。在导入部分传递您的主要活动布局,并从导入以及变量声明中删除 swiperefresh 布局。 import kotlinx.android.synthetic.main.your_layout.*

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 2023-03-25
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2016-07-30
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多