android - 单击一本书后,下一个活动仅显示一个空白页
问题描述
单击特定书籍后,下一个活动应该从服务器获取书籍的详细信息,但它只显示一个空白页面。Logcat 显示了这一点 - “W/ActivityThread:handleWindowVisibility:令牌 android.os.BinderProxy 没有活动”。我认为问题出在DescriptionActivity 中的响应侦听器中。
说明Activity.kt
[package com.internshala.bookhub.activity
import android.app.AlertDialog
import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import android.view.View
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.core.app.ActivityCompat
import com.android.volley.Request
import com.android.volley.Response
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import com.internshala.bookhub.R
import com.internshala.bookhub.util.ConnectionManager
import com.squareup.picasso.Picasso
import org.json.JSONObject
class DescriptionActivity : AppCompatActivity() {
lateinit var txtBookName: TextView
lateinit var txtBookAuthor: TextView
lateinit var txtBookPrice: TextView
lateinit var txtBookRating: TextView
lateinit var imgBookImage: ImageView
lateinit var txtBookDesc: TextView
lateinit var btnAddToFav: Button
lateinit var progressBar: ProgressBar
lateinit var progressLayout: RelativeLayout
lateinit var toolbar: Toolbar
private var bookId: String? = "100"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_description)
txtBookName = findViewById(R.id.txtBookName)
txtBookAuthor = findViewById(R.id.txtBookAuthor)
txtBookPrice = findViewById(R.id.txtBookPrice)
txtBookRating = findViewById(R.id.txtBookRating)
imgBookImage = findViewById(R.id.imgBookImage)
txtBookDesc = findViewById(R.id.txtBookDesc)
btnAddToFav = findViewById(R.id.btnAddToFav)
progressBar = findViewById(R.id.progressBar)
progressBar.visibility = View.VISIBLE
progressLayout = findViewById(R.id.progressLayout)
progressLayout.visibility = View.VISIBLE
toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
supportActionBar?.title = "Book Details"
if (intent != null) {
bookId = intent.getStringExtra("book_id")
} else {
finish()
Toast.makeText(this, "Some unexpected error occurred", Toast.LENGTH_SHORT).show()
}
if (bookId == "100") {
finish()
Toast.makeText(this, "Some unexpected error occurred", Toast.LENGTH_SHORT).show()
}
val queue = Volley.newRequestQueue(this@DescriptionActivity)
val url = "http://13.235.250.119/v1/book/get_book/"
val jsonParams = JSONObject()
jsonParams.put("book_id", bookId)
if (ConnectionManager().checkConnectivity(this@DescriptionActivity)) {
val jsonRequest =
object : JsonObjectRequest(
Request.Method.POST,
url,
jsonParams,
Response.Listener {
try {
val success = it.getBoolean("success")
if (success) {
val bookJsonObject = it.getJSONObject("book_data")
progressLayout.visibility = View.GONE
Picasso.get().load(bookJsonObject.getString("image"))
.error(R.drawable.default_book_cover).into(imgBookImage)
txtBookName.text = bookJsonObject.getString("name")
txtBookAuthor.text = bookJsonObject.getString("author")
txtBookPrice.text = bookJsonObject.getString("price")
txtBookRating.text = bookJsonObject.getString("rating")
txtBookDesc.text = bookJsonObject.getString("description")
} else {
Toast.makeText(
this@DescriptionActivity,
"Some error occurred",
Toast.LENGTH_SHORT
).show()
}
} catch (e: Exception) {
Toast.makeText(
this@DescriptionActivity,
"Some error occurred",
Toast.LENGTH_SHORT
).show()
}
},
Response.ErrorListener {
Toast.makeText(
this@DescriptionActivity,
"Volley error $it",
Toast.LENGTH_SHORT
).show()
}) {
override fun getHeaders(): MutableMap<String, String> {
val headers = HashMap<String, String>()
headers\["Content-type"\] = "application/json"
headers\["token"\] = "85f03c501b7a40"
return headers
}
}
} else {
//Internet is not Available
val dialog = AlertDialog.Builder(this)
dialog.setTitle("Error")
dialog.setMessage("Internet Connection Not Found")
dialog.setPositiveButton("Open Settings") { text, listener ->
val settingsIntent = Intent(Settings.ACTION_WIRELESS_SETTINGS)
startActivity(settingsIntent)
this.finish()
}
dialog.setNegativeButton("Exit") { text, listener ->
ActivityCompat.finishAffinity(this)
}
dialog.create()
dialog.show()
}
}
}
仪表板片段.kt
package com.internshala.bookhub.fragment
import android.app.Activity
import android.app.AlertDialog
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.ProgressBar
import android.widget.RelativeLayout
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.volley.Response
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import com.internshala.bookhub.R
import com.internshala.bookhub.adapter.DashboardRecyclerAdapter
import com.internshala.bookhub.model.Book
import com.internshala.bookhub.util.ConnectionManager
import org.json.JSONException
class DashboardFragment : Fragment() {
private lateinit var recyclerDashboard: RecyclerView
private lateinit var layoutManager: RecyclerView.LayoutManager
private lateinit var recyclerAdapter: DashboardRecyclerAdapter
private lateinit var progressLayout: RelativeLayout
private lateinit var progressBar: ProgressBar
val bookInfoList = arrayListOf<Book>(
)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_dashboard, container, false)
recyclerDashboard = view.findViewById(R.id.recyclerDashboard)
progressLayout = view.findViewById(R.id.progressLayout)
progressBar = view.findViewById(R.id.progressBar)
progressLayout.visibility = View.VISIBLE
layoutManager = LinearLayoutManager(activity)
val queue = Volley.newRequestQueue(activity as Context)
val url = "http://13.235.250.119/v1/book/fetch_books/"
if (ConnectionManager().checkConnectivity(activity as Context)) {
val jsonObjectRequest =
object : JsonObjectRequest(Method.GET, url, null, Response.Listener {
//Here we will handle the response
try {
progressLayout.visibility = View.GONE
val success = it.getBoolean("success")
if (success) {
val data = it.getJSONArray("data")
for (i in 0 until data.length()) {
val bookJsonObject = data.getJSONObject(i)
val bookObject = Book(
bookJsonObject.getString("book_id"),
bookJsonObject.getString("name"),
bookJsonObject.getString("author"),
bookJsonObject.getString("rating"),
bookJsonObject.getString("price"),
bookJsonObject.getString("image")
)
bookInfoList.add(bookObject)
recyclerAdapter =
DashboardRecyclerAdapter(activity as Context, bookInfoList)
recyclerDashboard.adapter = recyclerAdapter
recyclerDashboard.layoutManager = layoutManager
}
} else {
Toast.makeText(
activity as Context,
"Some Error Occurred!!!",
Toast.LENGTH_SHORT
)
.show()
}
} catch (e: JSONException) {
Toast.makeText(
activity as Context,
"Some unexpected error occurred!!!",
Toast.LENGTH_SHORT
).show()
}
}, Response.ErrorListener {
// Here we will handle the errors
Toast.makeText(activity as Context, "Volley error occurred", Toast.LENGTH_SHORT)
.show()
}) {
override fun getHeaders(): MutableMap<String, String> {
val headers = HashMap<String, String>()
headers["Content-type"] = "application/json"
headers["token"] = "85f03c501b7a40"
return headers
}
}
queue.add(jsonObjectRequest)
} else {
//Internet is not Available
val dialog = AlertDialog.Builder(activity as Context)
dialog.setTitle("Error")
dialog.setMessage("Internet Connection Not Found")
dialog.setPositiveButton("Open Settings") { text, listener ->
val settingsIntent = Intent(Settings.ACTION_WIRELESS_SETTINGS)
startActivity(settingsIntent)
activity?.finish()
}
dialog.setNegativeButton("Exit") { text, listener ->
ActivityCompat.finishAffinity(activity as Activity)
}
dialog.create()
dialog.show()
}
return view
}
}
主要活动
package com.internshala.bookhub.activity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.MenuItem
import android.widget.FrameLayout
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import com.google.android.material.navigation.NavigationView
import com.internshala.bookhub.*
import com.internshala.bookhub.fragment.AboutFragment
import com.internshala.bookhub.fragment.DashboardFragment
import com.internshala.bookhub.fragment.FavouritesFragment
import com.internshala.bookhub.fragment.ProfileFragment
class MainActivity : AppCompatActivity() {
private lateinit var drawerLayout:DrawerLayout
private lateinit var coordinatorLayout: CoordinatorLayout
private lateinit var toolbar: Toolbar
private lateinit var frameLayout: FrameLayout
private lateinit var navigationView:NavigationView
private var previousMenuItem :MenuItem? =null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
drawerLayout = findViewById(R.id.drawerLayout)
coordinatorLayout = findViewById(R.id.coordinatorLayout)
toolbar = findViewById(R.id.toolbar)
frameLayout= findViewById(R.id.frame)
navigationView = findViewById(R.id.navigationView)
setUpToolbar()
openDashboard()
val actionBarDrawerToggle = ActionBarDrawerToggle(this@MainActivity , drawerLayout ,
R.string.open_drawer,
R.string.close_drawer
)
drawerLayout.addDrawerListener(actionBarDrawerToggle)
actionBarDrawerToggle.syncState()
navigationView.setNavigationItemSelectedListener {
if (previousMenuItem != null){
previousMenuItem?.isChecked = false
}
it.isCheckable = true
it.isChecked = true
previousMenuItem = it
when(it.itemId){
R.id.dashboard -> {
openDashboard()
drawerLayout.closeDrawers()
}
R.id.profile -> {
supportFragmentManager.beginTransaction()
.replace(R.id.frame, ProfileFragment() )
.commit()
supportActionBar?.title = "Profile"
drawerLayout.closeDrawers()
}
R.id.favourites -> {
supportFragmentManager.beginTransaction()
.replace(R.id.frame, FavouritesFragment())
.commit()
supportActionBar?.title = "Favourites"
drawerLayout.closeDrawers()
}
R.id.aboutApp -> {
supportFragmentManager.beginTransaction()
.replace(R.id.frame, AboutFragment())
.commit()
supportActionBar?.title = "About App"
drawerLayout.closeDrawers()
}
}
return@setNavigationItemSelectedListener true
}
}
private fun setUpToolbar(){
setSupportActionBar(toolbar)
supportActionBar?.title = "Toolbar Title"
supportActionBar?.setHomeButtonEnabled(true)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == android.R.id.home){
drawerLayout.openDrawer(GravityCompat.START)
}
return super.onOptionsItemSelected(item)
}
private fun openDashboard(){
val fragment = DashboardFragment()
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.frame, fragment)
transaction.commit()
supportActionBar?.title = "Dashboard"
navigationView.setCheckedItem(R.id.dashboard)
}
override fun onBackPressed() {
when(supportFragmentManager.findFragmentById(R.id.frame)){
!is DashboardFragment -> openDashboard()
else -> super.onBackPressed()
}
}
}
解决方案
推荐阅读
- php - 根据子产品类别限制 WooCommerce 购物车
- python - 即使在成功运行 makemigrations 和 migrate 命令后,models.py 的更改也不会反映在网站上
- reactjs - 如何在 CoreUI React 的下拉菜单中获取子菜单?
- google-admin-sdk - Google Admin SDK Directory API members.get() 为会员电子邮件返回 404,但会员 ID 成功
- spring-boot - Spring MockMVC 测试 PUT 和 Content-Type:text/uri-list - 404 与 MockMVC 并与 CURL 一起使用
- c# - 从字符串中删除单词列表
- c# - 如何直接从其事件(ObserveOrientationDidChange)中获取强类型的方向?
- android - 带有图标波纹颜色的 Flutter OutlinedButton
- visual-studio-code - 如何在 vscode 中禁用 html 预览?
- mongodb - 使用 Spring Data @Aggregation 搜索 MongoDB ISODate