最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android編程開發(fā)從零開始編寫一個(gè)輕量級(jí)瀏覽器

 更新時(shí)間:2022年02月11日 17:00:51   作者:九狼  
這篇文章主要為大家介紹了Android編程開發(fā)從零開始編寫一個(gè)輕量級(jí)瀏覽器過(guò)程步驟示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步

既然是瀏覽器,按照國(guó)際按理先實(shí)現(xiàn)一個(gè)多窗口的功能

我打算用ViewPager+Fragment來(lái)實(shí)現(xiàn),但仔細(xì)想想,這樣缺點(diǎn)是十分明顯因?yàn)橐WCFragment不銷毀重建,當(dāng)viewpager的fragment個(gè)數(shù)過(guò)多,會(huì)造成很明顯的卡頓,所以先用FragmentManager試試效果

返回棧

多窗口中,每一個(gè)窗口都有自己的返回棧

每個(gè)返回棧都有自己的 fragmentManager,因此這里使用一個(gè)無(wú)ui的Fragment作為返回棧的載體

/**
 * @author huangweiliang
 */
class NavHostFragment(var name: String, var windowIndex: Int): Fragment() {
    private lateinit var binding: FragmentNavHostBinding
    private val TAG: String = "NavHostFragment"
    var curSelectFragment: Fragment? = null
    var curChildFragmentManager: FragmentManager? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //點(diǎn)擊返回鍵,將當(dāng)前棧的Fragment作出棧處理
        requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                isEnabled = childFragmentManager.backStackEntryCount > 0
                if (isEnabled) childFragmentManager.popBackStackImmediate()
//                else requireActivity().onBackPressedDispatcher.onBackPressed()
                else requireActivity().finish()
            }
        })
    }
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_nav_host, container, false)
        binding = FragmentNavHostBinding.bind(view)
        return view
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        var tag = name
        //創(chuàng)建窗口的第一個(gè)頁(yè)面,即首頁(yè)Fragment
        if (childFragmentManager.findFragmentByTag(tag) == null) {

            //這里使用的是childFragmentManager
            childFragmentManager.commitNow {
                val multiChildFragment = MultiChildFragment(name, 1, this@NavHostFragment)
                add(R.id.content, multiChildFragment, tag) //不能使用replace,否則每次返回都要重建
            }
        }
        Log.i(TAG, "$name: onViewCreated")
    }
    override fun onStart() {
        super.onStart()
        Log.i(TAG, "$name: onStart")
    }
    override fun onResume() {
        super.onResume()
        Log.i(TAG, "$name: onResume")
    }
    override fun onPause() {
        super.onPause()
        Log.i(TAG, "$name: onPause")
    }
    override fun onDestroy() {
        super.onDestroy()
        Log.i(TAG, "$name: onDestroy")
    }
}

FragmentNavHostBinding

<androidx.fragment.app.FragmentContainerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</androidx.fragment.app.FragmentContainerView>

搜索頁(yè)面暫時(shí)放一個(gè)EditView

<?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">
    <EditText
        android:id="@+id/ed_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="166dp"
        android:layout_marginEnd="16dp"
        android:padding="12dp"
        android:background="@drawable/gray_rounded_shape"
        android:drawableLeft="@drawable/ic_search_gray_24dp"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

/**
 * @author huangweiliang
 * @date 2021/12/9
 * 多窗口中,具體展示的每一個(gè)Fragment
 */
class MultiChildFragment(var name: String, var depth: Int, var hostFragment: Fragment) : Fragment() {
    private lateinit var binding: FragmentMultiChildBinding
    val TAG = "MultiChildFragment"
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        Log.i(TAG, "$name-$depth: onCreateView")
        val view = inflater.inflate(R.layout.fragment_multi_child, container, false)
        binding = FragmentMultiChildBinding.bind(view)
        //這里做一簡(jiǎn)單的傳參顯示當(dāng)前頁(yè)面
        binding.edSearch.text.append("$name-$depth")
        init()
        return view
    }
    private fun init() {
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        Log.i(TAG, "$name-$depth: onViewCreated")
    }
    }

再寫一個(gè)包含多個(gè)返回棧的父Fragment

MultiStackParentFragment

class MultiStackParentFragment: Fragment() {
    companion object {
        fun newInstance() = MultiStackParentFragment()
    }
    private lateinit var binding: FragmentMultiStackParentBinding
    private var windowNum: Int = 0
    /**
     * 當(dāng)前窗口的Index
     */
    private var curWindowIndex: Int = 0
    /**
     * 記錄創(chuàng)建的所有窗口對(duì)象
     */
    private val mStackList = ArrayList<NavHostFragment>()
    /**
     * 返回棧順序,存儲(chǔ)返回棧id
     */
    private val mOrderStack = ArrayDeque<Int>()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_multi_stack_parent, container, false)
        binding = FragmentMultiStackParentBinding.bind(view)
        init()
        return view
    }
    private fun init() {
    }
}

在里面實(shí)現(xiàn)添加窗口

childFragmentManager管理著以該Fragment作為父容器的所有子Fragment

private fun addWindow() {
    childFragmentManager.commitNow {
        //NavHostFragment代表一個(gè)窗口對(duì)象
        val navHostFragment = NavHostFragment("窗口${++windowNum}", windowNum)
        curWindowIndex = windowNum
        mStackList.add(navHostFragment)
        add(R.id.content_fragment, navHostFragment) //添加窗口
    }
    transWindowIndex(curWindowIndex)
}

效果圖

以上就是Android編程開發(fā)從零開始編寫一個(gè)輕量級(jí)瀏覽器的詳細(xì)內(nèi)容,更多關(guān)于Android編程開發(fā)輕量級(jí)瀏覽器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Flutter開發(fā)之Shortcuts快捷鍵組件的用法詳解

    Flutter開發(fā)之Shortcuts快捷鍵組件的用法詳解

    在桌面端的開發(fā)中,鍵盤快捷鍵是非常常見(jiàn)而必要的,F(xiàn)lutter?既然可以開發(fā)桌面端應(yīng)用,那必然要提供自定義快捷鍵,所以本文就來(lái)和大家講講Shortcuts組件的簡(jiǎn)單使用吧
    2023-05-05
  • Android基于google Zxing實(shí)現(xiàn)二維碼的生成

    Android基于google Zxing實(shí)現(xiàn)二維碼的生成

    這篇文章主要介紹了Android基于google Zxing實(shí)現(xiàn)二維碼的生成的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android 一鍵清理、內(nèi)存清理功能實(shí)現(xiàn)

    Android 一鍵清理、內(nèi)存清理功能實(shí)現(xiàn)

    這篇文章主要介紹了Android 一鍵清理、內(nèi)存清理功能實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-01-01
  • Android巧用XListView實(shí)現(xiàn)萬(wàn)能下拉刷新控件

    Android巧用XListView實(shí)現(xiàn)萬(wàn)能下拉刷新控件

    這篇文章主要為大家詳細(xì)介紹了Android巧用XListView實(shí)現(xiàn)萬(wàn)能下拉刷新控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • android實(shí)現(xiàn)手寫簽名功能

    android實(shí)現(xiàn)手寫簽名功能

    這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)手寫簽名功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 學(xué)習(xí)Android Handler消息傳遞機(jī)制

    學(xué)習(xí)Android Handler消息傳遞機(jī)制

    這篇文章主要為大家詳細(xì)介紹了Android Handler消息傳遞機(jī)制,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android Studio之Debug運(yùn)行期代碼植入的方法

    Android Studio之Debug運(yùn)行期代碼植入的方法

    這篇文章主要介紹了Android Studio之Debug運(yùn)行期代碼植入的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • OkHttp原理分析小結(jié)

    OkHttp原理分析小結(jié)

    OkHttp 是 Square 公司開源的一款網(wǎng)絡(luò)框架,封裝了一個(gè)高性能的 http 請(qǐng)求庫(kù),本文對(duì)OkHttp原理給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • 詳解android.mk中引用第三方庫(kù)的方法

    詳解android.mk中引用第三方庫(kù)的方法

    本篇文章主要介紹了詳解android.mk中引用第三方庫(kù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Android自定義加載框效果

    Android自定義加載框效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義加載框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論

龙胜| 潮安县| 扎囊县| 松原市| 潞西市| 德令哈市| 聊城市| 郎溪县| 石首市| 英吉沙县| 札达县| 蓬莱市| 织金县| 佛学| 沽源县| 隆尧县| 永吉县| 来宾市| 衡阳县| 安乡县| 大冶市| 平陆县| 渭南市| 荔波县| 古交市| 阳山县| 江西省| 富源县| 大城县| 鹤庆县| 甘谷县| 东阿县| 凤庆县| 南阳市| 小金县| 时尚| 杭锦旗| 弥渡县| 广东省| 上饶市| 石河子市|