java - 首选项 fragment 在交易中返回 null

标签 java android android-fragments android-preferences

我试图在我的应用程序中实现一个首选项 fragment ,因此我设置了 preferences.xml 文件、应该显示首选项的 fragment 和 fragment 事务。当我尝试显示 SettingsFragment 时,应用程序崩溃并显示以下错误日志:

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:431)
                                                              at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:481)
                                                              at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:472)
                                                              at com.ikurek.pwr.MainActivity.onNavigationItemSelected(MainActivity.java:145)
                                                              at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:153)
                                                              at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:810)
                                                              at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
                                                              at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:957)
                                                              at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:328)
                                                              at android.view.View.performClick(View.java:4780)
                                                              at android.view.View$PerformClick.run(View.java:19866)
                                                              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)

为什么这个对象为空?我还应该如何设置设置 fragment ?我知道这个解决方案可能非常简单,但不知何故我无法自己解决这个问题。这是我的代码:

从MainActivity调用 fragment 事务的部分:

public boolean onNavigationItemSelected(MenuItem item) {

    Fragment fragment = null;
    Class fragmentClass = null;
    int id = item.getItemId();

    if (id == R.id.nav_news) {
        fragmentClass = NewsFragment.class;

    } else if (id == R.id.nav_map) {
        fragmentClass = CatFragment.class;

    } else if (id == R.id.nav_buildings) {
        fragmentClass = BuildingsFragment.class;

    } else if (id == R.id.nav_settings) {
       fragmentClass = SettingsFragment.class;


    } else if (id == R.id.nav_info) {
        fragmentClass = AppInfoFragment.class;


    } else if (id == R.id.nav_bugreport) {
        fragmentClass = ContactFragment.class;

    }


    try {
        fragment = (Fragment) fragmentClass.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }


    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.frameLayoutForFragments, fragment).commit();

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

我的 preferences.xml:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
    android:defaultValue="false"
    android:key="saveLastPosition"
    android:summary="1st check box"
    android:title="Check"/>
<CheckBoxPreference
    android:defaultValue="true"
    android:key="keepScreenOn"
    android:summary="2nd check box"
    android:title="Box"/>
</PreferenceScreen>

还有我的 SettingsFragment:

public class SettingsFragment extends PreferenceFragment {

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


public static SettingsFragment newInstance() {
    SettingsFragment fragment = new SettingsFragment();

    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
}


}

最佳答案

据我所知,您正在将一个空 fragment 传递给您的 fragment 管理器。你会注意到:

Fragment fragment = null;
Class fragmentClass = SettingsFragment.class;
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frameLayoutForFragments, fragment).commit();

你有:

Fragment fragment = null;

您实际上从未将其声明为 SettingsFragment。你应该有:

Fragment fragment = new SettingsFragment();

或者在你的替换语句中声明它。

Class fragmentClass = SettingsFragment.class;
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frameLayoutForFragments, new SettingsFragment()).commit();

关于java - 首选项 fragment 在交易中返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39517310/

相关文章:

java - Nashorn - 调试在 Nashorn 中运行的 javascript

java - 为什么 JNCryptor/RNCryptor 库会抛出 InvalidHMACException?

android多线程程序速度慢

java - 从 SQLite 数据库中检索图像并显示在 ListView 中

java - 在 android 中为 fragment 创建 "Shell"

java - 如何将谷歌地图 fragment 与操作栏选项卡一起使用

android - 导航架构组件-如何刷新 fragment ?

java - java多线程中的锁不起作用

java - 找到 JTable 单元格并绘制它

android - 使用 setFlashMode - Android 2.2