Color Picker neu Crasht...

wer112

Top Contributor
Nach euren Meinung sollte ich einen aktuellen ColorPicker nehmen, den habe ich genommen, aber bekomme im Log diese Fehlermeldung:

Java:
java.lang.ClassCastException: androidx.appcompat.app.AlertDialog cannot be cast to com.skydoves.colorpickerview.ColorPickerDialog
                                                                                                        at com.andrealfredklug.klugstore.app_einstellungen$1.onClick(app_einstellungen.java:174)
                                                                                                        at android.view.View.performClick(View.java:7792)
                                                                                                        at android.view.View.performClickInternal(View.java:7769)
                                                                                                        at android.view.View.access$3800(View.java:910)
                                                                                                        at android.view.View$PerformClick.run(View.java:30218)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:938)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:226)
                                                                                                        at android.os.Looper.loop(Looper.java:313)

Mein Code:

Java:
ibtn1 = (ImageButton)fragmentlayout_app_einstellungen.findViewById(R.id.imageButton);
        ibtn1.setImageResource(R.drawable.schwarzer_rahmen);
        ibtn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                colorPickerDialog = (ColorPickerDialog) new ColorPickerDialog.Builder(getActivity())
                        .setTitle("ColorPicker")
                        .setPreferenceName("Wählen Sie eine Farbe aus.")
                        .setPositiveButton("Okay",
                                new ColorEnvelopeListener() {
                                    @Override
                                    public void onColorSelected(ColorEnvelope envelope, boolean fromUser) {
                                        //i_b1 = envelope.getColor();
                                        //ibtn1.setBackgroundColor(i_b1);
                                    }
                                })
                        .setNegativeButton("Exit", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        })
                        .attachAlphaSlideBar(true) // the default value is true.
                        .attachBrightnessSlideBar(true)  // the default value is true.
                        .setBottomSpace(12) // set a bottom space between the last slidebar and buttons.
                        .show();
            }
        });

Wie kann ich Ihn zum laufen pringen und die Werte übermitteln(Was als Kommentar ist?)

Ich bedanke mich im Vorfeld ;)
 

KonradN

Super-Moderator
Mitarbeiter
Man sollte sich halt die Klassen / Libraries anschauen, die man nutzen will. ColorPickerDialog.Builder(...).show() gibt halt kein ColorPickerDialog der Library zurück.

An der Stelle: So Casts wie bei colorPickerDialog = (ColorPickerDialog) new ColorPickerDialog.Builder(getActivity()) sind etwas, von denen ich nur stark abraten kann. Das ist meist ein Zeichen, dass irgend etwas falsch gemacht wird. Und so wie hier: Der Cast ist schlicht nicht möglich. Wenn Du den Cast entfernst, dann sollte Dir der Compiler bereits sagen, dass die Zuweisung nicht möglich ist.

Und bei einem Builder ist der normale Aufruf am Ende auch build() und kein show()! Das siehst Du übrigens auch direkt als Beispiel auf der GitHub Projektseite. (Und da hast Du dann auch keinen Cast!)

Also vermutlich hast Du beim Schreiben einfach versehentlich show statt build gehabt, dann einen Compiler Fehler bekommen und gedacht: Hey, ich mache einfach einen Cast und schon meckert der Compiler nicht mehr ... Bei sowas ist meine Empfehlung: Wirklich schauen, wie es verwendet werden soll!
 

Jw456

Top Contributor
Hallo

Mich würde hier mal Interessieren von welchem Datentyp die Variable „colorPickerDialog“ ist.

Wie hast du die Erstellt?



PS das mit dem “show()“ ist bei Github auch so


Zeile 179.
 

KonradN

Super-Moderator
Mitarbeiter
PS das mit dem “show()“ ist bei Github auch so
Nein, ist es nicht.

In dem Beispiel wird kein build() aufgerufen, aber in der Variable (Erstes Beispiel) wird dann nur ein Builder gespeichert. Und dann auf dem Builder ein show() aufgerufen. Und im zweiten Beispiel wird gar nichts zwischengespeichert in einer Variable sondern direkt show() aufgerufen. Die Methode gibt es, ja. Und natürlich werden sich Beispiele finden lassen, wo man diese Methode show verwendet. Aber das ist dann nicht das typische Builder Pattern, bei dem eine Instanz der übergeordneten Klasse erzeugt wird.

Du bist bei zweitem Beispiel über den Punkt "create using builder" drüber gegangen, der zeigt, wie mit dem Builder eine Instanz von ColorPickerView erzeugt werden kann. Und das ist dann ein build() Aufruf.

es gibt einmal
ColorPickerDialog.Builder / show()
und
ColorPickerView.Builder / build()
Ja, sonst hätte er ja auch einen Compile Fehler bekommen und keinen Runtime Fehler. Ändert aber nichts an der Aussage, die ich gemacht habe. Er möchte offensichtlich eine Instanz von ColorPickerView haben mit einem Builder und da ist der Beispielcode eben genau so:
Java:
ColorPickerView colorPickerView = new ColorPickerView.Builder(context)
      .setColorListener(colorListener)
      .setPreferenceName("MyColorPicker");
      .setActionMode(ActionMode.LAST)
      .setAlphaSlideBar(alphaSlideBar)
      .setBrightnessSlideBar(brightnessSlideBar)
      .setFlagView(new CustomFlag(context, R.layout.layout_flag))
      .setPaletteDrawable(ContextCompat.getDrawable(context, R.drawable.palette))
      .setSelectorDrawable(ContextCompat.getDrawable(context, R.drawable.selector))
      .build();

Wenn er die Instanz nicht haben will, dann kann er natürlich auch show verwenden ... aber dann wäre diese Variable schlicht sinnlos.
 

Jw456

Top Contributor
ColorPickerView colorPickerView = new ColorPickerView.Builder(context) .setColorListener(colorListener) .setPreferenceName("MyColorPicker"); .setActionMode(ActionMode.LAST) .setAlphaSlideBar(alphaSlideBar) .setBrightnessSlideBar(brightnessSlideBar) .setFlagView(new CustomFlag(context, R.layout.layout_flag)) .setPaletteDrawable(ContextCompat.getDrawable(context, R.drawable.palette)) .setSelectorDrawable(ContextCompat.getDrawable(context, R.drawable.selector)) .build();
das will er ja gar nicht. er will einen dialog.
 

KonradN

Super-Moderator
Mitarbeiter
Ok, stimmt, da hatte ich mich dann etwas verschaut.

Aber da hat der TE dann schlicht Dinge durcheinander geworfen. Denn der Builder vom Dialog baut keinen Dialog sondern eine Instanz von der Klasse androidx.appcompat.app.AlertDialog.

Wenn man sich den Code anschaut, dann ist in der ColorPickerDialog Klasse eigentlich nicht groß etwas drin. Die Funktionalität ist in erster Linie im Builder und der erzeugt halt im AltertDialog eine entsprechende View. Die Übergeordnete Klasse ColorPickerDialog hält nur diese View. Und beim überschriebenen create wird diese dann halt gesetzt:
Java:
    /**
     * shows a created {@link ColorPickerDialog}.
     *
     * @return {@link AlertDialog}.
     */
    @Override
    @NonNull
    public AlertDialog create() {
      if (getColorPickerView() != null) {
        this.dialogBinding.colorPickerViewFrame.removeAllViews();
        this.dialogBinding.colorPickerViewFrame.addView(getColorPickerView());

        AlphaSlideBar alphaSlideBar = getColorPickerView().getAlphaSlideBar();
        if (shouldAttachAlphaSlideBar && alphaSlideBar != null) {
          this.dialogBinding.alphaSlideBarFrame.removeAllViews();
          this.dialogBinding.alphaSlideBarFrame.addView(alphaSlideBar);
          this.getColorPickerView().attachAlphaSlider(alphaSlideBar);
        } else if (!shouldAttachAlphaSlideBar) {
          this.dialogBinding.alphaSlideBarFrame.removeAllViews();
        }

        BrightnessSlideBar brightnessSlideBar = getColorPickerView().getBrightnessSlider();
        if (shouldAttachBrightnessSlideBar && brightnessSlideBar != null) {
          this.dialogBinding.brightnessSlideBarFrame.removeAllViews();
          this.dialogBinding.brightnessSlideBarFrame.addView(brightnessSlideBar);
          this.getColorPickerView().attachBrightnessSlider(brightnessSlideBar);
        } else if (!shouldAttachBrightnessSlideBar) {
          this.dialogBinding.brightnessSlideBarFrame.removeAllViews();
        }

        if (!shouldAttachAlphaSlideBar && !shouldAttachBrightnessSlideBar) {
          this.dialogBinding.spaceBottom.setVisibility(View.GONE);
        } else {
          this.dialogBinding.spaceBottom.setVisibility(View.VISIBLE);
          this.dialogBinding.spaceBottom.getLayoutParams().height = bottomSpace;
        }
      }

      super.setView(dialogBinding.getRoot());
      return super.create();
    }


Sprich: Der TE kann da maximal ein androidx.appcompat.app.AlertDialog bekommen. Aber wenn man sich die Beispiele anschaut, dann ist das wohl nicht einmal notwendig.
 

Jw456

Top Contributor
Wenn man sich den Code anschaut, dann ist in der ColorPickerDialog Klasse eigentlich nicht groß etwas drin. Die Funktionalität ist in erster Linie im Builder und der erzeugt halt im AltertDialog eine entsprechende View. Die Übergeordnete Klasse ColorPickerDialog hält nur diese View. Und beim überschriebenen create wird diese dann halt gesetzt:
richtig .
Aber das wird der TE nicht gelesen haben nur einfach den Code von Github kopiert haben.

Deshalb auch meine Frage nach dem Datentyp der Variablen. wie er sie erstellt hat.
Beim richtigen Typ sollte es keinen Cast brauchen.
 

wer112

Top Contributor
richtig .
Aber das wird der TE nicht gelesen haben nur einfach den Code von Github kopiert haben.

Deshalb auch meine Frage nach dem Datentyp der Variablen. wie er sie erstellt hat.
Beim richtigen Typ sollte es keinen Cast brauchen.
Der Code funktioniert, musste die Zuweisung entfernen und nur new nehmen:

Java:
 new ColorPickerDialog.Builder(getActivity())
                        .setTitle("ColorPicker")
                        .setPreferenceName("Wählen Sie eine Farbe aus.")
                        .setPositiveButton("Okay",
                                new ColorEnvelopeListener() {
                                    @Override
                                    public void onColorSelected(ColorEnvelope envelope, boolean fromUser) {
                                        i_b8 = envelope.getColor();
                                        ibtn8.setBackgroundColor(i_b8);
                                        Farbesetzen();
                                        FarbeSenden();
                                        fragment_steuerung.colorTextToolbar(i_b8);
                                    }
                                })
                        .setNegativeButton("Exit", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        })
                        .attachAlphaSlideBar(true) // the default value is true.
                        .attachBrightnessSlideBar(true)  // the default value is true.
                        .setBottomSpace(12) // set a bottom space between the last slidebar and buttons.
                        .show();
Und bei einem Builder ist der normale Aufruf am Ende auch build() und kein show()! Das siehst Du übrigens auch direkt als Beispiel auf der GitHub Projektseite. (Und da hast Du dann auch keinen Cast!)
.build; gibt es nicht nur .show;
Also vermutlich hast Du beim Schreiben einfach versehentlich show statt build gehabt, dann einen Compiler Fehler bekommen und gedacht: Hey, ich mache einfach einen Cast und schon meckert der Compiler nicht mehr ... Bei sowas ist meine Empfehlung: Wirklich schauen, wie es verwendet werden soll!
 

Ähnliche Java Themen


Oben