【问题标题】:Going back to previous activity onBackPressed返回上一个活动 onBackPressed
【发布时间】:2021-07-15 13:43:02
【问题描述】:

我有一个 cartActivity,当我单击继续按钮时,它会转到 PaymentActivity。现在,如果我从 paymentActivity 中单击返回按钮,我想返回 CartActivity。

购物车活动

class CartActivity : AppCompatActivity() {

lateinit var toolbar: androidx.appcompat.widget.Toolbar
lateinit var txtOrderingFrom: TextView
lateinit var btnPlaceOrder: Button
lateinit var recyclerView: RecyclerView
lateinit var layoutManager: RecyclerView.LayoutManager
lateinit var menuAdapter: CartAdapter
lateinit var restaurantId: String
lateinit var restaurantName: String
lateinit var selectedItemsId: ArrayList<String>
lateinit var linearLayout: LinearLayout
lateinit var cartProgressLayout: RelativeLayout

var totalAmount = 0
var cartListItems = arrayListOf<CartItems>()

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

    btnPlaceOrder = findViewById(R.id.btnPlaceOrder)
    txtOrderingFrom = findViewById(R.id.txtOrderingFrom)
    linearLayout = findViewById(R.id.linearLayout)
    toolbar = findViewById(R.id.toolBar)
    cartProgressLayout = findViewById(R.id.cartProgressLayout)

    restaurantId = intent.getStringExtra("restaurantId").toString()
    restaurantName = intent.getStringExtra("restaurantName").toString()
    selectedItemsId = intent.getStringArrayListExtra("selectedItemsId") as ArrayList<String>
    txtOrderingFrom.text = restaurantName

    setToolBar()
    fetchData()

    btnPlaceOrder.setOnClickListener {



        val sharedPreferences = this.getSharedPreferences(
            getString(R.string.shared_preferences),
            Context.MODE_PRIVATE
        )

        if (ConnectionManager().checkConnectivity(this)) {

            cartProgressLayout.visibility = View.VISIBLE
            try {
                val foodArray = JSONArray()

                for (foodItem in selectedItemsId) {
                    val singleItemObject = JSONObject()
                    singleItemObject.put("food_item_id", foodItem)
                    foodArray.put(singleItemObject)
                }

                val sendOrder = JSONObject()
                sendOrder.put("user_id", sharedPreferences.getString("user_id", "0"))
                sendOrder.put("restaurant_id", restaurantId)
                sendOrder.put("total_cost", totalAmount)
                sendOrder.put("food", foodArray)

                val queue = Volley.newRequestQueue(this)
                val url = "http://13.235.250.119/v2/place_order/fetch_result"

                val jsonObjectRequest = object : JsonObjectRequest(
                    Method.POST,
                    url,
                    sendOrder,
                    Response.Listener {

                        val response = it.getJSONObject("data")
                        val success = response.getBoolean("success")
                        val LAUNCH_SECOND_ACTIVITY = 1
                        if (success) {
                            val intent = Intent(this, PaymentActivity::class.java)
                            intent.putExtra("total_amount",totalAmount)
                            startActivityForResult(intent,LAUNCH_SECOND_ACTIVITY)
                            finishAffinity()

                        } else {
                            val responseMessageServer =
                                response.getString("errorMessage")
                            Toast.makeText(
                                this,
                                responseMessageServer.toString(),
                                Toast.LENGTH_SHORT
                            ).show()

                        }
                        cartProgressLayout.visibility = View.INVISIBLE
                    },
                    Response.ErrorListener {

                        Toast.makeText(
                            this,
                            "Some Error occurred!!!",
                            Toast.LENGTH_SHORT
                        ).show()
                    }) {
                    override fun getHeaders(): MutableMap<String, String> {
                        val headers = HashMap<String, String>()
                        headers["Content-type"] = "application/json"
                        headers["token"] = "9bf534118365f1"
                        return headers
                    }
                }
                queue.add(jsonObjectRequest)

            } catch (e: JSONException) {
                Toast.makeText(
                    this,
                    "Some unexpected error occurred!!",
                    Toast.LENGTH_SHORT
                ).show()
            }

        } else {

            val alterDialog = androidx.appcompat.app.AlertDialog.Builder(this)
            alterDialog.setTitle("No Internet")
            alterDialog.setMessage("Check Internet Connection!")
            alterDialog.setPositiveButton("Open Settings") { _, _ ->
                val settingsIntent = Intent(Settings.ACTION_SETTINGS)
                startActivity(settingsIntent)
            }
            alterDialog.setNegativeButton("Exit") { _, _ ->
                finishAffinity()
            }
            alterDialog.setCancelable(false)
            alterDialog.create()
            alterDialog.show()
        }
    }

    layoutManager = LinearLayoutManager(this)
    recyclerView = findViewById(R.id.recyclerViewCart)

}

fun fetchData() {

    if (ConnectionManager().checkConnectivity(this)) {

        cartProgressLayout.visibility = View.VISIBLE

        try {
            val queue = Volley.newRequestQueue(this)
            val url = "http://13.235.250.119/v2/restaurants/fetch_result/$restaurantId"

            val jsonObjectRequest = @SuppressLint("SetTextI18n")
            object : JsonObjectRequest(
                Method.GET,
                url,
                null,
                Response.Listener {

                    val response = it.getJSONObject("data")
                    val success = response.getBoolean("success")
                    if (success) {

                        val data = response.getJSONArray("data")
                        cartListItems.clear()
                        totalAmount = 0

                        for (i in 0 until data.length()) {
                            val cartItem = data.getJSONObject(i)
                            if (selectedItemsId.contains(cartItem.getString("id"))) {
                                val menuObject = CartItems(
                                    cartItem.getString("id"),
                                    cartItem.getString("name"),
                                    cartItem.getString("cost_for_one"),
                                    cartItem.getString("restaurant_id")
                                )

                                totalAmount += cartItem.getString("cost_for_one").toString()
                                    .toInt()
                                cartListItems.add(menuObject)


                            }
                            menuAdapter = CartAdapter(this, cartListItems)
                            recyclerView.adapter = menuAdapter
                            recyclerView.layoutManager = layoutManager
                        }

                        btnPlaceOrder.text = "Place Order(Total: Rs. $totalAmount)"

                    }
                    cartProgressLayout.visibility = View.INVISIBLE
                },
                Response.ErrorListener {

                    Toast.makeText(
                        this,
                        "Some Error occurred!!!",
                        Toast.LENGTH_SHORT
                    ).show()

                    cartProgressLayout.visibility = View.INVISIBLE
                }) {
                override fun getHeaders(): MutableMap<String, String> {
                    val headers = HashMap<String, String>()
                    headers["Content-type"] = "application/json"
                    headers["token"] = "26c5144c5b9c13"
                    return headers
                }
            }

            queue.add(jsonObjectRequest)

        } catch (e: JSONException) {
            Toast.makeText(
                this,
                "Some Unexpected error occurred!!!",
                Toast.LENGTH_SHORT
            ).show()
        }

    } else {

        val alterDialog = androidx.appcompat.app.AlertDialog.Builder(this)
        alterDialog.setTitle("No Internet")
        alterDialog.setMessage("Check Internet Connection!")
        alterDialog.setPositiveButton("Open Settings") { _, _ ->
            val settingsIntent = Intent(Settings.ACTION_SETTINGS)
            startActivity(settingsIntent)
        }
        alterDialog.setNegativeButton("Exit") { _, _ ->
            finishAffinity()
        }
        alterDialog.setCancelable(false)
        alterDialog.create()
        alterDialog.show()
    }
}

fun setToolBar() {
    setSupportActionBar(toolbar)
    supportActionBar?.title = "My Cart"
    supportActionBar?.setHomeButtonEnabled(true)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)
    supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_back_arrow)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {

    when (item.itemId) {
        android.R.id.home -> {
            super.onBackPressed()
        }
    }
    return super.onOptionsItemSelected(item)
}

}

支付活动

 class PaymentActivity : AppCompatActivity() {
    var amountEt: TextView? = null
    var nameEt: TextView? = null
    var upiIdEt: TextView? = null
    var send: Button? = null
    val UPI_PAYMENT = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_payment)
        initializeViews()
        send?.setOnClickListener {
            payUsingUpi("1", "sruthikrithika0@okhdfcbank", "Sruthi")
            }

    }

    fun initializeViews() {
        send = findViewById(R.id.send)
        amountEt = findViewById(R.id.amount_et)
        nameEt = findViewById(R.id.upi_name)
        upiIdEt = findViewById(R.id.upi_id)
    }

    fun payUsingUpi(amount: String?, upiId: String?, name: String?) {
        val uri: Uri = Uri.parse("upi://pay").buildUpon()
            .appendQueryParameter("pa", upiId)
            .appendQueryParameter("pn", name)
            .appendQueryParameter("am", amount)
            .appendQueryParameter("cu", "INR")
            .build()
        val upiPayIntent = Intent(Intent.ACTION_VIEW)
        upiPayIntent.data = uri

        // will always show a dialog to user to choose an app
        val chooser = Intent.createChooser(upiPayIntent, "Pay with")

        // check if intent resolves
        if (null != chooser.resolveActivity(packageManager)) {
            startActivityForResult(chooser, UPI_PAYMENT)
        } else {
            Toast.makeText(
                this@PaymentActivity,
                "No UPI app found, please install one to continue",
                Toast.LENGTH_SHORT
            ).show()
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            UPI_PAYMENT -> if (RESULT_OK == resultCode || resultCode == 11) {
                if (data != null) {
                    val trxt = data.getStringExtra("response")
                    Log.d("UPI", "onActivityResult: $trxt")
                    val dataList: ArrayList<String?> = ArrayList()
                    dataList.add(trxt)
                    upiPaymentDataOperation(dataList)
                } else {
                    Log.d("UPI", "onActivityResult: " + "Return data is null")
                    val dataList: ArrayList<String?> = ArrayList()
                    dataList.add("nothing")
                    upiPaymentDataOperation(dataList)
                }
            } else {
                Log.d(
                    "UPI",
                    "onActivityResult: " + "Return data is null"
                ) //when user simply back without payment
                val dataList: ArrayList<String?> = ArrayList()
                dataList.add("nothing")
                upiPaymentDataOperation(dataList)
            }
        }
    }

    private fun upiPaymentDataOperation(data: ArrayList<String?>) {
        if (isConnectionAvailable(this@PaymentActivity)) {
            var str = data[0]
            Log.d("UPIPAY", "upiPaymentDataOperation: $str")
            var paymentCancel = ""
            if (str == null) str = "discard"
            var status = ""
            var approvalRefNo = ""
            val response = str.split("&").toTypedArray()
            for (i in response.indices) {
                val equalStr = response[i].split("=").toTypedArray()
                if (equalStr.size >= 2) {
                    if (equalStr[0].toLowerCase() == "Status".toLowerCase()) {
                        status = equalStr[1].toLowerCase()
                    } else if (equalStr[0].toLowerCase() == "ApprovalRefNo".toLowerCase() || equalStr[0].toLowerCase() == "txnRef".toLowerCase()) {
                        approvalRefNo = equalStr[1]
                    }
                } else {
                    paymentCancel = "Payment cancelled by user."
                }
            }
            if (status == "success") {
                //Code to handle successful transaction here.
                Toast.makeText(this@PaymentActivity, "Transaction successful.", Toast.LENGTH_SHORT)
                    .show()
                Log.d("UPI", "responseStr: $approvalRefNo")
            } else if ("Payment cancelled by user." == paymentCancel) {
                Toast.makeText(this@PaymentActivity, "Payment cancelled by user.", Toast.LENGTH_SHORT)
                    .show()
            } else {
                Toast.makeText(
                    this@PaymentActivity,
                    "Transaction failed.Please try again",
                    Toast.LENGTH_SHORT
                ).show()
            }
        } else {
            Toast.makeText(
                this@PaymentActivity,
                "Internet connection is not available. Please check and try again",
                Toast.LENGTH_SHORT
            ).show()
        }
    }

    companion object {
        fun isConnectionAvailable(context: Context): Boolean {
            val connectivityManager =
                context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            if (connectivityManager != null) {
                val netInfo = connectivityManager.activeNetworkInfo
                if (netInfo != null && netInfo.isConnected
                    && netInfo.isConnectedOrConnecting
                    && netInfo.isAvailable
                ) {
                    return true
                }
            }
            return false
        }
    }

}

现在,当我从 PaymentActivity 单击返回按钮时,应用程序崩溃,因为 cartActivity 中的相同状态不存在。如何解决这个问题??

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.foodly">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@drawable/logo"
        android:label="@string/app_name"
        android:networkSecurityConfig="@xml/network_security_config"
        android:resizeableActivity="false"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Foodly">
        <activity android:name=".activity.OrderPlacedActivity"></activity>
        <activity android:name=".activity.CartActivity" />
        <activity android:name=".activity.OrderHistoryActivity" />
        <activity
            android:name=".activity.RestaurantMenuActivity" />
        <activity
            android:name=".activity.RegisterActivity" />
        <activity
            android:name=".activity.LoginActivity" />
        <activity
            android:name=".activity.PaymentActivity"/>
        <activity
            android:name=".activity.SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".activity.MainActivity" />

        <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts" />

    </application>

</manifest>

【问题讨论】:

  • 如果您显示堆栈跟踪并指出它对应的行会有所帮助,这样我们就不必仔细阅读所有代码来发现错误...
  • 如果你看到 PaymentActivity,我已经实现了 onBackPressed。但是如果我按下它就不会返回,因为购物车项目没有保存
  • 你要让我乞求堆栈跟踪吗? ;)
  • 您已经花时间回复多个答案 - 如果您花时间发布崩溃的堆栈跟踪,这可能已经解决了。
  • 我其实不知道该怎么做。我是安卓新手。对不起@dominicoder

标签: android xml android-studio kotlin


【解决方案1】:

你为什么在你的OnBackPressed()回调中调用startActivity()?你不必,它是自动的。如果您需要在CartActivity 中检索参数,您必须使用startActivityForResult() 启动PaymentActivity

【讨论】:

  • 实际上并没有回到之前的活动。该应用程序正在完全关闭。
  • 因为finishAffinity()当然。不要在要返回的 Activity 上调用 finish()method
  • 不,即使在删除 finishAffinity() 后应用程序会丢失并显示错误消息,该购物车 Activity 为空。状态未保存。
【解决方案2】:

问题出在

finishAffinity()

finishAffinity()用于从当前任务中移除一些属于特定应用的Activity(可能包含属于多个应用的​​Activity)。

您不应在开始付款活动时完成任何操作。您应该在付款成功后使用finishAffinity(),因此最后的活动不应该出现在后面的新闻中。

更多信息 - https://developer.android.com/reference/android/app/Activity#finishAffinity()

【讨论】:

  • 不,即使在删除 finishAffinity() 后应用程序会丢失并显示错误消息,该购物车 Activity 为空。状态未保存
  • 这是否发生在付款活动的后退时?
  • 是的,当我在支付活动中按下返回按钮时,应用程序正在关闭。我知道为什么会这样,但不知道如何解决。当我移动到下一个活动时,从购物车活动中购物车活动中的列表消失
  • 请在删除购物车活动中的完成和完成Affinity后从支付活动中删除onBackPressed()方法。
  • 还是一样
猜你喜欢
  • 2013-04-23
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 2011-05-01
相关资源
最近更新 更多