首页 > 解决方案 > 单击一本书后,下一个活动仅显示一个空白页

问题描述

单击特定书籍后,下一个活动应该从服务器获取书籍的详细信息,但它只显示一个空白页面。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()

        }
    }

}

标签: androidinfinite-loopjsonobjectrequest

解决方案


推荐阅读