【问题标题】:Android Navigate to PreferenceFragment from app.FragmentAndroid 从 app.Fragment 导航到 PreferenceFragment
【发布时间】:2018-06-02 08:01:25
【问题描述】:

我创建了一个 Android Studio 项目,并基于 (Mike Penz) 的 Github 项目实现了一个导航抽屉

抽屉工作正常,我可以导航到菜单片段。

我只有一个问题需要帮助。

我的 (SettingsFragment) 扩展了 (PreferenceFragment) 但我无法导航设置片段。它只是让应用程序崩溃。

SettingsFragment.Java

public class SettingsFragment extends PreferenceFragment {


    public SettingsFragment() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.settings);
    }

}

以下是导航到不同片段的代码

MainActivity.Java

...

public void selectDrawerItem(int ItemId,IDrawerItem drawerItem) {
        // Create a new fragment and specify the fragment to show based on nav item clicked
        Fragment fragment = null;
        Class fragmentClass;
        switch(ItemId) {
            case 1:
                fragmentClass = OneFragment.class;
                break;
            case 2:
                fragmentClass = TwoFragment.class;
                break;
            case 3:
                fragmentClass = ThreeFragment.class;
                break;
            case 4:
                fragmentClass = FourFragment.class;
                break;
            case 5:
                fragmentClass = SettingsFragment.class;
                break;
            default:
                fragmentClass = OneFragment.class;
        }
        try {
            fragment = (Fragment) fragmentClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
        result.closeDrawer();
    }

...

LogCat 输出

12-19 20:32:06.619 10651-10651/com.company.app W/System.err: java.lang.ClassCastException: com.company.app.fragments.SettingsFragment cannot be cast to android.support.v4.app.Fragment
12-19 20:32:06.619 10651-10651/com.company.app W/System.err:     at com.company.app.activities.MainActivity.selectDrawerItem(MainActivity.java:259)
12-19 20:32:06.620 10651-10651/com.company.app W/System.err:     at com.company.app.activities.MainActivity$3.onItemClick(MainActivity.java:225)
12-19 20:32:06.620 10651-10651/com.company.app W/System.err:     at com.mikepenz.materialdrawer.DrawerBuilder$6.onClick(DrawerBuilder.java:1768)
12-19 20:32:06.620 10651-10651/com.company.app W/System.err:     at com.mikepenz.materialdrawer.DrawerBuilder$6.onClick(DrawerBuilder.java:1742)
12-19 20:32:06.620 10651-10651/com.company.app W/System.err:     at com.mikepenz.fastadapter.FastAdapter$1.onClick(FastAdapter.java:580)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at com.mikepenz.fastadapter.utils.EventHookUtil$1.onClick(EventHookUtil.java:72)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at android.view.View.performClick(View.java:6256)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at android.view.View$PerformClick.run(View.java:24701)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at android.os.Handler.handleCallback(Handler.java:789)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:98)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at android.os.Looper.loop(Looper.java:164)
12-19 20:32:06.622 10651-10651/com.company.app W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6541)
12-19 20:32:06.622 10651-10651/com.company.app W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-19 20:32:06.622 10651-10651/com.company.app W/System.err:     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
12-19 20:32:06.622 10651-10651/com.company.app W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
12-19 20:32:06.628 10651-10651/com.company.app D/AndroidRuntime: Shutting down VM
12-19 20:32:06.630 10651-10651/com.company.app E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: com.company.app, PID: 10651
                                                                      java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
                                                                          at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:394)
                                                                          at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:441)
                                                                          at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:432)
                                                                          at com.company.app.activities.MainActivity.selectDrawerItem(MainActivity.java:265)
                                                                          at com.company.app.activities.MainActivity$3.onItemClick(MainActivity.java:225)
                                                                          at com.mikepenz.materialdrawer.DrawerBuilder$6.onClick(DrawerBuilder.java:1768)
                                                                          at com.mikepenz.materialdrawer.DrawerBuilder$6.onClick(DrawerBuilder.java:1742)
                                                                          at com.mikepenz.fastadapter.FastAdapter$1.onClick(FastAdapter.java:580)
                                                                          at com.mikepenz.fastadapter.utils.EventHookUtil$1.onClick(EventHookUtil.java:72)
                                                                          at android.view.View.performClick(View.java:6256)
                                                                          at android.view.View$PerformClick.run(View.java:24701)
                                                                          at android.os.Handler.handleCallback(Handler.java:789)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:98)
                                                                          at android.os.Looper.loop(Looper.java:164)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

【问题讨论】:

标签: java android android-fragments sharedpreferences


【解决方案1】:

SettingsFragment 正在扩展无法转换为FragmentPreferenceFragment

解决方法是在新创建的Fragment 类中单独加载PreferenceFragment

代码

 public class SettingsFragment extends Fragment {

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        getActivity().getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new MyPreferenceFragment())
                .commit();
    }

    public static class MyPreferenceFragment extends PreferenceFragment {
        public MyPreferenceFragment() {
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.settings);
        }
    }
}

也适用于您的 Fragment 根布局:添加

android:background="?android:windowBackground"
android:clickable = "true"

这将解决fragment导航中的重叠问题。

【讨论】:

  • logcat 说...java.lang.ClassCastException: com.company.app.fragments.SettingsFragment cannot be cast to android.support.v4.app.Fragment-----@petey
  • 是的,完全错过了。但是会观察到同样的问题。这个问题的答案可以在这里找到:stackoverflow.com/questions/35919798/…
  • 这正是我使用getFragmentManager()的原因...因为getSupportFragmentManager()不起作用...
  • 感谢您的帮助 - 现在工作正常,但是还有另一个小问题。当我导航到其他片段时,(设置片段)总是在后台加载
  • android.R.id.content..替换为您的Framelayout..id --R.id.flContent
猜你喜欢
  • 1970-01-01
  • 2013-06-15
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多