0

我正在开发小型 android 应用程序,其中我创建了一个扩展 LinearLayout 的类 abc 和一个活动 xyz。在我的 abc 类中,我以下列方式定义了一个接口

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() {

    }

}

现在的问题是,当我在我的类中执行图像单击侦听器时,我能够访问变量值(“字符串 nilkash”),但我无法访问方法listener1.onclickxitem();。当我试图获得它时,它给了我空指针异常。

无论我做错了什么。如何解决这个问题呢。需要帮助...谢谢...

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(); 由于多维数据集尚未初始化,还会给您一个空指针。您确定要调用 widget.initialiseImages() 吗?

您可以访问 listener1.nil 字符串,因为它已被声明并被赋予了一个值。

于 2013-02-28T10:33:59.240 回答