0

在我的 android 应用程序中,我想解决以下场景。

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”列表器访问 spinnerItemSelectedEvent(parent,view,pos,id) 时,出现以下错误。

Activity 类型的方法 spinnerItemSelectedListener(AdapterView, View, int, long) 未定义

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

4

2 回答 2

2

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

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;

}
于 2012-06-21T05:07:56.190 回答
2

问题是在里面LayoutBuilder,你已经声明objActivityActivity. 声明它是 aLogin并且一切都应该没问题:

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 {
    . . .

最后,重新定义LayoutBuilderSpinnerSelectionHandler在其构造函数中采用 a:

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

于 2012-06-21T05:08:28.087 回答