【问题标题】:How to add a PreferenceFragment in a DialogFragment如何在 DialogFragment 中添加 PreferenceFragment
【发布时间】:2016-04-08 20:06:16
【问题描述】:

我一直在尝试在 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
}

在我的主要活动中,我这样称呼它:

   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 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:504) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:414) 在 com.example.test.Dialog.SettingsDialog.onCreateView(SettingsDialog.kt:20) 在 android.app.Fragment.performCreateView(Fragment.java:2053) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 在 android.app.BackStackRecord.run(BackStackRecord.java:834) 在 android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) 在 android.app.FragmentManagerImpl$1.run(FragmentManager.java:447) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 原因:java.lang.IllegalArgumentException:二进制 XML 文件第 5 行:重复 id 0x7f0e0080、标签 null 或父 id 0xffffffff 与 com.example.test.Fragments.SettingsFragment 的另一个片段 在 android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2120) 在 android.app.Activity.onCreateView(Activity.java:5328) 在 android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:34) 在 android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:504) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:414) 在 com.example.test.Dialog.SettingsDialog.onCreateView(SettingsDialog.kt:20) 在 android.app.Fragment.performCreateView(Fragment.java:2053) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 在 android.app.BackStackRecord.run(BackStackRecord.java:834) 在 android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) 在 android.app.FragmentManagerImpl$1.run(FragmentManager.java:447) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

【问题讨论】:

    标签: android android-fragments android-preferences


    【解决方案1】:

    我在另一篇文章中找到了答案: 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();
    }
    

    一切正常。如果有人能想到更好的方法来创建偏好对话框,请告诉我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      相关资源
      最近更新 更多