【问题标题】:Can Fragment act like MainActivity?Fragment 可以像 MainActivity 那样工作吗?
【发布时间】:2021-09-09 21:36:25
【问题描述】:

项目1 我创建了一个应用程序,它扫描附近启用 wifidirect 的设备,其 UI 很简单,只有一个布局(activitymain.xml),代码在 MainActivity.java 和 WifiDirectBroadcastReceiver 中。 (代码可以在这里找到:Can't find nearby WiFi- Direct devices showing "No Device Found!"

项目2 现在,我想使用包含 2 个选项卡的 Tablayout(不是默认自定义),所以我必须使用 2 个片段。 我应该将 MainActivity(project1) 中的代码放在哪里? 我应该复制到 fragment1 还是 MainActivity(Project2)

【问题讨论】:

    标签: android android-fragments android-tablayout wifi-direct


    【解决方案1】:

    您必须将 MainActivity (project1) 的代码复制到选项卡式布局的片段中。然后像下面这样配置 SectionPagerAdapter。

    您还必须更改 MainActivity 的一些代码,以使其适合片段。

    private val TAB_TITLES = arrayOf(
        R.string.tab_text_1,
        R.string.tab_text_2
    )
    
    /**
    * A [FragmentPagerAdapter] that returns a fragment corresponding to
    * one of the sections/tabs/pages.
    */
    class SectionsPagerAdapter(private val context: Context, fm: FragmentManager)
    : FragmentPagerAdapter(fm) {
    
    override fun getItem(position: Int): Fragment {
        var fragment: Fragment? = null
    
        when (position) {
            0 -> fragment = Fragment1("f1","f1")
            1 -> fragment = Fragment2("f2","f2")
        }
    
        return fragment!!
    }
    
    override fun getPageTitle(position: Int): CharSequence? {
        return context.resources.getString(TAB_TITLES[position])
    }
    
    override fun getCount(): Int {
        // Show 2 total pages.
        return 2
    }
    }
    

    你可以像这样创建片段:

    private const val ARG_PARAM1 = "param1"
    private const val ARG_PARAM2 = "param2"
    
    class Fragment1 : Fragment() {
       private var param1: String? = null
       private var param2: String? = null
    
       private var _binding: Fragment1Binding? = null
       private val binding get() = _binding!!
    
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View {
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        val view = binding.root
    
        return view
    }
    
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
    
    
    override fun onPause() {
        super.onPause()
    }
    
    
    override fun onResume() {
        super.onResume()
    }
    
    companion object {
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
                HomeFragment().apply {
                    arguments = Bundle().apply {
                        putString(ARG_PARAM1, param1)
                        putString(ARG_PARAM2, param2)
                    }
                }
    }
    }
    

    您可以像这样制作 Fragment2 并将其附加到您的选项卡式布局中。

    【讨论】:

    • 这个答案对你有用吗?如果是,请接受。否则告诉我你的问题。
    • 但是 MainActivity(Project1) 中的 onPause() 和 onResume() 方法中有一些代码,如何将它们复制到片段? (据我所知片段有不同的生命周期)
    • fragments 里面也有 onPause 和 onResume 方法。这样您就可以将该代码复制给他们。
    • 我已经更新了关于如何创建片段的答案。你可以把它作为你的参考。如果满意,请采纳答案。 :)
    猜你喜欢
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多