2017-05-05 3 views
0

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); 
    } 
} 
+0

Wenden Sie 'setClickable (true)' auch auf 'ColorChoiceRow' an. – azizbekian

+0

Das hat nicht funktioniert – Naci

Antwort

0

Die Lösung wurde das Entfernen des Adapters (RowAdaptor) und ein Linearlayout stattdessen verwenden.

Anstelle der Methode setAdapter löste die Verwendung der Methode setView mein Problem.