最近、私はFragmentsでの作業を開始しました。問題はそれに関係していると思われます。私は基本的に(RelativeLayout型の)行のリストを含むDialogFragmentを持っています。各行には、カスタムビュー(キャンバスを含む)とボタンがあります。 OnClickListenerをアタッチしようとしていますが、トリガーされていないことがわかります。私は間違って何をしていますか?onClickイベントがトリガーされていません
EDIT 2011年5月8日 私はOnClickイベントの火を得ることができました。私の問題は、今すぐイベントが発射されないということです。いくつかのボタンをクリックすると、AlertGialog内の他の場所をクリックした場合にのみ、イベントが一斉に発生します。
MainActivity.java
public class MainActivity extends AppCompatActivity implements ColorChoiceRow.OnColorButtonClicked {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
ColorDialogFragment colorDialogFragment = ColorDialogFragment.newInstance("Select a Color");
colorDialogFragment.show(fm, "fragment_edit_name");
}
@Override
public void OnColorButtonClicked(String name) {
Log.d("ColorDebug", "Hey, you selected " + name + "!");
}
}
ColorDialogFragment.java
public class ColorDialogFragment extends DialogFragment {
private final String TAG = this.getClass().getSimpleName();
private List<ColorChoiceRow> listColorChoiceRows;
public ColorDialogFragment() {
}
public static ColorDialogFragment newInstance(String title) {
ColorDialogFragment frag = new ColorDialogFragment();
Bundle args = new Bundle();
args.putString("title", title);
frag.setArguments(args);
return frag;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_color_ramp_dialog, container);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
listColorChoiceRows = new ArrayList<ColorChoiceRow>();
listColorChoiceRows.add(new ColorChoiceRow(getContext(), Color.BLUE, "Blue"));
listColorChoiceRows.add(new ColorChoiceRow(getContext(), Color.CYAN, "Cyan"));
listColorChoiceRows.add(new ColorChoiceRow(getContext(), Color.BLACK, "Black"));
listColorChoiceRows.add(new ColorChoiceRow(getContext(), Color.YELLOW, "Yellow"));
String title = getArguments().getString("title");
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
alertDialogBuilder.setTitle(title);
alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (dialog != null) {
dialog.dismiss();
}
}
});
alertDialogBuilder.setAdapter(new RowAdapter(getContext(), listColorChoiceRows),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return alertDialogBuilder.create();
}
}
ColorChoiceRow.java
public class ColorChoiceRow extends RelativeLayout {
private ColorView colorView;
private int color;
private OnColorButtonClicked mListener;
public ColorChoiceRow(final Context context, int color, final String text) {
super(context);
this.color = color;
if (context instanceof OnColorButtonClicked) {
mListener = (OnColorButtonClicked) context;
} else {
throw new ClassCastException(context.toString() + " must implement OnRageComicSelected.");
}
this.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
//this.setPadding(10, 10, 10, 0);
colorView = new ColorView(context, color);
colorView.setId(1);
Button invertButton = new Button(context);
invertButton.setId(3);
invertButton.setClickable(true);
invertButton.setText("Color Button");
invertButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.OnColorButtonClicked(text);
}
});
LayoutParams paramsColorRamp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
paramsColorRamp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
//paramsAlignLeft.addRule(RelativeLayout.);
//colorView.setLayoutParams(paramsColorRamp);
LayoutParams paramsInvertButton = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
paramsInvertButton.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
invertButton.setLayoutParams(paramsInvertButton);
this.addView(colorView, paramsColorRamp);
this.addView(invertButton, paramsInvertButton);
}
public interface OnColorButtonClicked {
void OnColorButtonClicked(String name);
}
}
ColorView.java
public class ColorView extends View {
private int color;
public ColorView(Context context, int color) {
super(context);
this.color = color;
}
@Override
public void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(color);
canvas.drawRect(0,0, 300, 100, paint);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(300, 100);
}
}
RowAdapter.java
public class RowAdapter extends BaseAdapter
{
private List<ColorChoiceRow> colorChoiceRowList;
private Context context;
public RowAdapter(Context c, List<ColorChoiceRow> colorChoiceRows) {
this.colorChoiceRowList = colorChoiceRows;
this.context = c;
}
@Override
public int getCount() {
return colorChoiceRowList.size();
}
@Override
public Object getItem(int position) {
return colorChoiceRowList.get(position);
}
@Override
public long getItemId(int id) {
return id;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return colorChoiceRowList.get(position);
}
}
'ColorChoiceRow'にも' setClickable(true) 'を適用してください。 – azizbekian
それはうまくいかなかった – Naci