2

getFailureDialog()インターフェイスのメソッドを呼び出そうとしていますOnSelectedListener。メソッドは に実装されていMainActivity.javaます。しかし、メソッドを呼び出すと、null ポインター例外が発生します。

OnSelectedListenerまだ初期化されておらず、初期化getFailureDialog()されていないオブジェクトを呼び出しているためです。明らかに、インターフェイス メソッドは決して初期化されません。getFailureDialog()しかし、クラスからメソッドを呼び出すにはどうすればよいCommon.javaでしょうか?

以下に関連するソースコードのみを配置しています-

ソースコード:

SharedFragment.java

public class SharedFragment extends DialogFragment 
{       
    Bundle bundle = getArguments();
    final String email = bundle.getString("email");

    Thread t=new Thread(new Runnable() 
    {
        public void run() {
        common.myRecord(email);
    }
    });   t.start(); 
}

Common.java

public class Common
{
OnSelectedListener mCallback;


    public interface OnSelectedListener 
    {
        public void getFailureDialog();
    }

    public void myRecord(String email)
    {
        mCallback.getFailureDialog();  //null pointer exception here
    }
}

MainActivity.java

public class MainActivity implements Common.OnSelectedListener
{

@Override
    public void getFailureDialog()
    {

        RecordFailure fd = new RecordFailure(); 
        fd.show(getSupportFragmentManager(), "dialog");
    }
}

エラーログ

03-22 15:50:39.032: W/dalvikvm(20796): threadid=16: thread exiting with uncaught exception (group=0x4204c450)
03-22 15:50:39.052: E/AndroidRuntime(20796): FATAL EXCEPTION: Thread-30126
03-22 15:50:39.052: E/AndroidRuntime(20796): java.lang.NullPointerException
03-22 15:50:39.052: E/AndroidRuntime(20796):    at com.cornmail.util.Common.myRecord(Common.java:2062)
4

5 に答える 5

7
OnSelectedListener mCallback;

初期化されていないか、null 値で初期化されています。

public class Common
{
    OnSelectedListener mCallback = new OnSelectedListener(){
        public void getFailureDialog(){
            JOptionPane.showMessageDialog(null, "An Error Has Occurred.");
        }
    };


    public interface OnSelectedListener 
    {
        public void getFailureDialog();
    }

    public void myRecord(String email)
    {
        mCallback.getFailureDialog();  //now this works.
    }
}
于 2013-03-22T10:37:21.940 に答える
0

Common と MainActivity を変更する必要があります。Common では、基本的なコンストラクターを追加します。次に、startMyCallback に示すようにコールバックをアクティブにします。

Common.java

public class Common
{

 public Common() {}

 OnSelectedListener mCallback;


 public interface OnSelectedListener 
 {
    public void getFailureDialog();
 }

 public void myRecord(String email)
 {
    mCallback.getFailureDialog();  //null pointer exception here
 }
}

MainActivity.java

public class MainActivity implements Common.OnSelectedListener
{

    Common common = new Common();

    public MainActivity()
    {

    }

    public void startMyCallback()
    {
        common.mCallback = this;
    }

    @Override
    public void getFailureDialog()
    {
        RecordFailure fd = new RecordFailure(); 
        fd.show(getSupportFragmentManager(), "dialog");
    }
}
于 2016-10-11T20:02:35.960 に答える
0

のソース コードは次のとおりですOnSelectedListener。これはインターフェイスであるため、newを使用して初期化し、メソッドをオーバーライドするonSelected()か、クラスにこのリスナーを実装させる必要があります。

于 2013-03-22T10:52:41.043 に答える
0

メソッドを追加する

public class Common
{
    OnSelectedListener mCallback;

    public void setOnSelectedListener(OnSelectedListener listener){
        mCallback = listener;
    }

    public interface OnSelectedListener 
    {
        public void getFailureDialog();
    }

    public void myRecord(String email)
    {
        mCallback.getFailureDialog();  //null pointer exception here
    }
}

を使用しsetOnSelectedListener()てリスナーを初期化します

ただし、コードから、別のリスナーも実装する必要がある場合がありますSharedFragment

于 2013-03-22T10:55:33.120 に答える
0

コードマンを再設計し、Common クラスにOnSelectedListenerインターフェイスを実装させる必要があります。したがってOnSelectedListener、内部インターフェイスとしてではなく、外部インターフェイスとして分離します。

このようにコーディングします。

public interface OnSelectedListener 
{
    public void getFailureDialog();
}

次に、Commonクラスは次のようになります

public class Common implements OnSelectedListener
{
    public void getFailureDialog()
    {
        RecordFailure fd = new RecordFailure(); 
        fd.show(getSupportFragmentManager(), "dialog");
    }

    public void myRecord(String email)
    {
        getFailureDialog();
        //do something more rather than just call existing method
    }
}

このコードはスムーズに実行されます。MainActivity に getFailureDialog を実装する必要がある場合は、この Common クラスを抽象クラスにします。

共通クラスはこうなります

public abstract class Common implements OnSelectedListener
{
    public abstract void getFailureDialog();

    public void myRecord(String email)
    {
        getFailureDialog();
        //do something more rather than just call existing method
    }
}

これで、MainActivityクラスはこのクラスから拡張して、欠落している部分を実装できます。

于 2013-03-22T11:03:48.087 に答える