我想制作一個顯示有趣/笑話的應用程式,并且有一個按鈕可以重繪 活動以加載另一個有趣/笑話。
我已經制作了資料類、改造物件和界面,并制作了布局,還在主要活動中撰寫了一些代碼。應用程式運行,但有趣的事實/笑話未加載到活動中。
請幫忙,我是初學者。
以下是代碼:
資料類:
data class FunFact(
val joke: String
)
改造物件:
object RetrofitInstance {
val api: FunFactInterface by lazy {
Retrofit.Builder()
.baseUrl("https://geek-jokes.sameerkumar.website")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FunFactInterface::class.java)
}
}
界面:
interface FunFactInterface {
@GET("/api?format=json")
suspend fun getFacts(): Response<FunFact>
}
主要活動:
class MainActivity : AppCompatActivity() {
var binding: ActivityMainBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
GlobalScope.launch {
loadData()
}
}
private suspend fun loadData() {
val dataApi = RetrofitInstance.api
val results = dataApi.getFacts()
if(results!=null){
if (binding != null) {
binding!!.textView.text= results.toString()
}
}
}
}
XML 布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@ id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="the fact"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@ id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Another Fact"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
XML設計是這樣的:

uj5u.com熱心網友回復:
如果代碼MainActivity正確,那么您沒有設定實體變數的值,binding因為您在Activitys 中創建了另一個同名的區域變數onCreate
這是您可以做的事情
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// set the value of the instance variable
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
GlobalScope.launch {
loadData()
}
}
private suspend fun loadData() = withContext(Dispatchers.Main) {
val dataApi = RetrofitInstance.api
val results = dataApi.getFacts()
binding.textView.text = results.body()?.joke
}
}
uj5u.com熱心網友回復:
如果我沒有犯錯,那么您正確設定了所有內容,但是沒有在您的 loadData 方法中啟動 API 呼叫。您可以通過在 enqueue 中撰寫 dataApi.getFacts().enqueue() 來做到這一點,您必須添加 Callback 物件作為引數。也許這個鏈接可能對你更有幫助https://futurestud.io/tutorials/retrofit-synchronous-and-asynchronous-requests
而不是這個
private suspend fun loadData() {
val dataApi = RetrofitInstance.api
val results = dataApi.getFacts()
if(results!=null){
if (binding != null) {
binding!!.textView.text= results.toString()
}
}
}
應該是這樣的
private suspend fun loadData() {
val dataApi = RetrofitInstance.api
val results = dataApi.getFacts().enqueue(object: Callback<FunFacts>{
override fun onResponse(
call: Call<FunFacts>,
response: Response<FunFacts>
){
// you can work with the response here
if(results!=null){
if (binding != null) {
binding!!.textView.text= results.toString()
}
}
} override fun onFailure(call: Call<FunFacts>, t: Throwable) {
// put code here when the call fails
}
})
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/420700.html
標籤:
