【问题标题】:Which Fragment Manager is needed for TimePickerDialogue Fragment kotlinTimePickerDialogue Fragment kotlin 需要哪个 Fragment Manager
【发布时间】:2018-06-14 10:47:29
【问题描述】:

我正在尝试实现一个简单的 TimePickerDialogue 片段,该片段在布局中按下按钮时显示,该按钮也是一个片段。 Android 开发者指南用 Java 显示了这一点:

public void showTimePickerDialog(View v) {
    DialogFragment newFragment = new TimePickerFragment();
    newFragment.show(getSupportFragmentManager(), "timePicker");
}

然后说:

show() 方法需要 FragmentManager 的实例和片段的唯一名称。

当我将它转换为 Kotlin 时,没有提供 getSupportFragmentManager 方法。我应该改用什么?

class AlertsFragment : Fragment() {    

    fun showTimePickerDialog(v: View) {
        val newFragment = TimePickerFragment()
        newFragment.show(FragmentManager(), "timePicker") // WHAT FRAGMENTMGR???
    }
}

我正在导入android.support.v4.app.Fragment

我的 MainActivity 将显示 TimePickerDialogue 片段以及具有打开 TimePickerDialogue 的按钮的片段。 MainActivity 有一个使用片段的选项卡布局。 是否需要在 MainActivity 中更改任何内容以使 TimePickerDialogue show() 函数在 AlertsFragment 中工作?

class MainActivity : FragmentActivity(){

    private lateinit var pagerAdapter: TabPagerAdapter

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

        setContentView(R.layout.activity_main)

        pagerAdapter = TabPagerAdapter(supportFragmentManager)
        pagerAdapter.addFragments(WorkoutGridFragment(), "Workouts")
        pagerAdapter.addFragments(AlertsFragment(), "Reminders")
        pagerAdapter.addFragments(AboutFragment(), "About")

        // customViewPager is the viewpager created in the activity_main xml layout
        customViewPager.adapter = pagerAdapter

        // set up the viewpager with the tablayout
        customTabLayout.setupWithViewPager(customViewPager)
    }
}

【问题讨论】:

    标签: android android-fragments kotlin dialog datetimepicker


    【解决方案1】:

    片段没有 SupportFragmentManager 字段或 getter。无论您是用 Kotlin 还是 Java 编写,这都适用。

    但是,活动可以。所以调用activity并获取supportFragmentManager:

    fun showTimePickerDialog(v: View) {
        val newFragment = TimePickerFragment()
        newFragment.show(activity.supportFragmentManager, "timePicker") 
    }
    

    另外,如果 this 是您在文档中阅读的内容,您会看到:

    还要确保显示时间选择器的您的活动扩展了FragmentActivity,而不是标准的活动类。 (强调我的)

    这意味着showTimePickerDialog 方法是在一个Activity 中定义的。不要误会,我并不是说您必须在活动中定义它,但由于这是他们在文档中所做的,他们可以直接调用 SupportFragmentManager。但是,如果您从片段或活动之外的任何地方调用它,则需要一个活动实例。

    【讨论】:

    • 感谢 Zoe,当我添加活动时。红色错误线移动显示。我的 MainActivity 显示 timePicker 和 Fragment,我让它扩展 AppCompatActivity。 showTimePickerDialog 作为按钮的 onclick 属性添加到片段 XML 文件中。我是否必须改为在片段中定义按钮?
    • 我无法使用val x: DialogFragment; x.show() 重现(显然不会运行,但不会显示为错误)。 TimePIckerFragment 是否真的扩展了 DialogFragment
    • 类 TimePickerFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener {
    • 仍然无法重现。您可能需要使缓存无效并重新启动,但 show 对我来说很好
    • 在包含片段的 MainActivity 中,我是否必须以某种方式声明 supportFragmentManager?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多