我目前正在 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/