2017-08-03 101 views
0

我目前正在建立一个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延伸,我无法实现同样的效果。

回答

1

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

随着机器人:片段属性,每个报头声明PreferenceFragment的实例 当用户选择的 标头应打开。

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

你能做什么,不过,是在你的PreferenceActivity或主PreferenceFragment,对偏好设置onClickListener然后用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 
       } 
      }) 
    } 
}