You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android实现RecyclerView条目跳转详情页后按条件打开指定URL的WebView

问题描述

基础布局线框图及需求说明

我会尽可能清晰地说明需求。
*希望你能通过线框图理解我的意思 :)


我的项目包含3个Activity:

  • MainActivity:带有TabLayout,内部填充Fragment且包含RecyclerView
  • DetailActivity:展示从MainActivity的RecyclerView条目传递过来的数据
  • WebViewActivity:用户点击DetailActivity的按钮后打开,根据用户之前选择的RecyclerView条目加载对应内容

目前我已成功实现通过DetailActivity的"按钮2"打开WebViewActivity,并加载指定参数的URL(google.com)。

需求:

  1. 当用户从"RecyclerView第2个条目"进入DetailActivity后,点击"按钮1",打开WebViewActivity并加载"youtube.com"
  2. 当用户从"RecyclerView第3个条目"进入DetailActivity后,点击"按钮1",打开WebViewActivity并加载"gmail.com"

未完成代码:

MainActivity.kt

class MainActivity : AppCompatActivity() {


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


        setUpTabs() // Setup TabLayout


    } // End - OnCreate


    // Start - TabLayout
    private fun setUpTabs() {
        val adapter = ViewPagerAdapter(supportFragmentManager)
        adapter.addFragment(MainTabFragment(), "MainTab")
        viewPager_tabLayout.adapter = adapter
        tabs.setupWithViewPager(viewPager_tabLayout)
    } // End - TabLayout


} // End - Class

DetailActivity.kt

class DetailActivity : AppCompatActivity() {

    var prodBundle: Bundle? = null // Initialize getString (bundle) from MainActivity
    private var urls = arrayOfNulls<String>(3) // Initialize URL Direction

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


        // Start - WebView URL to WebViewActivity
        urls[0] = "google.com"
        urls[1] = "youtube.com"
        urls[2] = "gmail.com"
        // End - WebView URL to WebViewActivity


        initView() // Setup getString from RecyclerView Main Activity


    } // End - OnCreate


    // Start - getString from RecyclerView Main Activity
    fun initView() {
        prodBundle = intent.extras

        ph_titleText.text = prodBundle?.getString("TitleText")
       ph_descText.text = prodBundle?.getString("DescText")
        prodBundle?.getString("ImageURL").let {
            Glide.with(this).asBitmap()
                .load(it)
                .into(ph_urlImage)

            Glide.with(this).asBitmap()
                .load(it)
                .centerCrop()
                .fitCenter()
                .placeholder(R.drawable.ph_img_none)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .skipMemoryCache(true)
        }
    } //  End  - getString from RecyclerView Main Activity

    
    // Start - putExtra to WebViewActivity
    fun button2(view: View) {
        val i = Intent(this@DetailActivity, WebViewActivity::class.java)
        i.putExtra("linksWeView", urls[0])
        startActivity(i)
    } // End - putExtra to WebViewActivity

} // End - Class

WebViewActivity.kt

class WebViewActivity : AppCompatActivity() {


    private lateinit var webView: WebView // Initialize WebView


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


        // Start - Assign getString URL from DetailActivity
        val intent = intent
        val webSite = intent.getStringExtra("linksWebView")
        // End - Assign getString URL from DetailActivity


        // Start - WebView
        webView = findViewById(R.id.wv)

        webView.setWebViewClient(object : WebViewClient() {
            override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                super.onPageStarted(view, url, favicon)
                view?.visibility = View.INVISIBLE

                if (Build.VERSION.SDK_INT >= 19) {
                    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null)
                } else {
                    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
                }
            }

            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                view?.visibility = View.VISIBLE
            }

            // Start - Fix SocialMedia Acces
            override fun shouldOverrideUrlLoading(wv: WebView, url: String): Boolean {
                if (url.startsWith("tel:") || url.startsWith("whatsapp:")) {
                    val intent = Intent(Intent.ACTION_VIEW)
                    intent.data = Uri.parse(url)
                    startActivity(intent)
                    webView.goBack()
                    return true
                }
                return false
            } // End - Fix SocialMedia Acces

        }) // End - WebView


        // Start - WebView Setting
        if (webSite != null) {
            webView.loadUrl(webSite)
        }

        val webSettings = webView.settings
        webSettings.javaScriptEnabled = true // js active
        webSettings.domStorageEnabled = true // componenet load
        webSettings.allowContentAccess = true
        webSettings.loadsImagesAutomatically = true
        webSettings.cacheMode = WebSettings.LOAD_NO_CACHE
        webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH)
        webSettings.setEnableSmoothTransition(true)
        // End - WebView Setting


}// End - OnCreate

  
} // End - Class

MainTabFragment.kt

class MainTabFragment : Fragment() {


    lateinit var maintabfragmentAdapter: MainTabFragmentAdapter  // Initialize Adapter
    private val sLM = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL) // Initialize layoutManager
    val addMainTabFragmentModelList: MutableList<MainTabFragmentModel> = ArrayList() // Initialize listModel
    private var urlMainTabFragment = arrayOfNulls<String>(2) // Initialize URL Direction WebView

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_maintab, container, false)


    }


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // Start - Webview URL to WebViewActivity
        urlMainTabFragment[0] = "https://url1.com"
        urlMainTabFragment[1] = "https://url2.com"
        // End - Webview URL to WebViewActivity


        initViewMainTabFragment() // SetUp initView listModel
        actionMainTabFragment() // SetUp actionMainTabFragment
        iniRefreshListener() // SetUp swipeRefresh


    } // End - OnCreate


    // Start - intView listModel
    private fun initViewMainTabFragment() {
        rv_maintabfragment.layoutManager = sLM
        maintabfragmentAdapter = MainTabFragmentAdapter(requireActivity())
        rv_maintabfragment.adapter = maintabfragmentAdapter

        addMainTabFragmentModelList.add(
            MainTabFragmentModel("https://url1.com/img1.jpg", "TitleText#01", "DescText#01"))
        addMainTabFragmentModelList.add(
           MainTabFragmentModel("https://url1.com/img1.jpg", "TitleText#02", "DescText#02"))
        addMainTabFragmentModelList.add(
            MainTabFragmentModel("https://url1.com/img1.jpg", "TitleText#03", "DescText#03"))
        addMainTabFragmentModelList.add(
            MainTabFragmentModel("https://url1.com/img1.jpg", "TitleText#04", "DescText#04"))

        maintabfragmentAdapter.setMainTabFragment(addMainTabFragmentModelList)
    } // End - intView listModel


    // Start - putExtra to DetailActivity
    fun actionMainTabFragment() {
        maintabfragmentAdapter.setOnClickItemListenerMainTabFragment(object : OnItemClickListener {
            override fun onItemClick(item: View, position: Int) {
                lateinit var i: Intent
                if (position == 0) {
                    i = Intent(context, WebViewActivity::class.java)
                    i.putExtra("linksWebView", urlMainTabFragment[0])
                } else if (position == 3) {
                    i = Intent(context, WebViewActivity::class.java)
                    i.putExtra("linksWebView", urlMainTabFragment[1])
                } else {
                    i = Intent(context, DetailActivity::class.java)
                }
                i.putExtra("TitleText",
                    maintabfragmentAdapter.getMainTabFragment().get(position).titleTtextMainTab
                )
                i.putExtra(
                    "DescText",
                    maintabfragmentAdapter.getMainTabFragment().get(position).descTextMainTab
                )
                i.putExtra(
                    "ImageURL",
                    maintabfragmentAdapter.getMainTabFragment().get(position).imgMainTab
                )
                startActivity(i)
            }
        })
    } // End - putExtra to DetailActivity


} // End - Class

MainTabModel.kt

data class MainTabModel (var imgMainTab: String?, var titleTtextMainTab: String?, var descTextMainTab: String?)

OnItemClickListener.kt

interface OnItemClickListener {
    fun onItemClick(item: View, position:Int)
}

MianTabAdapter.kt

class MainTabAdapter(private val context: Context) :
    RecyclerView.Adapter<MainTabAdapter.MainTabViewHolder>() {

    private val MainTabModel: MutableList<MainTabModel> = mutableListOf()  // Initialize listModel
    private lateinit var onSelectedListenerMainTab: OnItemClickListener // Initialize onItemListener


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainTabViewHolder {
        return MainTabViewHolder(
            LayoutInflater.from(context).inflate(R.layout.item_maintab_layout, parent, false)
        )
    } // End - onCreateViewHolder

    
    override fun getItemCount(): Int {
        return MainTabModel.size
    }  // End - getItem

    
    override fun onBindViewHolder(holder: MainTabViewHolder, position: Int) {
        holder.maintabBindView(MainTabModel[position])
    } // End - onBindViewHolder

    
    // Start - setMainTab
    fun setMainTab(data: List<MainTabModel>) {
        MainTabModel.clear()
        MainTabModel.addAll(data)
        notifyDataSetChanged()
    } // End - setMainTab

    
    // Start - getMainTab
    fun getMainTab(): MutableList<MainTabModel> {
        return MainTabModel
    } // End - getMainTab

    
    // Start - MainTabViewHolder
    inner class MainTabViewHolder(maintabview: View) : RecyclerView.ViewHolder(maintabview) {
        val imgProdMainTab = maintabview.findViewById<ImageView>(R.id.iv_prodMainTab)
        val cvMainTab: MaterialCardView = maintabview.findViewById(R.id.cv_maintab)
        
        fun maintabBindView(MainTabModel: MainTabModel) {
            MainTabModel.apply {
                val image = MainTabModel.prodImgMainTab
                image.let {
                    Glide.with(itemView.context).asBitmap()
                        .load(it)
                        .into(imgProdMainTab)
                    
                    Glide.with(itemView.context).asBitmap()
                        .load(it)
                        .centerCrop()
                        .fitCenter()
                        .placeholder(R.drawable.ph_img_none)
                        .diskCacheStrategy(DiskCacheStrategy.NONE)
                        .skipMemoryCache(true)
                        .transition(BitmapTransitionOptions.withCrossFade())
                }
            }
        }
        
        // Start - onClick
        init {
            cvMainTab.setOnClickListener { onSelectedListenerMainTab.onItemClick(it, layoutPosition) }
        } // End - onClick
        
    } // End - MainTabBindViewHolder


    // Start - OnItemListener
    fun setOnClickItemListenerMainTab(onItemClickListener: OnItemClickListener) {
        this.onSelectedListenerMainTab = onItemClickListener
    } // End - OnItemListener


} // End - Class

解决方案

核心思路是将RecyclerView的条目位置传递给DetailActivity,再根据位置匹配对应URL打开WebViewActivity,具体修改如下:

1. 传递条目位置到DetailActivity(修改MainTabFragment.kt)

在actionMainTabFragment的点击事件中,给跳转到DetailActivity的Intent添加位置参数:

fun actionMainTabFragment() {
    maintabfragmentAdapter.setOnClickItemListenerMainTabFragment(object : OnItemClickListener {
        override fun onItemClick(item: View, position: Int) {
            lateinit var i: Intent
            if (position == 0) {
                i = Intent(context, WebViewActivity::class.java)
                i.putExtra("linksWebView", urlMainTabFragment[0])
            } else if (position == 3) {
                i = Intent(context, WebViewActivity::class.java)
                i.putExtra("linksWebView", urlMainTabFragment[1])
            } else {
                i = Intent(context, DetailActivity::class.java)
                // 添加条目位置参数
                i.putExtra("ItemPosition", position)
            }
            i.putExtra("TitleText",
                maintabfragmentAdapter.getMainTabFragment().get(position).titleTtextMainTab
            )
            i.putExtra(
                "DescText",
                maintabfragmentAdapter.getMainTabFragment().get(position).descTextMainTab
            )
            i.putExtra(
                "ImageURL",
                maintabfragmentAdapter.getMainTabFragment().get(position).imgMainTab
            )
            startActivity(i)
        }
    })
}

2. 接收位置并实现按钮1逻辑(修改DetailActivity.kt)

新增变量存储条目位置,添加按钮1的点击方法:

class DetailActivity : AppCompatActivity() {

    var prodBundle: Bundle? = null
    private var urls = arrayOfNulls<String>(3)
    // 存储条目位置
    private var itemPosition = -1

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

        // 补全https前缀避免加载失败
        urls[0] = "https://google.com"
        urls[1] = "https://youtube.com"
        urls[2] = "https://gmail.com"

        initView()
    }

    fun initView() {
        prodBundle = intent.extras

        ph_titleText.text = prodBundle?.getString("TitleText")
        ph_descText.text = prodBundle?.getString("DescText")
        // 获取传递的条目位置
        itemPosition = prodBundle?.getInt("ItemPosition", -1) ?: -1
        
        prodBundle?.getString("ImageURL").let {
            Glide.with(this).asBitmap()
                .load(it)
                .into(ph_urlImage)

            Glide.with(this).asBitmap()
                .load(it)
                .centerCrop()
                .fitCenter()
                .placeholder(R.drawable.ph_img_none)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .skipMemoryCache(true)
        }
    }

    fun button2(view: View) {
        val i = Intent(this@DetailActivity, WebViewActivity::class.java)
        // 修正参数名拼写错误,统一为linksWebView
        i.putExtra("linksWebView", urls[0])
        startActivity(i)
    }

    // 按钮1点击逻辑
    fun button1(view: View) {
        val targetUrl = when(itemPosition) {
            1 -> urls[1] // 第2个条目对应索引1
            2 -> urls[2] // 第3个条目对应索引2
            else -> urls[0] // 默认加载google.com
        }
        val i = Intent(this@DetailActivity, WebViewActivity::class.java)
        i.putExtra("linksWebView", targetUrl)
        startActivity(i)
    }

}

3. 修正WebViewActivity参数拼写问题

确保WebViewActivity中获取的参数名与DetailActivity传递的一致,当前代码中getStringExtra("linksWebView")已正确匹配,无需修改。


内容的提问来源于stack exchange,提问作者BUdiAKmal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:03:22