2
votes

I've been trying to show a PreferenceFragment inside of a dialogFragment but im not sure how...

I tried to put the preferencefragment in a layout

   <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical" android:layout_width="match_parent"
   android:layout_height="match_parent">
   <fragment
    android:id="@+id/settings_fragment"
    android:name="com.example.test.Fragments.SettingsFragment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
   </LinearLayout>

then using it in the onCreateView

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    super.onCreate(savedInstanceState);
    val view = inflater!!.inflate(R.layout.dialog_preference, container, false)
    return view
}

On my main activity im calling it like this:

   override fun onClick(view: View) {
    val id = view.id
        when (id) {
            R.id.btnSettings -> {
                val dialog = SettingsDialog();
                dialog.onCancel(object : DialogInterface {
                 override fun cancel() {
                     setTheme()
                 }

                 override fun dismiss() {

                 }
                })
                dialog.show(fragmentManager, null);
            }
        }
    }

The first time i call it, it shows up but on the second try. It crashes.. Is there another way to show a PreferenceFragment in a dialog? Could someone please let me know how to do that? Thank you

This is the error message im getting

android.view.InflateException: Binary XML file line #5: Error inflating class fragment at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at com.example.test.Dialog.SettingsDialog.onCreateView(SettingsDialog.kt:20) at android.app.Fragment.performCreateView(Fragment.java:2053) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) at android.app.BackStackRecord.run(BackStackRecord.java:834) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.IllegalArgumentException: Binary XML file line #5: Duplicate id 0x7f0e0080, tag null, or parent id 0xffffffff with another fragment for com.example.test.Fragments.SettingsFragment at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2120) at android.app.Activity.onCreateView(Activity.java:5328) at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:34) at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)  at android.view.LayoutInflater.inflate(LayoutInflater.java:504)  at android.view.LayoutInflater.inflate(LayoutInflater.java:414)  at com.example.test.Dialog.SettingsDialog.onCreateView(SettingsDialog.kt:20)  at android.app.Fragment.performCreateView(Fragment.java:2053)  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894)  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)  at android.app.BackStackRecord.run(BackStackRecord.java:834)  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447)  at android.os.Handler.handleCallback(Handler.java:739)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5254)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

1

1 Answers

3
votes

I found the answer in another post: Duplicate ID, tag null, or parent id with another fragment for com.google.android.gms.maps.MapFragment

So when i added this to my onDestroyView

     override fun onDestroyView() {
    super.onDestroyView()
    val frag = fragmentManager.findFragmentById(R.id.settings_fragment) as SettingsFragment?;
    if (frag != null)
        fragmentManager.beginTransaction().remove(frag).commit();
}

Everything works fine. If anyone can think of a better way to create a preference dialog please do let me know