0

私は、LinearLayoutを拡張する1つのクラスabcと1つのアクティビティxyzを作成した小さなAndroidアプリケーションを開発しています。私のクラスabcの中で、私は次の方法で1つのインターフェースを定義します

public class abc extends LinearLayout {


    private OnclickxitemListener listener1;

    public interface OnclickxitemListener
    {
        public String nil = "nilkash";
        public void onclickxtitem();
    }

    public void setOnxitemSelectedListener(OnclickxitemListener listener) 
    { 
        this.listener1 = listener;  
        Log.i("#######################################", "inside set listener "+listener1);
    } 

    public abc(Context context) 
    {
        super(context);
    }


    @SuppressWarnings("deprecation")
    public void initialiseImages()
    {

        create custome linear view here
        ImageView image_View = (ImageView) parentLayout.findViewById(0);
        image_View.setOnClickListener(new OnClickListener() 
        { 
        @Override
        public void onClick(View v) 
        { 
            String n = listener1.nil;
            Log.i("#################################", "inside click"+n);
            listener1.onclickxitem(); 
        }
        });
    }

}

今、私は次のように私の活動からこのインターフェースを使用することを試みました。

public class xyz extends Activity implements abc.OnclickxitemListener{

    CustomviewActivity cubes;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    abc widget = new abc(this); 
    widget.setOnxitemSelectedListener(this);

        cubes.initialiseImages();
    }


    @Override
    public void onclickxitem() {

    }

}

ここで問題となるのは、クラスで画像クリックリスナーを実行すると、変数値( "string nilkash")にアクセスできますが、メソッドにアクセスできないことですlistener1.onclickxitem();。それが私にnullポインタ例外を与えることをエースしようとしたとき。

私が何か悪いことをしているのかどうか。この問題を解決する方法。助けが必要です...ありがとう...

4

2 に答える 2

4

わかりました、私はあなたのコードと本当に少し混乱しています。私はこのようなことをします。abcがアクティビティレイアウトファイルxyz.xmlのパッケージcom.testのカスタムビューである場合

<com.test.abc
android:id="@+id/myview"
<!-- You can modify the values below the way you want -->
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_gravity="center"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"/>

私のabcクラスでは、このようなものを書きます

public class abc extends ImageView{

  private OnclickxitemListener listener;

    public interface OnclickxitemListener
    {
      public String nil = "nilkash";
      public void onclickxtitem();
    }


    public void setOnxitemSelectedListener(OnclickxitemListener l )
    {
      listener = l;

    }

     public abc(Context context, AttributeSet attrs)
    {
      super(context, attrs);
      initialize();

    }

    public void initialize()
    {

      this.setImageResource(R.drawable.*name of the image saved in drawable*);


        setOnClickListener(new OnClickListener()
        {

         @Override
     public void onClick(View arg0) 
         {
          // TODO Auto-generated method stub
    notifyListener();
         }

        });
     }

     private void notifyListener()
     {
            if (null!=listener)
            listener.onclickxtitem();
     }
}

最後にあなたの活動でxyz

public class xyz extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.xyz);

        abc myview = (abc)findViewById(R.id.myview);
        myview.setOnxitemSelectedListener(new abc.OnclickxitemListener()
             {
                @Override
                public void onclickxtitem()
                 {


                 }
              });

    }


}
于 2013-02-28T09:57:51.280 に答える
0

貼り付けたコードに基づいて、アクティビティは、コールバックするabcクラスのOnclickxitemListenerを実装する必要があります。アクティビティからonclickxitemを削除し、OnclickxitemListenerを実装して、IDEに未実装のonclickxitemメソッドをインターフェースから実装させます。

cubes.initialiseImages();を呼び出します。キューブが初期化されていないため、nullポインタも表示されます。確かにwidget.initialiseImages()を呼び出したいですか?

これが宣言され、値が指定されているため、listener1.nil文字列にアクセスできます。

于 2013-02-28T10:33:59.240 に答える