2016-07-18 15 views
1

Ich habe eine App, wo der Benutzer eine Farbauswahl oder vordefinierte Schaltflächen verwenden kann, um den Hintergrund ihrer Anführungszeichen zu ändern. Ich möchte es möglich machen, dass der Benutzer die Farbe der vordefinierten Schaltflächen mit einem langen Klick ändern kann und dann erscheint ein Farbwähler und der Benutzer kann nun auswählen, eine beliebige Farbe auf der Schaltfläche zu speichern.Farbwähler ändert Hintergrundfarbe nicht vom RecyclerView Adapter?

Aus irgendeinem Grund funktionieren die Picker Listener Methoden nicht in meinem RecyclerView Adapter. Der Color Picker Listener sollte mir die aktuell ausgewählte Farbe geben. Ich habe es mit einem Log.d("TAG", ""+color); getestet und ich nicht alle Werte erhalten

Die Viewholder des RecyclerView adapater für Hintergrundfarben:

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener, ColorPickerDialogFrag2.ColorPickerDialogListener { 

    public ImageButton colorButton; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     this.colorButton = (ImageButton) itemView.findViewById(R.id.colorbutton); 
     itemView.setOnClickListener(this); 
     itemView.setOnLongClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 

     int position = getLayoutPosition(); 
     MainActivity.relativeLayout.setBackgroundColor(Color.parseColor((mColorButtons.get(position).getColor()))); 
     PreferenceManager.getDefaultSharedPreferences(App.getAppContext()).edit().putInt(App.BACKGROUND, Color.parseColor(mColorButtons.get(position).getColor())).apply(); 


    //ColorPicker for customizing colors for buttons 

    @Override 
    public boolean onLongClick(View v) { 


     ColorPickerDialogFrag2 cp = ColorPickerDialogFrag2.newInstance(6, Color.YELLOW); 
     cp.setStyle(android.support.v4.app.DialogFragment.STYLE_NORMAL, R.style.AppTheme); 
     cp.show(fragmentManager,"d"); 

     return false; 
    } 

    @Override 
    public void onPreviewColorChanged(int dialogId, int color) { 

     //color is the current color from the colorpicker 

      Log.d("TAG", ""+color); 
      MainActivity.mEditText.setBackgroundColor(color); 




    } 

    @Override 
    public void onColorSelected(int dialogId, int color) { 
     Log.d("TAG", ""+color); 
     MainActivity.mEditText.setBackgroundColor(color); 

    } 
} 

Hier ist ein Video, wie es funktioniert zur Zeit in meiner App: https://www.youtube.com/watch?v=lpYjKMLd9aU

Der Color Picker libray ich verwende, ist dies: https://github.com/danielnilsson9/color-picker-view

+0

Was verwenden Sie, um Ihre 'ColorPickerDialogFrag2' zu erstellen? Ist es eine Bibliothek oder Ihre eigene benutzerdefinierte Klasse? – Bryan

+0

@Bryan oh es ist eine Bibliothek. Ich werde das jetzt mit einem Link dazu sehen. – Muddz

+0

Können Sie Ihren 'ColorPickerDialogFrag2' Code posten? – Bryan

Antwort

1

Das Problem ist, dass Sie ColorPickerDialogListener für Ihre ViewHolder implementieren, aber durch den Code der Bibliothek here, können Sie sehen, dass es versucht activity als ColorPickerDialogListener zu werfen, sonst wirft es die Ausnahme. Versuchen Sie also, diesen Listener auf Ihrem MainActivity zu implementieren und das Ergebnis zu sehen.

UPDATE:

Also in diesem Fall, dass Sie wie diese Logik Ihrer ColorPickerDialogFrag2 etwas zu ändern:

... 
private ColorPickerDialogListener mListener; 

public static ColorPickerDialogFrag2 newInstance(ColorPickerDialogListener listener, 
     int dialogId, int initialColor) { 

    ColorPickerDialogFrag2 frag = new ColorPickerDialogFrag2(); 
    frag.setListener(listener); 
    Bundle args = new Bundle(); 
    args.putInt("id", dialogId); 
    args.putInt("init_color", initialColor); 

    frag.setArguments(args); 

    return frag; 
} 

public void setListener(ColorPickerDialogListener mListener) { 
    this.mListener = mListener; 
} 
... 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    if (mListener == null) { 
     // Check for listener in parent activity 
     try { 
      mListener = (ColorPickerDialogListener) activity; 
     } catch (ClassCastException e) { 
      e.printStackTrace(); 
      throw new ClassCastException("Parent activity must implement " 
        + "ColorPickerDialogListener to receive result."); 
     } 
    } 
} 
... 

Und dann passieren nur ColorPickerDialogListener als Parameter newInstance Methode:

@Override 
public boolean onLongClick(View v) { 
    ColorPickerDialogFrag2 cp = ColorPickerDialogFrag2.newInstance(this, 6, Color.YELLOW); 
    cp.setStyle(android.support.v4.app.DialogFragment.STYLE_NORMAL, R.style.AppTheme); 
    cp.show(fragmentManager,"d"); 
    return false; 
} 
+0

Alles Gute gute Infos! Ich weiß, dass es in MainActivity funktioniert, aber es muss in dem Adapter funktionieren, in dem sich die vordefinierten Schaltflächen befinden. Wenn der Benutzer also auf eine der vordefinierten Schaltflächen in der Recycleransicht klickt, kann er die Farbe ändern. – Muddz

+0

Überprüfen Sie meine aktualisierte Antwort – rom4ek

+0

Es funktionierte wie es sollte! Vielen Dank. Aber könnten Sie erklären, warum wir einen eigenen Listener an newInstance übergeben mussten? – Muddz

Verwandte Themen