Erweiterte Button Funktion

  • Antworten:63
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 59

18.06.2017, 20:53:38 via Website

Also ich bin mal wieder an einen Punkt angekommen wo ich nicht weiterkomme. Ich wüsste noch nicht mal wie das heißt was ich vor habe und somit kam natürlich auch bei Google wenig bei raus.

Ich bin jetzt so weit, dass ich eine große Liste mit allen möglichen Begriffen (Buttons) habe.

Die Button sollen einen bestimmten Zweck erfüllen und zwar soll es möglich sein das der User diese Begriffe anklickt dann verschwindet der Begriff aus der Liste (hab ich schon geschafft) und wird dann in eine andere Liste hinzugefügt. Also Praktisch eine Liste mit Begriffen zum auswählen und diese Begriffe werden dann zu der Liste der Ausgewählten Begriffe hinzugefügt.

Hier der Code für einen Button den ich bereits geschrieben habe:

   final Animation test = AnimationUtils.loadAnimation(this, R.anim.test);
    Button btnanis = (Button) findViewById(R.id.anis);
    btnanis.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            v.startAnimation(test);
            test.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {}
                @Override
                public void onAnimationRepeat(Animation animation) {}
                @Override
                public void onAnimationEnd(Animation animation) {
            final ViewGroup layout = (ViewGroup) anis.getParent();
            if (null != layout)
                layout.removeView(anis);
        }
   });
};

});}}

Ich hoffe es war alles halbwegs verständlich :)

Antworten
  • Forum-Beiträge: 59

18.06.2017, 22:13:40 via Website

Habe jetzt den Code um die Zeile

" ((TextView)findViewById(R.id.textView)).setText("Anis");"

Erweitert und jetzt fügt er den Text auch ein aber diese Veränderungen sind halt nur temporär und nicht permanent.

Also der Button ist nach dem erneuten Starten der Activity wieder da und der Text weg.

Gibt es da eine Möglichkeit die Begriffe permanent von einer Liste zur anderen zu verschieben?

Antworten
  • Forum-Beiträge: 11.185

18.06.2017, 22:34:47 via Website

Hallo Genetix,
ich glaube mit "Liste" drückst du dich umgangssprachlich aus.

In der Fachsprache ist mir Liste eine List z.b. eine List verbunden, welche dann z.b. in einer ListView angezeigt werden kann.
Damit kann man dann in dieser ListView beliebige Texte in beliebiger Anzahl hinterlegen und diese werden anezeigt und können leicht verändert und gelöscht werden.

Das ist eigentlich das was du brauchst.

Bisher nehme ich an du hast "feste" Buttons auf deinem Layout plaziert und möchtest diese verändern.
Das funktioniert, solange es ein paar Buttons sind. Jetzt stell dir aber vor deine "Liste" hat am ende mehrere 100 einträge, dann sind einzelne Buttons nicht mehr von vorteil, da programmiert man dann mit Listen und einer ListView.

Schau dir das mal an:
http://www.programmierenlernenhq.de/tutorial-android-listview-verwenden/
Kann damit dein Vorhaben realisiert werden? Denn wenn du diese Technik benutzt, kannst du einträge seht einfach swischen Listen und ListViews hin und herschieben und auch in SharedPreferences oder einer DB dauerhaft speichern.

Wenn dem nicht so ist, dann beschreibe bitte genauer was deine "Liste" darstellt evtl. mit Screenshot etc...

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

18.06.2017, 22:37:34 via Website

Wenn ich den ListView anwenden will muss ich dann alles neu machen oder kann ich die Daten von den Buttons verwenden und damit weiterarbeiten?

Antworten
  • Forum-Beiträge: 11.185

18.06.2017, 22:40:39 via Website

Ich weiß nicht wie deine jetzige Struktur aussieht, aber ich vermute dass du zumindest diesen neu machen musst.
Früher oder später fliegst du damit auf die Nase...

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

18.06.2017, 22:43:23 via Website

Bis Jetzt sieht es so aus das das ganze aus Buttons besteht die in einem LinearLayout vertikal aufgereiht sind und beim draufklicken nach rechts raus "sliden" und dabei wird der Begriff der dort drauf steht in einem TextView gespeichert. Würde ungern das alles über den Haufen werfen war doch viel Arbeit bei ca 100 Buttons.

Antworten
  • Forum-Beiträge: 11.185

18.06.2017, 22:48:00 via Website

Eben, deswegen eine wichtige Regel beim Programmieren:
Erst das Konzept, wenn man das mit Grundlagen kombiniert, wird schnell klar, dass so eine "hardcoded" Struktur zu nix führt.
Mit flexiblen Listek kommt man da wesentlich schneller hin.

und für das neue Konzept bräuchtest du lediglich ein Array/ArrayList mit allen Strings/Namen und ein XML Layout auf dem sich die ListView befindet.
Du musst ja jetzt dein ButtonLayout nicht gleicht löschen, aber du kannst dir die ListView pparalell alternativ bauen und du wirst sehen dass es einfacher ist und auch übersichtlicher im Layout und im Code.

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

18.06.2017, 22:50:25 via Website

Wird es dann noch möglich sein das man auf die einzelnen Begriffe klickt und diese dann verschwinden?

Antworten
  • Forum-Beiträge: 11.185

18.06.2017, 22:52:45 via Website

Ja es sieht dann von Layout in einer ListView nicht mehr aus wie ein Button, aber das verschwinden ist möglich.

Ist für alle Einträge mit 2-3 Codezeilen zu realisieren, nicht so wie jetzt ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 00:21:43 via Website

Würde das ganze theoretisch auch mit den Buttons gehen oder kann die ListView durch die Button repräsentiert werden?

Die Listview sieht nicht so aus wie es aussehen sollte.

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 08:03:28 via App

Wenn es Wirklichkeit cu Buttons sein sollen was ich dir nicht empfehlen kann, dann legst du diese aber auch dynamisch an. D.h du hast deine ArrayList und iteriert da durch. Für jeden Eintrag erstellst du dann einen Button mit entsprechendem Text und Listener.

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 13:06:21 via Website

Ich denke ich bekomm es doch mit der ListView hin. Wie schaff ich es denn die einzelnen Einträge mit einer Animation zu versehen?

Antworten
  • Forum-Beiträge: 3.648

19.06.2017, 13:08:39 via Website

Hallo Georg,

eines nach dem Anderen :-)
Animation und der Schröt kommt immer ganz zum Schluss , wenn man die Materie inne hat :-)

Animation innerhalb eines Listview ist recht tricky .....

Liebe Grüße - Stefan
[ App - Entwicklung ]

Genetix xPascal P.

Antworten
  • Forum-Beiträge: 59

19.06.2017, 13:13:56 via Website

Hallo Stefan,

genau das ist das Problem. Die einzelnen Einträge sollen ja beim drauf klicken verschwinden und eben in der anderen Listview wieder auftauchen :?

Ist das denn überhaupt möglich?

Antworten
  • Forum-Beiträge: 3.648

19.06.2017, 13:16:52 via Website

Ja das ist möglich.

Dazu benötigst du erst einmal einen CustomAdapter für den ListView /RecycleView
(Ich würde eh einen RecycleView nehmen)

Und in diesem reagierst du z.b. beim Click auf das Item

Es gibt mehrere Beispiele im Netz - z.b.
https://www.survivingwithandroid.com/2013/04/android-listview-animation-2.html

Und was das Verschwinden angeht - Einfach danach das element rauslöschen

— geändert am 19.06.2017, 13:25:08

Liebe Grüße - Stefan
[ App - Entwicklung ]

Genetix xPascal P.

Antworten
  • Forum-Beiträge: 59

19.06.2017, 16:18:06 via Website

Hab mir jetzt die Seite komplett durchgelesen allerdings schaff ich es nicht den Code mit meiner ListView zu verbinden.
Speziell geht es im Moment um den Code:

RecipeAdapter adapter = new RecipeAdapter(this, recipeList);
mListView.setAdapter(adapter);
final Context context = this;
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
// 1
Recipe selectedRecipe = recipeList.get(position);
// 2
Intent detailIntent = new Intent(context, RecipeDetailActivity.class);
// 3
detailIntent.putExtra("title", selectedRecipe.title);
detailIntent.putExtra("url", selectedRecipe.instructionUrl);
// 4
startActivity(detailIntent);
}
});
}
private ListView mListView;
}

und den das laden der Animation:

// Load animation
final < a class="zem_slink" href="http://en.wikipedia.org/wiki/Animation" title="Animation" rel="wikipedia" target="_blank">Animation anim = AnimationUtils.loadAnimation(this, R.anim.fade_anim);

Er unterstreicht vorallem "a class" wobei ich das "a" auch mit "adapter" ersetzt wird was auch nichts geholfen hat. Und ansonsten "href", "anim", "titel", "rel", "target".

— geändert am 19.06.2017, 16:20:41

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 16:23:50 via Website

Naja die HTML des Tuts ist wohl nicht sauber aufgebaut.

Du musste den Code dann schon bereinigen:
Nach: https://developer.android.com/reference/android/view/animation/AnimationUtils.html#loadLayoutAnimation(android.content.Context,%20int)

final Animation anim = AnimationUtils.loadAnimation(this, R.anim.fade_anim);

und dann kannstdu so weiter verfaren wie im Tut auch.

— geändert am 19.06.2017, 16:24:39

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix xswa00

Antworten
  • Forum-Beiträge: 59

19.06.2017, 16:52:32 via Website

Bei dem Code gibt er mir den "Unknown Class" Fehler bei "Animation"

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 16:56:22 via Website

Da wird der Import fehlen. Drücke mal alt und klicke dann auf "Animation", dann auf "Import class"

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 17:06:15 via Website

Oh danke, hab ich vergessen xD
Geht wohl schon zu automatisch...

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix xswa00

Antworten
  • Forum-Beiträge: 59

19.06.2017, 17:13:01 via Website

Daran hab ich auch schon gedacht funktioniert aber nicht :?

geht nur "expand static import to style"

dann wird aber style rot markiert

— geändert am 19.06.2017, 17:14:33

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 17:14:42 via Website

Dann zeig mal deinen Code her.
An welcher stelle hast du denn die betreffend Zeile plaziert?

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 17:48:19 via Website

Konnte das Problem eben alleine lösen Grund hier für war ein falscher Import Eintrag, der vom Code generiert wurde.

Die einzigen beiden Fehler im Code sind jetzt nur noch

             @Override
                      public void onAnimationEnd(Animation animation) {
                          ItemDetail item = adapter.getItem(position);
                          adapter.remove(item);

Weiß nicht wie ich den beheben kann hab versucht das mit der Button Animation zu vergleichen aber ist ja dann doch was völlig anderes.

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 17:51:25 via Website

Du musst die Fehler schon nennen, wir können sie hier nicht sehen ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 17:55:34 via Website

Oh tut mir leid war in Gedanken schon bei einer Lösung hat aber nicht geklappt :D

Die Fehler treten bei "ItemDetail" (Cannot resolve Symbol) und "adapter" und "position" ( Variable adapter/position is accessed from within inner class needs to be declared final) auf.

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 17:57:14 via Website

Ja, bei "adapter/Postition" kannstz du die Vorgeschlagene Lösung (Alt+Enter) nehmen und bei ItemDetails wird wieder der Import fehlen (auch mal Alt+Enter prüfen)

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 17:59:39 via Website

Bei ItemDetails hab ich jetzt die Class erstellt aber bei "adapter/position" gibt er mir mit Alt+Enter "Incompatible Types"

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 18:02:44 via Website

Die Classs musst du je nicht erstellen, sondern nur importieren, die gibt es doch schon oder?
Oder Welchen Datentyp hat deine Liste die dahinter steckt bzw. dein Adapter?
Genau diesen Datentyp muss dein item auch haben.

und zur Position

public void onItemClick(AdapterView parent, View view, final int position, long id) {

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 18:13:13 via Website

Wo finde ich den Datentyp? Vlt löst das ja die beiden Probleme, denn den Code den du gepostet hattest, hatte ich schon stehen :/

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 18:15:28 via Website

Wie ist denn deine "recipeList" Definiert?
Das dürfte ein Array oder eine ArrayList sein und das was jetzt hier mit "T" steht ist dein Datentyp.

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 18:32:25 via Website

final ArrayList recipeList = Recipe.getRecipesFromFile("recipes.json", this);

Das sind die beiden Codes in bezug auf Arraylist in Kombination mit recipeList :?

public static ArrayList getRecipesFromFile(String filename, Context context){
final ArrayList recipeList = new ArrayList<>();

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 18:42:44 via App

Hmm was wird denn angezeigt als Hilfe wenn du adapter.get(pos) eintippst?
Eigentlich dürfte ein Recipe rauskommen.

— geändert am 19.06.2017, 18:43:02

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 19:04:26 via Website

Könnte sein das ich es mit einem anderen Code geschafft habe, allerdings gibt er mir immer noch remove rot

"Cannot resolve Method 'remove'"

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 19:07:57 via Website

Ich glaube du weißt nicht genau was du tust...
das ist nicht gut....

Wenn du nicht weißt warum dann schau in der Doku nach:
https://developer.android.com/reference/android/widget/Adapter.html
Dieser bietet dir von Haus aus kein Remove an weil du keinen ArrayAdapter mehr benutzt.
Somit musst du das remove selber in deinen Adapter programmieren.

— geändert am 19.06.2017, 19:08:04

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 59

19.06.2017, 19:09:15 via Website

Ich halte mich in dem Fall ja ans Tutorial und es scheint ja bei mehreren zu funktionieren ohne remove in den Adapter zuprogrammieren :?

Und in dem Fall ist das ja nur der Name vom RecipeAdapter

final RecipeAdapter adapter = new RecipeAdapter(this, recipeList);
mListView.setAdapter(adapter);

Original Code vom Tutorial:

@Override
public void onAnimationEnd(Animation animation) {
ItemDetail item = aAdpt.getItem(position);
aAdpt.remove(item);
}

— geändert am 19.06.2017, 19:13:38

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 19:15:25 via Website

Welches tutorial arbetest du denn durch?
Wenn du das früher mal verlinkt hättest, erspart ma sich einiges an Fragerei ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 19:27:20 via Website

Das kenne ich schon, stimmt, ich hatte jetzt gedacht dein RecipeAdapter kommt aus einem Tutorial.
Und ja in deinem verlinkten Tutorial geht das so denn dort wird ein ArrayAdapter verwendet, der das schon von "Haus" aus kann. Ein CustomAdapter kann das nicht, und genau das hast du hier vorliegen.

Das lässt sich leicht nachprogrammieren, wenn du hier nachschause wie das im ArrayAdapter umgesetzt wird:
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java

Und zu deinem ItemType:
Recipe item = adapter.getItem(position); dürfte gehen. Du musst die Datentypen beachten!

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 19:34:10 via Website

Ich versuch das mit dem Adapter mal danke :)

Und ich hab auf die Datentypen geachtet und hab Recipe schon ausprobiert gehabt.

Antworten
  • Forum-Beiträge: 59

19.06.2017, 22:04:52 via Website

Hab jetzt rumprobiert mit der remove Funktion und ich bekomm es absolut nicht hin das mein Custom Adapter die Einträge removed auch in Google hab ich keine akzeptable Lösung gefunden die funktioniert.

Antworten
  • Forum-Beiträge: 3.648

19.06.2017, 22:08:41 via Website

Georg , du denkst falsch ...

Der Adapter verwaltet dein Array an Daten.

Dieses Array kannst du jederzeit ändern - also Einträge hinzu, weg, verschieben etc.
und wenn du mit der Änderung fertig bist , machst du wieder ein notifydatachange auf den Adapter.

Liebe Grüße - Stefan
[ App - Entwicklung ]

Genetix xPascal P.

Antworten
  • Forum-Beiträge: 59

19.06.2017, 22:14:16 via Website

Da steh ich jetzt grad auf der Leitung.

Es geht ja darum das ich eine Liste mit Einträge haben ich auf einen dieser Einträge drauf klicke und dieser dann nach rechts verschwinden soll.

Das einzige was daran nicht klappt ist das verschwinden, weil der Adapter den remove Befehl nicht mag und ich weiß absolut nicht wie ich den Fehler beheben kann :? Alle Lösungsansätze aus dem Internet haben eben den remove Befehl.

Antworten
  • Forum-Beiträge: 11.185

19.06.2017, 22:23:09 via Website

Wozu ist man dem Programmierer, damit man sich genau solche befehle programmieren kann ;)

In deinem Adapter:

public void remove(Recipe r){

recipeList.remove(r);
notifyDataSetChanged();

}

Dann kannst du von außen ein Remove nutzen und es funktioniert ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 22:29:02 via Website

Die Zeile hatte ich auch schon allerdings kamen da wieder diverse Fehler ich kann hier mal alle auflisten :/

Cannot resolve Symbol r
Cannot resolve Symbol recipeList
Variable remove is never used (obwohl unten rot)

nach "remove" und vor "(recipe)" - "; expected"
zwischen "recipe" und "r" - "; und ) expected)
nach (Recipe r) - "; expected"

— geändert am 19.06.2017, 22:32:21

Antworten
  • Forum-Beiträge: 3.648

19.06.2017, 22:43:47 via Website

Georg, jetzt ist der Wurm drin ....

Das "Problemchen" ist , dass dir jetzt an diesem Punkt definitiv die Grundlagen fehlen,
um das was Pascal und ich schreiben zu verstehen.

Du gleitest in Try & Hope Programmierung ab - das gibt zu 100% Chaos

Ich komme nochmal auf meine "Einlassung" von vorhin zurück.
Du willst zu viel in einer zu kurzen Zeit .

Du bist an einem Punkt , wo du nur wurschtelst , aber nicht programmierst.
Schraube bitte deine Ansprüche für dich selbst zurück - Das geht schief

— geändert am 19.06.2017, 22:44:20

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.Genetix x

Antworten
  • Forum-Beiträge: 59

19.06.2017, 22:56:03 via Website

Naja ich will es ja verstehen. Halt learning by doing. Aber ich werd dann einfach alleine weiter rumprobieren vlt schaff ich es ja irgendwie :)

Antworten