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)にアクセスしようとすると、次のエラーが発生することです。

メソッドspinnerItemSelectedListener(AdapterView、View、int、long)は、タイプActivityに対して未定義です。

ただし、listnerの外部では、メソッドへのアクセスは正常に機能します(パラメーターリストは無視してください)。その背後にある理由は何ですか?これを解決するための代替方法はありますか?plzヘルプ

4

2 に答える 2

2

Androidでのアクティビティは画面を表します。objActivity型の変数を作成していますが、関数が宣言されているActivity型である必要があります。次の行を変更します。LoginspinnerItemSelectedEvent()

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で、であると宣言objActivityしていることActivityです。それがであると宣言しLogin、すべてがうまくいくはずです:

class LayoutBuilder {
    private Login objActivity;

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

編集

LayoutBuilderクラスを他のアクティビティで再利用できるようにする場合、これを行う1つの方法は、インターフェイス宣言を使用することです。例えば:

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

于 2012-06-21T05:08:28.087 に答える