Fragment 可以像 MainActivity 一样工作吗?

问题描述

项目 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)

解决方法

您必须将 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 并将其附加到您的选项卡式布局。