Ich habe vor kurzem angefangen mit Fragmenten zu arbeiten, also vermute ich, dass mein Problem damit zu tun hat. Ich habe im Grunde ein DialogFragment, das eine Liste von Zeilen (vom RelativeLayout-Typ) enthält. Jede Zeile hat eine benutzerdefinierte Ansicht (die eine Zeichenfläche enthält) und eine Schaltfläche. Ich versuche, einen OnClickListener anzuhängen, aber ich sehe, dass er nicht ausgelöst wird. Was mache ich falsch?onClick-Ereignis nicht ausgelöst
EDIT 8. Mai 2017: Ich war in der Lage, das OnClick-Ereignis Feuer zu bekommen, etwas. Mein Problem ist jetzt, dass die Ereignisse nicht sofort ausgelöst werden. Wenn ich auf ein paar Knöpfe klicke und nur wenn ich irgendwo anders im AlertGialog klicke, werden die Ereignisse alle zusammen ausgelöst.
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);
}
}
Wenden Sie 'setClickable (true)' auch auf 'ColorChoiceRow' an. – azizbekian
Das hat nicht funktioniert – Naci