我有两个活动。 活动A包含卡片视图元素的回收者视图,其中包含图像。 在活动A中选择元素时。活动B中将显示图像的完整横向版本。

活动B的布局文件如下:

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

活动B的代码库如下:

class PosterViewActivity : AppCompatActivity()
{

    private lateinit var imageView: AppCompatImageView

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_poster_view)
        init()
    }

    private fun init()
    {
        findViewsByID()
        getBundle()
        toggleHide()
    }  

    private fun getBundle()
    {
        if (intent != null)
        {
            var imageUrl = intent.getStringExtra(ARG_IMAGE_URL)
            if (imageUrl != null)
            {
                Glide.with(this).load(imageUrl).centerInside().into(imageView)
            }
        }
    }

 private fun findViewsByID()
    {
        imageView = findViewById(R.id.imageView)
       }

    override fun onOptionsItemSelected(item: MenuItem): Boolean
    {
        if (item.itemId == android.R.id.home)
        {
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        }
        return super.onOptionsItemSelected(item)
    }

    override fun onBackPressed()
    {
        super.onBackPressed()
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    }

    override fun onWindowFocusChanged(hasFocus: Boolean)
    {
        super.onWindowFocusChanged(hasFocus)

}

    private fun toggleHide()
    {
        val uiOptions = window.decorView.systemUiVisibility
        var newUiOptions = uiOptions
        val isImmersiveModeEnabled = uiOptions or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY == uiOptions
        if (isImmersiveModeEnabled)
        {
            Log.i("PosterViewActivity", "Turning immersive mode mode off. ")
        }
        else
        {
            Log.i("PosterViewActivity", "Turning immersive mode mode on.")
        }

        if (Build.VERSION.SDK_INT >= 14)
        {
            newUiOptions = newUiOptions xor View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        }

        // Status bar hiding: Backwards compatible to Jellybean
        if (Build.VERSION.SDK_INT >= 16)
        {
            newUiOptions = newUiOptions xor View.SYSTEM_UI_FLAG_FULLSCREEN
        }

        if (Build.VERSION.SDK_INT >= 18)
        {
            newUiOptions = newUiOptions xor View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        }

        window.decorView.systemUiVisibility = newUiOptions
    }
}

但是,当我按下设备上的“后退”按钮而不是返回到“活动A”时。状态和导航按钮将显示并隐藏,并且需要四次按“后退”按钮才能返回到“活动A”。我已经检查了“后退”堆栈和两次活动在堆栈中,即A和B

来自活动A的代码调用了活动B:

if(promoList.size >0)
        {
            noPromoImageView.visibility = View.GONE
            noPromoTextView.visibility = View.GONE

            promoAdapter = PromotionsAdapter(this, promoList!!)
            promoRecyclerView.layoutManager = GridLayoutManager(this, 3)
            promoRecyclerView.adapter = promoAdapter
            promoRecyclerView.addOnItemTouchListener(
                RecyclerTouchListener(applicationContext,
                    promoRecyclerView,
                    object : ClickListener
                    {
                        override fun onClick(view: View, position: Int)
                        {
                            openPosterView(position)
                        }

                        override fun onLongClick(view: View?, position: Int)
                        {

                        }
                    }))
        }
        else
        {
            noPromoImageView.visibility = View.VISIBLE
            noPromoTextView.visibility = View.VISIBLE
        }
    }

 private fun openPosterView(position: Int)
    {
        val posterImageDetails = displayedRules!![position]!!.imageDetails
        if (posterImageDetails.isNotEmpty())
        {
            var cur = -1
            for ((pos, item) in posterImageDetails.withIndex())
            {
                val key = item.containsValue("Fullscreen")
                if (key)
                {
                    cur = pos
                }
            }
            var imagesLink: Map<String, String>
            if (cur > -1)
            {
                imagesLink = posterImageDetails[cur]
                var imageUrl = imagesLink?.get("ImageUrl")
                if (imageUrl!!.isNotEmpty())
                {
                    var intent = Intent(this, PosterViewActivity::class.java)
                    var bundle = Bundle()
                    bundle.putString(ARG_IMAGE_URL, imageUrl)
                    intent.putExtras(bundle)

                    this.startActivity(intent)
                }
            }
        }
    }

 internal class RecyclerTouchListener(context: Context, recyclerView: RecyclerView, private val clickListener: ClickListener) : RecyclerView.OnItemTouchListener
    {

        private val gestureDetector: GestureDetector

        init
        {
            gestureDetector = GestureDetector(
                context,
                object : GestureDetector.SimpleOnGestureListener()
                {
                    override fun onSingleTapUp(e: MotionEvent): Boolean
                    {
                        return true
                    }

                    override fun onLongPress(e: MotionEvent)
                    {
                        val child = recyclerView.findChildViewUnder(e.x, e.y)
                        if (child != null && clickListener != null)
                        {
                            clickListener.onLongClick(child, recyclerView.getChildPosition(child))
                        }
                    }
                })
        }

        override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean
        {

            val child = rv.findChildViewUnder(e.x, e.y)
            if (child != null && clickListener != null && gestureDetector.onTouchEvent(e))
            {
                clickListener.onClick(child, rv.getChildPosition(child))
            }
            return false
        }

        override fun onTouchEvent(rv: RecyclerView, e: MotionEvent)
        {
        }

        override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean)
        {

        }
    }

===============>>#1 票数:1 已采纳

我认为活动A的clickListener是错误的。 项目数可以为4,并且单击该项目时,该项目的onClickListener可以将活动B调用4次。

===============>>#2 票数:1

正如Farid所建议的那样,通过扩展recyclerview的ontouchlistener,它增加了更多的复杂性。 我最初使用的最简单的解决方案是,在适配器中添加OnClick侦听器

 inner class PromoViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener
    {
        override fun onClick(v: View?)
        {
              openPosterView(adapterPosition)
        }

  private val description: JustifiedTextView
        private val duration: AppCompatTextView
        private val startDate: AppCompatTextView
        private val endDate: AppCompatTextView
        private val imageViewCompact: AppCompatImageView

        init
        {
            description = itemView.findViewById(R.id.textViewProductOnPromo)
            duration = itemView.findViewById(R.id.textViewPromoDates)
            imageViewCompact = itemView.findViewById(R.id.imageViewCompact)
            startDate = itemView.findViewById(R.id.textViewStartDate)
            endDate = itemView.findViewById(R.id.textViewEndDate)
            view.setOnClickListener(this)
        }
}

  ask by George translate from so

未解决问题?本站智能推荐:

1回复

后退按钮导致意外行为

我有两个活动。 活动A包含卡片视图元素的回收者视图,其中包含图像。 在活动A中选择一个元素。 图像的完整横向版本显示在活动B中 。 活动B的布局文件如下: 活动B的代码库如下: 但是,当我按设备上的后退按钮而不是返回到活动A时 。 状态和导航按钮被显示和隐藏,并且需
3回复

使用“后退”按钮返回前一个片段后如何更改其视图?

我的活动有两个片段。 当我单击第一个时,第二个被称为。 我想要的是:如果单击“后退”按钮,我想返回到第一个片段(正在工作),但是我想在某个元素上将可见性设置为VISIBLE (如果第一个片段用来调用)仅返回) 我怎么做 ? 我尝试过这样的事情(在我的主要片段中),我在另一
3回复

在Android中实现自定义后退导航

我正在尝试根据此处的文档在片段中实现自定义反向导航 但是,当我尝试用后退按钮evet代码替换“ //处理后退按钮事件”位时,我的IDE抛出错误,提示“必需:找到OnBackPressedCallback()-> OnBackPressedCallback” 我正在使用appco
1回复

如何获得完全像按下后退按钮一样的导航行为

如何获得向上导航按钮的行为类似于后退按钮? 当我按下“后退”按钮时,我之前的所有活动均保持先前的状态。 当我按下向上按钮时,我的活动返回到初始状态。 我试图挂钩onBackPressed(); 以防我onOptionsItemSelected上的R.id.home出现问题,但是它的行为仍
2回复

Android后退按钮行为问题…

我一直在使用finish()进行后退按钮操作,以返回到上一个活动及其正常工作,但在此特定情况下无法正常工作。 以下是我的活动及其功能的列表: 活动A-显示在线论坛主题 活动B-显示论坛主题的评论 活动C-发表新评论 用户发布新评论后,他将被定向到活动B。 问题
6回复

如何应用片段中按下的“后退”按钮[重复]

这个问题已经在这里有了答案: Android Fragment手柄后退按钮按下[重复] 25个答案 我是android新手。 我无法处理onBackPressed方法。 我有一个Activity类,其中有四个片段,如A,B,C,D。当我午餐时,默认情况下,Act
5回复

如何在单次按下后退按钮时返回上一屏幕,以及在两次按下后退按钮时如何退出应用程序?

我想执行一次操作,例如当我按一次Back Button时,它将移至所选屏幕;当我按两次Back Button时,它将显示对话框并要求退出。 我在堆栈溢出中尝试了许多示例,但没有一个对我有帮助。 navaigation.java 我尝试过这种方式,但无法正常工作...
3回复

按下后退按钮时如何直接退出应用程序?

我的应用程序中有2个活动(A和B)。 在活动BI上有一个自定义工具栏。 当用户单击工具栏时,它将返回活动A。我希望用户每次按下活动A上的后退按钮都退出应用程序。我的问题是每次用户在活动A上单击后退按钮时,它都会退出将计算用户进入活动B然后退出A的次数。 我正在使用此代码: 我还
5回复

按下后退按钮时断断续续地退出

我已经实现了我的应用程序可以在按下后退按钮时退出。 退出应用程序时,通常会出现断断续续的出口,在该应用程序正确退出之前,最近的应用程序会显示在该出口处。 是什么导致此问题? 这是我的代码。
1回复

Xamarin:按下后退按钮时,关闭警报对话框

我是Xamarin Android的新手。 我有一个活动,当按下textview时,显示警报。 AlertDialog的代码是: 我需要在按下“后退”按钮时,此事件关闭AlertDialog。 谢谢。 PD:我是Visual Studio 2012 +插件Xamarin的开发