从活动开始第二个片段

时间:2020-06-08 19:30:21

标签: android android-fragments

我正在学习Kotiln。因此,我希望实现的是这一点。我有一个MainActivity,容器显示了第一个片段(A)。我希望从片段A中打开第二个片段(B),并使用片段A上的按钮。然后通过返回按钮再次显示片段A(将其添加到堆栈中)。

MainActivity:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, MainFragment.newInstance())
                .commitNow()
        }

        val btn = findViewById<Button>(R.id.buttonFragment) //null

        btn.setOnClickListener {

            supportFragmentManager.beginTransaction()
                .add(R.id.container, SecondFragment.newInstance())
                .commitNow()
        }
    }
}

片段A:

 class MainFragment : Fragment() {

    companion object {
        fun newInstance() = MainFragment()
    }

    //private lateinit var viewModel: MainViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return inflater.inflate(R.layout.main_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        //viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        // TODO: Use the ViewModel
    }

}

片段B(与A相同): class SecondFragment:Fragment(){

    companion object {
        fun newInstance() = SecondFragment()
    }

    //private lateinit var viewModel: SecondViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.second_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        //viewModel = ViewModelProviders.of(this).get(SecondViewModel::class.java)
        // TODO: Use the ViewModel
    }

}

该按钮位于main_fragment.xml

1 个答案:

答案 0 :(得分:1)

如果需要在片段之间使用后退按钮导航,请使用add而不是replace

supportFragmentManager.beginTransaction()
            .add(R.id.container, MainFragment.newInstance())
            .addToBackstack(null)
            .commitNow()

[可选]我使用这两个方便的扩展功能在我的Activity中执行添加和替换:

fun AppCompatActivity.addFragment(fragment: Fragment, containerId: Int) {
    supportFragmentManager
        .beginTransaction()
        .addToBackStack(null)
        .add(containerId, fragment, fragment::class.java.simpleName)
        .commit()
}

fun AppCompatActivity.replaceFragment(fragment: Fragment, containerId: Int) {
    supportFragmentManager
        .beginTransaction()
        .replace(containerId, fragment, fragment::class.java.simpleName)
        .commit()
}

对于需要在FragmentA内部发生事件时将FragmentB添加到Activity back堆栈中FragmentA顶部的部分:

您可以使用回调接口:

您的片段定义合同(接口)

FragmentA {
    interface Callback {
        onSomeEventHappened()
    }

    private var listener: Callback? = null

    override fun onAttach(context: Context) {
        if (context is Callback) {
            listener = context
        } else throw Exception()
    }

    fun onSomeClickHappened() {
        listener.onSomeEventHappened()
    }
}

您的活动接受该合同

class MainActivity : FragmentA.Callback {
    override fun onSomeEventHappened() {
        //Replace or Add fragment
    }
}