kotlin关于fragment主页

这篇博客介绍了如何在Kotlin中处理Fragment,包括主界面设计、BaseFragment的创建、具体Fragment的实现以及主界面布局的设置。提供了一种简洁的代码实现思路,并提醒读者需补充缺失的图片资源和布局文件。

1.其实网上有许多种,关于kotlin的写法,我这里简单贴一下代码和思路

效果图:

2.主界面

package com.example.admin.zkotlin

import android.annotation.TargetApi
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.PixelFormat
import android.hardware.Camera
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Environment
import android.os.Handler
import android.util.Log
import android.view.Surface
import android.view.SurfaceHolder
import android.view.SurfaceView
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import kotlinx.android.synthetic.main.activity_main.*
import java.io.File
import java.io.FileOutputStream


class MainActivity : AppCompatActivity() {
    // 创建不可变List listof
    private var fragments:List<Fragment> = listOf(HomePageFragment(),InterviewPageFragment(),QuestionAndAnswerFragment(),MineFragment())
    private var currentFragment:Fragment ?=null
    // 数组容器  创建数组
    private val icons = arrayOf(arrayOf(R.mipmap.home_page_selected,R.mipmap.interview_guide_selected,
            R.mipmap.ask_every_day_selected,R.mipmap.my_page_selected),
            arrayOf(R.mipmap.home_page_unselected,R.mipmap.interview_guide_unselected,
                    R.mipmap.ask_every_day_unselected,R.mipmap.my_page_unselected))
    //lateinit(延迟加载)
    private lateinit var buttons:Array<TextView>

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

    private fun initData(){
        buttons = arrayOf(home_page,interview_guide,ask_every_day,my_page)
        switchFragment(fragments[0])
    }

    private fun initEvent(){
        buttons.forEach { it->
            it.setOnClickListener {
                switchFragment(fragments[buttons.indexOf(it)])
            }
        }
    }

    private fun switchFragment(fragment: Fragment){
        if (currentFragment == fragment){
            return
        }
        supportFragmentManager.fragments.forEach{
            if (it.isAdded && !it.isHidden){
                supportFragmentManager.beginTransaction().hide(it).commit()
            }
        }
        if (!fragment.isAdded){
            supportFragmentManager.beginTransaction().add(R.id.fragment_layout,fragment).commit()
        }else{
            supportFragmentManager.beginTransaction().show(fragment).commit()
        }
        currentFragment = fragment
        if (currentFragment !=null){
            val indexof = fragments.indexOf(currentFragment!!)
            (buttons.indices).forEach {
                val drawable = if(it == indexof) getDrawable(icons[0][it]) else getDrawable(icons[1][it])
                buttons[it].setCompoundDrawablesWithIntrinsicBounds(null,drawable,null,null)
            }
        }

    }

    inner class Adapter(fm:FragmentManager): FragmentPagerAdapter(fm){
        override fun getItem(position: Int): Fragment {
            return fragments[position]
        }

        override fun getCount(): Int {
            return fragments.count()    //返回此集合中的元素数
        }
    }

    //  修饰为伴生对象,伴生对象在类中只能存在一个,类似于java中的静态方法 Java 中使用类访问静态成员,静态方法。
    companion object{
        fun newIntent(context:Context): Intent {
            return Intent(context,MainActivity::class.java)
        }
    }


}

3.BaseFragment

package com.example.admin.zkotlin

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment

/**
Created by wrs on 10/12/2019,下午 3:01
projectName: ZKotlin
packageName: com.example.admin.zkotlin
 */
open abstract class BaseFragment : Fragment(){
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(getLayoutRes(),container,false)
    }

    abstract fun getLayoutRes():Int
}

4.具体的fragment

package com.example.admin.zkotlin;

import androidx.fragment.app.Fragment;

/**
 * Created by wrs on 10/12/2019,上午 11:47
 * projectName: ZKotlin
 * packageName: com.example.admin.zkotlin
 */
public class HomePageFragment extends BaseFragment {
    @Override
    public int getLayoutRes() {
        return R.layout.fragment_home;
    }
}

5.主界面布局

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/fragment_layout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/bottom_container"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:id="@+id/bottom_container"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <TextView
            android:id="@+id/home_page"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:drawableTop="@mipmap/home_page_selected"
            android:gravity="center"
            android:padding="8dp"
            android:text="首页"
            android:textSize="10sp"
            tools:ignore="SmallSp" />

        <TextView
            android:id="@+id/interview_guide"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:drawableTop="@mipmap/interview_guide_unselected"
            android:gravity="center"
            android:padding="8dp"
            android:text="面试指南"
            android:textSize="10sp"
            tools:ignore="SmallSp" />

        <TextView
            android:id="@+id/ask_every_day"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:drawableTop="@mipmap/ask_every_day_unselected"
            android:gravity="center"
            android:padding="8dp"
            android:text="每日一问"
            android:textSize="10sp"
            tools:ignore="SmallSp" />

        <TextView
            android:id="@+id/my_page"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:drawableTop="@mipmap/my_page_unselected"
            android:gravity="center"
            android:padding="8dp"
            android:text="我的"
            android:textSize="10sp"
            tools:ignore="SmallSp" />
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

end,差不多就这些,其他的几个fragment,都是重复一样的内容,另外缺的图片资源和布局资源,请自行添加补上

### Android KotlinFragment 切换的最佳实践 在 Android 应用开发中,使用 Kotlin 实现 Fragment 之间的切换是一项常见需求。为了确保最佳性能和用户体验,在实现过程中应遵循一定的设计模式和技术要点。 #### 使用 ViewModel 和 Navigation 组件简化管理 推荐采用 Jetpack 的 `ViewModel` 来保存状态数据以及处理业务逻辑,这样可以保证即使配置发生变化(如屏幕旋转),这些信息也不会丢失。同时利用官方提供的导航架构组件来定义页面间的转换关系,这不仅使代码更加简洁易读,而且有助于构建更直观的应用程序结构[^2]。 #### 动态替换而非静态嵌套 对于动态加载的 Fragments,应该通过编程方式将其添加到容器视图内而不是直接在布局文件里声明子 Fragment。这样做可以让开发者更好地控制何时显示哪个片段,并且方便地移除不再需要的部分。 #### 示例代码展示 下面是一个简单的例子,展示了如何在一个 Activity 或者 Parent Fragment 内部完成两个或更多个 Child Fragment 的平滑过渡: ```kotlin // 假设当前处于某个ParentFragment内部 fun changePage(fragmentIndex: Int) { // 获取FragmentManager实例 val childFragmentManager = this.childFragmentManager // 开启事务 val transaction = childFragmentManager.beginTransaction() // 找到目标Fragment并设置tag以便后续查找 var targetFragment : Fragment? = null when (fragmentIndex){ 0 -> targetFragment = FirstChildFragment.newInstance() 1 -> targetFragment = SecondChildFragment.newInstance() else -> throw IllegalArgumentException("Invalid index") } // 如果已经存在则重用已有的实例 if(targetFragment != null && !targetFragment.isAdded()){ transaction.replace(R.id.fragment_container_view, targetFragment,"TAG_$fragmentIndex") .addToBackStack(null)// 可选操作:允许按Back键回退至上一界面 .commitNowAllowingStateLoss() // 提交更改 }else{ Log.d(TAG,"Fragment already added or creation failed.") } } ``` 此段代码实现了基于索引参数决定要显示哪一个具体的子 Fragment ,并通过调用 `replace()` 方法来进行实际的内容更新工作;另外还加入了对 BackStack 的支持以增强交互体验。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值