【问题标题】:How do I switch back to a previous fragment after switching between activities in my Android app?在我的 Android 应用中的活动之间切换后,如何切换回上一个片段?
【发布时间】:2020-02-11 19:31:34
【问题描述】:

我有一个自定义片段,片段 A 和两个自定义活动,活动 A 和活动 B。我在左上角的每个片段上都有一个按钮,单击该按钮应返回到上一个片段或活动。我使用intent(...)call 从 Fragment A 切换到 Activity A,从 Activity A 切换到 Activity B 时也是如此。我使用 intent(...) 调用从 Activity B 切换到 Activity A,但我无法从 Activity A 切换到 Fragment A 使用intent(...)call。我曾尝试在 Activity A 中使用 finish() 返回 Fragment A,但如果我在尝试切换到 Fragment A 之前曾访问过它,有时会导致显示 Activity B。对于解决此难题的任何帮助将不胜感激。

这是片段 A 的代码:

package com.riverstonetech.gositeuk.ui.scotland

import android.content.Intent
import android.content.Intent.getIntent
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ProgressBar
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import com.google.firebase.firestore.FirebaseFirestore
import com.riverstonetech.gositeuk.CountriesActivity
import com.riverstonetech.gositeuk.R
import com.riverstonetech.gositeuk.RegionActivity
import com.riverstonetech.gositeuk.returnToFragment
import kotlinx.android.synthetic.main.fragment_scotland.*

class ScotlandFragment : Fragment() {

    // Access a Cloud Firestore instance
    val db = FirebaseFirestore.getInstance()
    lateinit var adapter : ArrayAdapter<String>

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val fragmentTransaction = returnToFragment.fragmentManager.beginTransaction()
        fragmentTransaction.add(R.id.navigation_scotland, this)
        fragmentTransaction.addToBackStack("ScotlandFragment")
        fragmentTransaction.commit()

        val root = inflater.inflate(R.layout.fragment_scotland, container, false)

        (requireActivity() as CountriesActivity).initializeCustomActionBar(R.drawable.scotland_flag, R.string.title_regions)

        var regions : ArrayList<String>

        val docRef = db.collection("UKSites").document("Scotland")

        val progressBar: ProgressBar = root.findViewById(R.id.regionsLoadingProgressBar)

        docRef.get()
            .addOnSuccessListener { document ->

                progressBar?.visibility = ProgressBar.VISIBLE

                if (document != null) {

                    regions = document.get("Regions") as ArrayList<String>

                    adapter = ArrayAdapter(requireContext(), R.layout.list_item, regions)

                    regionsListView.adapter = adapter

                    regionsListView.setOnItemClickListener { parent, view, position, id ->

                        val intent = Intent(activity!!, RegionActivity::class.java)
                        intent.putExtra("SUB_COUNTRY", regions[position])
                        startActivity(intent)


                    }

                    progressBar?.visibility = ProgressBar.GONE

                } else {
                    Log.d("Debug", "No such document")
                }
            }
            .addOnFailureListener { exception ->
                Log.d("Debug", "get failed with ", exception)
            }

        return root
    }
}

这里是Activity A的相关代码:

    fun previousSubCountryListButtonClicked(view: View) {

        if ( returnToFragment.fragmentManager.backStackEntryCount > 0) {

            returnToFragment.fragmentManager.popBackStack()

        }

    }

这是我的活动 B 的相关代码:

    fun listPreviousSitesClicked(view: View) {

        var intent: Intent

        when (previousActivityName) {

            "CountyActivity" -> {
                intent = Intent(this, CountyActivity::class.java)
                intent.putExtra("SUB_COUNTRY", subCountry)
                startActivity(intent)
            }
            "RegionActivity" -> {
                intent = Intent(this, RegionActivity::class.java)
                intent.putExtra("SUB_COUNTRY", subCountry)
                startActivity(intent)
            }

            else -> Log.i("INFO", "Unknown activity")

        }


    }

这是我的对象returnToFragment的代码

package com.riverstonetech.gositeuk

import androidx.fragment.app.FragmentActivity

object returnToFragment: FragmentActivity() {

    var fragmentManager = supportFragmentManager

}

【问题讨论】:

  • 不太清楚你在问什么。哪个活动托管您的片段?
  • 我想按固定顺序切换:Fragment A -> Activity A -> Activity B 和相反
  • 不能在activity之外展示fragment,那么fragment A在哪个activity中运行?
  • Fragment 总是依赖于 Activity,你能解释一下哪个 Activity 托管你的 Fragment 吗? @sjlearmonth

标签: android kotlin android-activity fragment


【解决方案1】:

您正在使用 Intent 函数从 Fragment A 切换到 Activity A

当您从 Activity A 前进到 Activity B 时,您正在做同样的事情。

当您返回时,完成Activity B 然后完成Activity A。然后Fragment A 将对用户可见。

不要通过调用intent方法返回,只需使用finish。

【讨论】:

    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多