自定义片段的首选项

问题描述 投票:1回答:2

我目前正在xml文件中构建PreferenceScreen。它的一个子元素,更准确地说是Preference元素,有一个名为android:setFragment的属性,其描述如下:

设置单击此“首选项”时要显示的片段的类名。

所以我在首选项xml文件中添加了自定义片段:

<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
    <Preference
        android:title = "test"
        android:fragment="com.test.bla.SomeTestFragment"/>
</PreferenceScreen>

这是我定义我的自定义片段(实际上扩展DialogFragment)的方式:

public class SomeTestFragment extends DialogFragment 
{
    public static final String FRAGMENT_TAG = SomeTestFragment.class.getName();

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Dialog dialog = new Dialog(getContext());
        dialog.setTitle("Delete User");

        FragmentDeleteUserBinding binding = FragmentDeleteUserBinding.inflate(LayoutInflater.from(getContext()));
        binding.setFragment(this);

        dialog.setContentView(binding.getRoot());
        return dialog;
    }

    public void onClickDeleteCredential()
    {
       DeleteCredentialFragment.deleteCredential(getChildFragmentManager());
    }


    public void onClickClose()
    {
        dismiss();
    }
}

但当我点击该偏好没有任何反应时,自定义片段没有显示。我在这里想念一下吗?

有人可能会问为什么我强迫我的自定义DialogFragment。这只是因为我可以访问getChildFragmentManager方法,如果我的自定义片段从DialogPreference延伸,我无法实现相同的功能。

android android-fragments android-dialogfragment
2个回答
1
投票

它不明确,但我认为片段必须是PreferenceFragment。

使用android:fragment属性,每个头都声明一个PreferenceFragment实例,该实例应该在用户选择头时打开。

https://developer.android.com/guide/topics/ui/settings.html

但是,您可以在PreferenceActivity或主PreferenceFragment中执行操作,在该首选项上设置onClickListener,然后在将片段添加到backstack后使用FragmentManager显示该片段:

class SettingsFragment: PreferenceFragment() {

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

            // Set click listener for directory picker
            findPreference("addKeyboard").setOnPreferenceClickListener( {
                preference ->

                try {
                    // Display the fragment as the main content.
                      fragmentManager.beginTransaction()
                            .replace(android.R.id.content, ManageKeyboardsFragment())
                            .addToBackStack(null)
                            .commit()
                    true

                } catch (e: Exception) {
                    displayError("could not open managekeyboards fragment", e)
                    true
                }
            })
    }
}

0
投票

看起来您在fragment attribtue中提供的字符串只是要发送到您的父活动的消息。您的父活动负责实例化正确的Fragment,并执行仪式以呈现它。

platform docs似乎表明如下:

当用户使用关联的片段点击Preference时,将调用接口方法PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment()

onPreferenceStartFragment的参数似乎是点击的Preference和托管它的PreferenceFragmentCompat。

该页面包含一个代码示例,其中onPreferenceStartFragment的实现将返回值pref.getFragment()传递给getSupportFragmentManager().getFragmentFactory().instantiate

此时,我正在使用Xamarin,无论出于何种原因,getFragmentFactory没有相应的API。但遗憾的是,fragment属性不是魔术;你的Activity必须做繁重的工作。

这是一个related answer,我写了一个更完整的工作示例,但在C#/ Xamarin中。

© www.soinside.com 2019 - 2024. All rights reserved.