Wo ist mein JPanel :(

  • Antworten:6
getName
  • Forum-Beiträge: 12

01.08.2013, 03:15:29 via Website

Ich versuche eine eigene kleine Custom Componente zu erstellen. Was ich mir vorstelle ist also ganz simpel: ein Kasten mit Hintergrundfarbe und darin verschieden angeordnete TextViews. In XML so kein Problem, doch möchte ich diese Kästen mehrmals verwenden und auch wenn die TextViews immer an der gleichen Stelle sein sollen, haben sie doch jedes mal einen anderen Inhalt. Kann man mir noch folgen? Deshalb möchte ich diese in eine eigene Klasse verfrachten.

Mit Swing hätte ich eine neue Klasse von JPanel erben lassen und bei der Instanzierung dann einfach die entsprechenden Komponenten erzeugt, die Felder mit den Werten aus dem Konstruktor versorgt und den ganzen Quatsch dann dem Panel, also der Klasse selbst (this) hinzugefügt. Mit der Android UI scheint das nicht so schön einfach zu gehen, oder ich denke einfach bei meinen Arbeitsschritten noch zu sehr an Swing.

Jedenfalls habe ich jetzt einmal die normalen Layouts, also RelativeLayout, LinearLayout etc. als die neuen JPanels ausgekundschaftet. Kann man das so durchgehen lassen?

Zum Aufbau der App: In der Activity wird aus der SupportLibrary ein ViewPager eingesetzt, um zwischen mehreren Fragments zu scrollen. Die Fragments nutzen alle eine Layout XML Datei, welche grundlegend eigentlich nur ein LinearLayout enthält. Dem Layout habe ich eine android:id gegeben und es wäre großartig wenn ich jetzt einfach wie im guten alten Swing layoutID.add( new MyComponent(/*hier die inhalte der einzelnen Textfelder*/) ) setzen könnte und der Drops wäre gelutscht. Ist das irgendwie möglich?

Ich beschäftige mich auch erst seit ein paar Tagen mit Android und entwickle nebenbei für diese App, abseits von Android, noch einen relativ umfangreichen Algorithmus um meine späterren Resources auszuwerten und in ein klares Schema abzubilden. Muss meine Zeit also auch noch teilen. :(

Kann mir vielleicht jemand helfen? Ich lasse erstmal die Code Posts, vielleicht hat ja auch so schon jemand ne Idee.

Antworten
Christian
  • Forum-Beiträge: 307

01.08.2013, 10:57:21 via Website

Hi getName,


Ich versuche eine eigene kleine Custom Componente zu erstellen. Was ich mir vorstelle ist also ganz simpel: ein Kasten mit Hintergrundfarbe und darin verschieden angeordnete TextViews. In XML so kein Problem, doch möchte ich diese Kästen mehrmals verwenden und auch wenn die TextViews immer an der gleichen Stelle sein sollen, haben sie doch jedes mal einen anderen Inhalt. Kann man mir noch folgen? Deshalb möchte ich diese in eine eigene Klasse verfrachten.

mmhh eine Compound Views könnte dir vielleicht weiterhelfen.


Jedenfalls habe ich jetzt einmal die normalen Layouts, also RelativeLayout, LinearLayout etc. als die neuen JPanels ausgekundschaftet. Kann man das so durchgehen lassen?

Wenn man das JPanel als Container für die anderen Komponente sieht dann denk ich mal kann man das so durchgehen lassen.


Dem Layout habe ich eine android:id gegeben und es wäre großartig wenn ich jetzt einfach wie im guten alten Swing layoutID.add( new MyComponent(/*hier die inhalte der einzelnen Textfelder*/) ) setzen könnte und der Drops wäre gelutscht. Ist das irgendwie möglich?
In der Regel wird die Anzeige der einzelnen "Views" über einen Adapter gesteuert. (Such mal bei Google nach "ViewPager Tutorials" da findest ne ganze menge die das ziemlich ausführlich erklären)
Sollte es unbedingt per Hand sein wäre da die Methode addView des ViewPagers.

Mfg Christian Hempe

— geändert am 01.08.2013, 11:00:22

Antworten
getName
  • Forum-Beiträge: 12

01.08.2013, 14:36:52 via Website

Hallo und danke schonmal an euch beide.

impjor
Suchst du sowas:
((LinearLayout) findViewById(...)).addView(_meine_tolle_View_);

Naja die Methode kenne ich schon, aber die addView Funktion müsste ich in meinem Fragment aufrufen, da gibt es die Methode findViewByID mMn leider nicht.

In der Regel wird die Anzeige der einzelnen "Views" über einen Adapter gesteuert.

Das stimmt, und so ist es auch umgesetzt. Habe es vergessen zu erwähnen. Da die einzelnen Seiten ja Fragments sind, brauchte ich einen FragmentPagerAdapter. Und in genau den Fragments ist ein LinearLayout, dem ich dann meine Custom Componente vom Code aus hinzufügen möchte.

mmhh eine Compound Views könnte dir vielleicht weiterhelfen.

Hört sich gut an und die Seite habe ich auch schon gefunden, jedoch wird hier die erstellte Compound View ja auch wieder per XML hinzugefügt. Außerdem arbeitet man in einer Activity und ich dann in einem Fragment. Also mich verwirrt das ganze.

Abe ich werde jetzt nochmal eine Compound View erstellen und dann den nötigsten Code posten.

— geändert am 01.08.2013, 14:37:16

Antworten
Christian
  • Forum-Beiträge: 307

01.08.2013, 16:24:01 via Website

Hi getName,


Naja die Methode kenne ich schon, aber die addView Funktion müsste ich in meinem Fragment aufrufen, da gibt es die Methode findViewByID mMn leider nicht.

doch gibt es:
1getActivity().findViewById(.....);

Vielleicht noch zum Verständnis von Fragments: Using Fragments in Android - Tutorial

Mfg Christian

Antworten
getName
  • Forum-Beiträge: 12

01.08.2013, 18:28:20 via Website

Vielleicht noch zum Verständnis von Fragments: Using Fragments in Android - Tutorial

Ha! Super Seite, hab da gelesen das ja auch View diese Methode anbietet. Jetzt funktioniert es ... fast :)

Und zwar erbt meine Compund View jetzt vom RelativeLayout. Diesem muss ich aber seine Eigenschaften im Code zuweisen, da dessen - in der XML-Datei definierter - Inhalt ja von <merge> gekapselt wird. Und genau da scheitere ich bei der Zuweisung von den Margin-Werten. Sie werden einfach nicht übernommen. Was mache ich falsch?

Zunächst habe ich eine Methode zum Umrechnen von Dip in Pixel geschrieben:
1private int dip(int dip) {
2
3 Resources r = this.c.getResources();
4
5 return (int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, r.getDisplayMetrics()));
6
7 }

Dann führe ich folgenden Code im Constructor der Compound View aus:
1RelativeLayout.LayoutParams rll = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
2 rll.setMargins(dip(10), dip(10), dip(10),0);
3
4 setLayoutParams(rll);

Doch es wird keine Veränderung angezeigt. An der Umrechnung kann es eigentlich nicht liegen, da ich fürs Padding, wofür man ja keine LayoutParams braucht, die gleiche Methode nutze.

Antworten
getName
  • Forum-Beiträge: 12

02.08.2013, 01:59:11 via Website

Selbst gelöst:

LayoutParams wird bei Layouts immer vom Typ des Parent-Layouts erwartet, also:

1LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
2 params.setMargins(dip(15), dip(15), dip(15), 0);

Antworten