2016-09-15 35 views
2

我想在我的應用中實現首選項片段,因此我設置了preferences.xml文件,應該顯示首選項的片段以及片段事務。當我嘗試顯示SettingsFragment時,該應用程序與此錯誤日誌崩潰:偏好片段在事務上返回null

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) 

爲什麼此對象爲空?我還應該如何設置一個設置片段?我知道這個解決方案非常簡單,但不知何故我無法自己弄清楚。這裏是我的代碼:

部分調用從MainActivity片段交易:

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); 
} 


} 
+1

'Class fragmentClass = SettingsFragment.class;' - 你在做什麼? –

+0

我剛更新了我用來從抽屜中調用片段的代碼的問題,您可以現在檢查它。 – TheTechGuy96

回答

1

那麼從我可以告訴你將一個空片段傳遞給你的片段管理器。正如你會發現:

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(); 
+0

我更新了代碼,當我粘貼它時錯過了那部分代碼 – TheTechGuy96