我创建了一个自定义ViewGroup,我在其中创建了几个自定义子视图(在java代码中,而不是xml)。 这些孩子中的每一个都需要具有相同的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...
}
}
答案 0 :(得分:1)
设置一个OnClickListener
(在CellContainerGroup
中)将调用该方法:
private OnClickListener mListener = new OnClickListener() {
@Override
public void onClick(View v) {
CellContainerGroup ccg = (CellContainerGroup) v.getParent();
ccg.propagateEvent(v);
}
}
其中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);