2017-08-03 21 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を設定し、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 
       } 
      }) 
    } 
} 
関連する問題