2017-08-21 19 views
0

私のアクティビティには、コンテナアクティビティが作成されると2つのテキストビューのプリファレンスからテキストを設定するはずの、見えないフラグメントがあります。フラグメントのonActivityCreatedのtextviewテキストを設定するとクラッシュする

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

    mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    //Get new strings for name and motto if any 
    mName = mPrefs.getString(getString(R.string.pref_name) , getString(R.string.your_name)); 
    mMotto = mPrefs.getString(
      getString(R.string.pref_motto), 
      getString(R.string.your_motto) 
    ); 

    //Find name and motto text views 
    TextView yourName = getActivity().findViewById(R.id.tv_your_name); 
    TextView yourMotto = getActivity().findViewById(R.id.tv_your_motto); 
    //Set name and motto text views 
    yourName.setText(mName); 
    yourMotto.setText(mMotto); 
} 

つのテキストビューがナビゲーション引き出しアンドロイドに含まれるナビゲーション・ヘッダ内に定義されている:headerLayout次のようにIはonActivityCreatedでこれを行います。ナビゲーション・ドロワはMainActivity内で初期化されます(マイ・フラグメントを保持するアクティビティ)。しかし、次のエラーでアプリケーションがクラッシュします。私はonCreateViewでテキストビューを設定しようとしましたが、同様にクラッシュしました。

 --------- beginning of crash 
08-21 17:03:27.311 4068-4068/? E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.mehdi.memo, PID: 4068 
    java.lang.RuntimeException: Unable to start activity 
    ComponentInfo{com.mehdi.memo/com.mehdi.memo.MainActivity}: 
    java.lang.NullPointerException: Attempt to invoke virtual method 'void 
    android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    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) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 
    at com.mehdi.memo.AlarmFragment.onActivityCreated(AlarmFragment.java:145) 
    at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2346) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1442) 
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809) 
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799) 
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580) 
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367) 
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229) 
    at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3221) 
    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3171) 
    at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192) 
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:552) 
    at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177) 
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1333) 
    at android.app.Activity.performStart(Activity.java:6992) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2780) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)  
    at android.app.ActivityThread.-wrap11(Unknown Source:0)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)  
    at android.os.Handler.dispatchMessage(Handler.java:105)  
    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)  
+0

キャストはどこですか?TextView yourName =(TextView)getActivity()。findViewById(R.id.tv_your_name); – Cloy

+0

@Cloy私はキャスト構文を必要としないAndroid Studio 3.0を使用しています。 – JasonStack

答えて

0

これは、テキストビューを見つけることができないためです。フラグメント内にビューを割り当てるベストプラクティスは、onCreateViewまたはonViewCreateメソッドのいずれかです。これを参照してください。

@Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.your_fragment_layout, container, false); 
    } 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    //Get new strings for name and motto if any 
    mName = mPrefs.getString(getString(R.string.pref_name) , getString(R.string.your_name)); 
    mMotto = mPrefs.getString(
     getString(R.string.pref_motto), 
     getString(R.string.your_motto) 
    ); 

    //finding textviews from your layout file and assigning values 

    TextView yourName = view.findViewById(R.id.tv_your_name); 
    TextView yourMotto = view.findViewById(R.id.tv_your_motto); 
    //Set name and motto text views 
    yourName.setText(mName); 
    yourMotto.setText(mMotto); 
} 
+0

クラッシュは解決されますが、これは2つのテキストビューを設定しません。とにかく指摘のおかげで。 – JasonStack

+0

あなたはmNameとmMotto変数の中に値を持っていますか? –

+0

はい私は、アプリケーションの設定(EditTextPreferenceで設定)内の値を持っています – JasonStack

関連する問題