2

いくつかのカスタム子ビューを作成するカスタム ViewGroup を作成しました (xml ではなく Java コードで)。これらの各子には、同じ onClick イベントが必要です。

これらのクリック イベントを処理するメソッドは、レイアウトを使用するアクティビティ クラスにあります。このメソッドをすべての子ビューの onClick ハンドラとして設定するにはどうすればよいですか?

これが私のコードを簡略化したものです。

カスタム ViewGroup:

public class CellContainerGroup extends ViewGroup
{
    CellView[][] CellGrid = new CellView[9][9];

    public CellContainerGroup(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a = context.obtainStyledAttributes(R.styleable.CellContainerGroup);

        try {
                //initialize attributes here.       
            } finally {
               a.recycle();
            }

        for(int i = 0; i < 9 ; i++)
            for(int j = 0 ; j < 9 ; j++)
            {
                //Add CellViews to CellGrid.
                CellGrid[i][j] = new CellView(context, null); //Attributeset passed as null
                //Manually set attributes, height, width etc.               
                //...

                //Add view to group
                this.addView(CellGrid[i][j], i*9 + j);
            }
    }
}

クリック ハンドラーとして使用するメソッドを含むアクティビティ:

public class SudokuGameActivity extends Activity {

    //Left out everything else from the activity.

    public void cellViewClicked(View view) {
    {
        //stuff to do here...
    }
}
4

1 に答える 1

1

そのメソッドを呼び出す単一のOnClickListener(in ) をセットアップします。CellContainerGroup

private OnClickListener mListener = new OnClickListener() {

     @Override
     public void onClick(View v) {
          CellContainerGroup ccg = (CellContainerGroup) v.getParent();
          ccg.propagateEvent(v);
     }
}

whereは次の ようなpropagateEventメソッドです。CellContainerGroup

public void propagateEvent(View cell) {
     ((SudokuGameActivity)mContext).cellViewClicked(cell);
}

そして、次のような参照はどこにmContextありますか:Context

private Context mContext;

public CellContainerGroup(Context context, AttributeSet attrs) {
   super(context, attrs);
   mContext = context;
//...

を設定することを忘れないでくださいmListener

CellGrid[i][j].setOnClickListener(mListener);
于 2012-12-20T17:06:34.777 に答える