android-fragments 应用的活动与片段

wmvff8tz  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(240)

我一直在尝试解决这个问题。我看到很多开发者和youtubers(教程)说,我们应该尽可能少地使用Activity,以获得更快、更高效、资源更少的代码/应用。我想知道是否有一种方法可以创建一个登录和注册,只使用登录和注册的MainActivity,并结合它们之间的导航片段。
"或者"
我们是否需要至少2个或更多活动来处理该流程(登录和注册)?
示例:1个活动用于登录,1个活动用于注册。
感谢并欢迎任何关于此主题的答案!

wtlkbnrh

wtlkbnrh1#

从理论上讲,您可以让整个应用程序在单个Activity上运行,并对所有页面使用Fragments。
每个片段在Activity中都有自己的生命周期。
MainActivity可以如下所示

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        loadFragment(2)
    }

    public fun loadFragment(page: Int){
        if(page == 1){
            // load login
            val manager = supportFragmentManager.beginTransaction()
            manager.replace(R.id.fragment_holder, LoginFragment()).commit()
        }else{
            // load register
            val manager = supportFragmentManager.beginTransaction()
            manager.replace(R.id.fragment_holder, LoginFragment()).commit()
        }
    }
}

LoginFragment可以如下所示

class LoginFragment : Fragment() {

    lateinit var myButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_login, container, false)
        myButton = view.findViewById(R.id.my_button)

        myButton.apply {
            setOnClickListener { toRegister() }
        }
        return view;
    }

    fun toRegister(){
        // replace the fragment in main activity with register fragment
        (requireActivity() as MainActivity).loadFragment(1)
    }
}

RegisterFragment可以如下所示

class RegisterFragment : Fragment() {

    lateinit var mButton: Button
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_register, container, false)
        mButton = view.findViewById(R.id.my_button)
        mButton.apply {
            setOnClickListener { toLogin() }
        }
        return view;
    }

    fun toLogin(){
        // replacing the fragment in the main activity with the login fragment
        (requireActivity() as MainActivity).loadFragment(1)
    }
}

**基本上,我们通过调用loadfragment来替换Activity中显示的片段。**此逻辑可以根据需要应用于任意多个片段。

相关问题