2017-03-04 11 views
-1

私はAndroid開発の初心者です。私は数日から自習しています。私はユーチューブ上のいくつかのチュートリアルを次のですが、私はそれらの1、すなわち、この1に貼り付けられています:Androidのアプリケーションがラジオボタンのクリックでクラッシュし、NullPointerExceptionがスローされる

フラグメント活動コミュニケーション:チュートリアルでは、ラジオボタンから主な活動の背景色を変更することについてですhttps://www.youtube.com/watch?v=2c0Iog5rfxo&t=820s

フラグメントの選択。 私は彼がチュートリアルで行ったことを正確に行いましたが、ビデオで非推奨の方法、つまりonAttach(アクティビティアクティビティ)を使用したため、onAttachメソッドを別の方法で使用する必要がありました。だから私はONATTACH(コンテキストコンテキスト)(以下のコードを参照してください)

を使用しかし、私はラジオボタンを選択すると、私はエラーを取得しています、アプリがクラッシュし、エラーログは言う:

致命的な例外:メインを プロセス:フラグメントアプリケーション2、PID:4318 java.lang。 NullPointerExceptionが:NULLオブジェクト参照に 'ボイドcom.example.name.fragmentapplication2.ColorFragment $ OnColorChangeListener.colorChanged(java.lang.String)を'をインタフェースメソッドを呼び出す試みcom.example.name.fragmentapplication2で .ColorFragment $ 1.onCheckedChanged(ColorFragment.java:36)

これから私がFragmentクラスで作成したインターフェイスのインスタンスがnullであることがわかりました。この例外はこの例外を引き起こしています。 RadioGroupのOnCheckedChangeListenerでインスタンスを使用してその関数を呼び出すためです。以下は、フラグメントのクラスがある:

package com.example.name.fragmentapplication2; 

import android.app.Activity; 
import android.app.Fragment; 
import android.content.Context; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.RadioGroup; 

public class ColorFragment extends Fragment{ 
RadioGroup colorGroup; 
OnColorChangeListener onColorChangeListener;//interface instance initiated 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view; 
    view=inflater.inflate(R.layout.color_frag_layout,container,false); 
    colorGroup=(RadioGroup)view.findViewById(R.id.color_radio_group); 
    colorGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){ 
     @Override 
     public void onCheckedChanged(RadioGroup group, int CheckedId){ 
      switch (CheckedId) 
      { 
       case R.id.Red: 
        onColorChangeListener.colorChanged("#CF000F"); 
        break; 
       case R.id.black: 
        onColorChangeListener.colorChanged("#000000"); 
        break; 
       case R.id.gray: 
        onColorChangeListener.colorChanged("#6C7A89"); 
        break; 
      } 
     } 
    }); 
    return view; 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    Activity activity; 
    if(context instanceof Activity) 
    { 
     activity = (Activity)context; 
     try{ 
      onColorChangeListener = (OnColorChangeListener)activity; 
     }catch (ClassCastException e){ 
      throw new ClassCastException(activity.toString() 
        + " must implement OnColorChangeListener"); 

     } 
    } 
} 


public interface OnColorChangeListener 
{ 
    public void colorChanged(String ColorName); 
} 

} 

Logcat:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.name.fragmentapplication2, PID: 4318 
       java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.name.fragmentapplication2.ColorFragment$OnColorChangeListener.colorChanged(java.lang.String)' on a null object reference 
        at com.example.name.fragmentapplication2.ColorFragment$1.onCheckedChanged(ColorFragment.java:36) 
        at android.widget.RadioGroup.setCheckedId(RadioGroup.java:174) 
        at android.widget.RadioGroup.access$600(RadioGroup.java:54) 
        at android.widget.RadioGroup$CheckedStateTracker.onCheckedChanged(RadioGroup.java:358) 
        at android.widget.CompoundButton.setChecked(CompoundButton.java:157) 
        at android.widget.CompoundButton.toggle(CompoundButton.java:113) 
        at android.widget.RadioButton.toggle(RadioButton.java:78) 
        at android.widget.CompoundButton.performClick(CompoundButton.java:118) 
        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) 

だから、どのように私はこの問題を解決するのですか?ヌルを含まないようにインタフェースのインスタンスをどのように初期化するのですか?

答えて

0

余分な条件文を削除します。

Activity activity; 
if(context instanceof Activity) 
{ 
    activity = (Activity)context; 

Contextをリスナーにキャストするだけです。まずアクティビティにキャストする必要はありません。

context instanceof Activityがfalseのときは、nullリスナーを取得します。あなたがサポートかけらクラス

+0

を使用した場合


はあなたが本当に活動をしたい場合は、onAttach(Activity activity)があるはず私はそれを使用するが、それは私が言ったように、それが – ZeusCodes

+0

廃止されましたと言い、サポートフラグメントは、そのメソッドを持っており、それはありません廃止されました。あなたのチュートリアルではそれらを使用していないことを理解していますが、 –

+0

サポートフラグメントを使用する必要がありますか?このフラグメントのみを使用したい場合はどうすればよいですか? – ZeusCodes

関連する問題