如何在 DialogFragment 中添加 PreferenceFragment
How to add a PreferenceFragment in a DialogFragment
我一直在尝试在 dialogFragment 中显示 PreferenceFragment,但我不确定如何...
我尝试将 preferencefragment 放入布局中
<?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>
然后在 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
}
在我的主 activity 上,我这样称呼它:
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);
}
}
}
我第一次调用它时,它出现了,但在第二次尝试时。它崩溃了..
还有另一种方法可以在对话框中显示 PreferenceFragment 吗?
有人可以让我知道该怎么做吗?
谢谢
这是我收到的错误信息
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.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.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)
我在另一个 post 中找到了答案:
Duplicate ID, tag null, or parent id with another fragment for com.google.android.gms.maps.MapFragment
所以当我将它添加到我的 onDestroyView 时
override fun onDestroyView() {
super.onDestroyView()
val frag = fragmentManager.findFragmentById(R.id.settings_fragment) as SettingsFragment?;
if (frag != null)
fragmentManager.beginTransaction().remove(frag).commit();
}
一切正常。如果有人能想出更好的方法来创建首选项对话框,请告诉我
我一直在尝试在 dialogFragment 中显示 PreferenceFragment,但我不确定如何...
我尝试将 preferencefragment 放入布局中
<?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>
然后在 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
}
在我的主 activity 上,我这样称呼它:
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);
}
}
}
我第一次调用它时,它出现了,但在第二次尝试时。它崩溃了.. 还有另一种方法可以在对话框中显示 PreferenceFragment 吗? 有人可以让我知道该怎么做吗? 谢谢
这是我收到的错误信息
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.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.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)
我在另一个 post 中找到了答案: Duplicate ID, tag null, or parent id with another fragment for com.google.android.gms.maps.MapFragment
所以当我将它添加到我的 onDestroyView 时
override fun onDestroyView() {
super.onDestroyView()
val frag = fragmentManager.findFragmentById(R.id.settings_fragment) as SettingsFragment?;
if (frag != null)
fragmentManager.beginTransaction().remove(frag).commit();
}
一切正常。如果有人能想出更好的方法来创建首选项对话框,请告诉我