android - 自定义 fragment 的偏好

标签 android android-fragments android-dialogfragment

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

Sets the class name of a fragment to be shown when this Preference is clicked.

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

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

这就是我定义自定义 fragment 的方式(它实际上扩展了 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();
    }
}

但是当我点击那个首选项时没有任何反应,自定义 fragment 没有显示。我在这里错过了什么吗?

有人可能会问我为什么要强制自定义 DialogFragment。这只是因为我可以访问 getChildFragmentManager 方法,如果我的自定义 fragment 从 DialogPreference 扩展,我将无法实现同样的事情。

最佳答案

这不是明确的,但我认为 fragment 必须是 PreferenceFragment。

With the android:fragment attribute, each header declares an instance of PreferenceFragment that should open when the user selects the header.

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

不过,您可以在 PreferenceActivity 或主 PreferenceFragment 中为该首选项设置一个 onClickListener,然后使用 FragmentManager 在将 fragment 添加到后台堆栈后显示该 fragment :

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
                }
            })
    }
}

关于android - 自定义 fragment 的偏好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45489214/

相关文章:

android - hierarchyViewer 中 mLeft 和 mRight 显示的是什么?

安卓光标问题

java - 如何在android中清除Canvas?

android - DialogFragment FEATURE_NO_TITLE 已缩小

android - IllegalStateException - 调用 DialogFragment.show() 方法时无法在 onSaveInstanceState 之后执行此操作

android - fragment 已经添加,对话框 fragment ?

具有本地 LAN IP 的 Android 自签名证书

android - 我如何从这个错误处理类在 Android 中启动一个新的 Activity?

java - "Only the original thread that created a view hierarchy can touch its views. "如何解决我的情况下的崩溃?

java - 单选按钮状态始终为 'checked'