现在setTargetFragment()被废弃了,如何替换它?

14

setTargetFragment() 在Java中已被弃用,我不理解正确的替代方法,因为Android文档使用它并且已经过时。我认为FragmentManager是其正确的替代方法。我在我的设置偏好中使用废弃的setTargetFragment函数来创建多个首选项屏幕。为此,最初我按照这里的指南进行,并且示例混淆地使用了setTargetFragment。以下是我的代码:

build.gradle (Module: app)
...
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.preference:preference:1.1.1'
...
MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var settingsButton: ImageButton

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        settingsButton = findViewById(R.id.settingsButtonMain)
        settingsButton.setOnClickListener {
            settingsClicked()
        }
        ...
    }

    private fun settingsClicked() {
        val settingsIntent = Intent(this, SettingsActivity::class.java)
        startActivity(settingsIntent)
    }
}
SettingsActivity.kt

class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        supportFragmentManager.beginTransaction().replace(R.id.settings, SettingsFragment(this)).commit()
        supportFragmentManager.addOnBackStackChangedListener {
            if(supportFragmentManager.backStackEntryCount == 0) {
                title = "App Settings"
            }
        }
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        ...
    }

    class SettingsFragment(cont: Context) : PreferenceFragmentCompat() {
        private var context1: Context = cont

        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey)
        }
    }

    class Screen2PreferencesFragment : PreferenceFragmentCompat() {
        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
            setPreferencesFromResource(R.xml.screen2_preferences, null)
        }
    }

    override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat?, pref: Preference): Boolean {
        val args: Bundle = pref.extras
        val fragment: Fragment = supportFragmentManager.fragmentFactory.instantiate(classLoader, pref.fragment)
        fragment.arguments = args
        fragment.setTargetFragment(caller, 0) //TROUBLE AREA. WHAT IS THE CORRECT REPLACEMENT HERE?
        supportFragmentManager.beginTransaction().replace(R.id.settings, fragment).addToBackStack(null).commit()
        return true
    }

    override fun onSupportNavigateUp(): Boolean {
        if(supportFragmentManager.popBackStackImmediate()) {
            return true
        }
        return super.onSupportNavigateUp()
    }
}

请参阅:在片段之间传递结果。 - Benny
2个回答

11

在项目依赖中添加以下内容:

implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01'

请使用setFragmentResultListener代替setTargetFragment()

override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat?, pref: Preference): Boolean {
    val args: Bundle = pref.extras
    val fragment: Fragment = supportFragmentManager.fragmentFactory.instantiate(classLoader, pref.fragment)
    fragment.arguments = args
    supportFragmentManager.beginTransaction().replace(R.id.settings, fragment).addToBackStack(null).commit()
    
    supportFragmentManager.setFragmentResultListener("requestKey") { key, bundle ->
        if (key == "requestKey") {
            // Get result from bundle
        }
    }
    
    return true
}

在返回结果的片段中:

// Insert result in a bundle
setFragmentResult("requestKey", bundle)

setFragmentResultListener 未解决。我想我需要实现一个接口? - Tom
我想我弄清楚了。如果我错了,请纠正我。setFragmentResultListener 应该实际上是这样的:\nval result = "result" setFragmentResult("requestKey", bundleOf("bundleKey" to result))需要实现 FragmentResultOwner 并覆盖类这里(注释中不显示新行,所以我在应该有的地方添加了 \n)。 - Tom
如果未解决,请添加 import androidx.fragment.app.setFragmentResultListener。使用 bundleOf("bundleKey" to result) 创建一个 bundle,并将其作为参数添加到 setFragmentResult() 中,就像答案中所示的那样。 - Saurabh Thorat
从我的测试来看,这绝对需要实现“FragmentResultOwner”。如果没有或只使用建议的导入(似乎无效),它将不起作用。感谢你的帮助。 - Tom

0
针对使用setFragmentResult时出现的未解决问题,您可以尝试按照上面的答案使用fragmentManager进行操作。
这是针对Xamarin的:
ParentFragmentManager.SetFragmentResult("requestKey", bundle);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接