2016-09-15 4 views
2

私のアプリにプリファレンスフラグメントを実装しようとしているので、preference.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) 

なぜこのオブジェクトはnullですか?他にどのように設定フラグメントを設定する必要がありますか?私はこれのための解決策は確かに非常に簡単ですが、何とか私はこれを自分で理解することはできません。ここに私のコードは次のとおりです。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

まあ何Iからヌルフラグメントをフラグメントマネージャに渡していることを伝えることができます。あなたが気づくよう:

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

あなたは持っている:あなたが実際にSettingsFragmentとしてこれを宣言したことがない

Fragment fragment = null; 

Fragment fragment = new SettingsFragment(); 

または、置換ステートメントで宣言してください。

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

コードを更新しました。貼り付けたときにその部分が欠けていました – TheTechGuy96

関連する問題