android listner中的Java层次结构



在我的安卓应用程序中,我想解决以下情况。

class Login extends Activity {
   @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
         LayoutBuilder  objLB=new LayoutBuilder(this);
         objLB.createSpinner();
    } 
    public void spinnerItemSelectedEvent(AdapterView<?> parent, View view,
        int pos, long id)
    {
    }
}

class LayoutBuilder {
    private Activity objActivity;
    public LayoutBuilder(Activity a) {
        objActivity = a; 
    }
    public void createSpinner() {
        final Spinner objSPItem = new Spinner(objActivity);
        objSPItem.setOnItemSelectedListener(
            new Spinner.OnItemSelectedListener() {
                public void onItemSelected(AdapterView<?> parent, View view,
                    int pos, long id)
                {
                    // Do some common activity 
                    objActivity.spinnerItemSelectedEvent(parent,view,pos,id);
                    // calling this for do some additional task
                }
                public void onNothingSelected(AdapterView<?> arg0) {}
        });
        objActivity.spinnerItemSelectedEvent()
    }
}

问题是当我尝试从createSpinner方法中的"onItemSelected"列表器访问微调器项目选定事件(父,视图,pos,id) 我收到以下错误。

方法微调器项选定侦听器(适配器视图,视图,整型,长整型)未为类型活动定义

但是在列表器之外,对该方法的访问工作正常(忽略参数列表)。这背后的原因是什么?是否有其他方法可以解决此问题?请帮忙

Android 中的活动代表一个屏幕。您正在创建一个类型为 Activity 的变量objActivity,而它应该是声明函数 spinnerItemSelectedEvent()Login 类型。更改以下行:

private Activity  objActivity;

private Login  objActivity;

并且您的代码应该运行。

编辑

有一个BaseActivity,让你的所有其他活动扩展这个BaseActivity。要使函数spinnerItemSelectedEvent()可重用,请在BaseActivity中声明它,您可以按照现在尝试的方式使用它。

例:

class BaseActivity extends Activity{
    public void spinnerItemSelectedEvent(AdapterView<?> parent, View view,
    int pos, long id){ }
} 
  class Login extends BaseActivity{
   public void spinnerItemSelectedEvent(AdapterView<?> parent, View view,
    int pos, long id){ //Local implementation of the function}
}
class LayoutBuilder {
private BaseActivity objActivity;
}

问题是在LayoutBuilder内部,你已经声明objActivity是一个Activity。声明它是一个Login,一切都应该没问题:

class LayoutBuilder {
    private Login objActivity;
    public LayoutBuilder(Login a) {
        objActivity = a; 
    }
    . . .

编辑

如果您希望 LayoutBuilder 类可由其他活动重用,则一种方法是通过接口声明。例如:

public interface SpinnerSelectionHandler {
    void spinnerItemSelectedEvent(AdapterView<?> parent, View view,
        int pos, long id);
}

然后将Login声明为:

public class Login extends Activity implements SpinnerSelectionHandler {
    . . .

最后,重新定义LayoutBuilder以在其构造函数中采用SpinnerSelectionHandler

class LayoutBuilder {
    private Activity objActivity;
    private SpinnerSelectionHandler selectHandler;
    public LayoutBuilder(Activity a, SpinnerSelectionHandler handler) {
        objActivity = a;
        selectHandler = handler;
    }

然后更换

objActivity.spinnerItemSelectedEvent(parent,view,pos,id);

spinnerHandler.spinnerItemSelectedEvent(parent,view,pos,id);

另外,如果您不需要其他任何Activity引用,则可以将其从LayoutBuilder类中删除。

最新更新