[GUI]Realisierungsfragen

  • Antworten:12
  • Bentwortet
Rainu
  • Forum-Beiträge: 42

27.11.2011, 11:07:38 via Website

Hallo zusammen,

ich bin ein Einsteiger in der Android-Entwicklung und habe auch schon eine kleine App geschrieben. Nun möchte ich mich einem etwas größeren Projekt widmen um meine Android-Kenntnisse zu schulen.
Das neue Projekt soll ein Download-Manager werden. Die Logik-Komponenten hab ich schon geschrieben (als einfache Java-Bibliothek) und nun möcht ich mich an die Gestaltung der GUI machen. Ich habe bis jetzt nur SWING-Erfahrung und deshalb hören sich meine Fragen vlt etwas danach an :)
Ich hab mir auch schon für das Hauptfenster ein Konzept erdacht und mal ein GUI-Mockup gestaltet:

Nun mal meine Fragen:
  • Wie gehe ich am besten vor, um
    • ein Panel (In swing würde man das glaub ich so machen) zu erstellen, dass ich dann ...
    • ... in die Spinner-View dynamisch hinzufügen kann?
  • Ist es Möglich (und wenn ja wie) einen Lauftext zu gestallten? ( siehe HTML-Tag "marquee")
Anhaltspunkte, Nachschlageseiten, etc. sind erwünscht :)

Rainu

Antworten
Daniel online
  • Forum-Beiträge: 282

27.11.2011, 16:33:31 via Website

Auf den ersten Blick denke ich ist das kein großes Problem. Nur ob man einen Lauftext machen kann weiß ich nicht.

Ich würde eine ListView verwenden. Diese mit eigenen Listitems(mit eigenem Layout) füllen.

Man sollte auch in eine Progressbar einen Text anzeigen können. Wenn das nicht geht, pack Progressbar und TextView in ein Layout und fertig.

Fang einfach mal damit an und frag nach wenn du auf ein Problem stößt. Keine Lust jetzt eine Anleitung zu verfassen ;)

Viele Grüße,
Daniel

Antworten
Gelöschter Account
  • Forum-Beiträge: 80

27.11.2011, 22:18:52 via Website

Genau wie Rainu sagt, würde ich auch eine ListView verwenden und für jede Row ein RelativeLayout, welches TextView, ProgressBar und was sonst noch enthält. Für Lauftext benutzt du in der TextView einfach
1android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever"
sollte kein Problem sein.

Antworten
Rainu
  • Forum-Beiträge: 42

28.11.2011, 20:25:17 via Website

Erstmal danke für die Antworten: Hab mich auch direkt ans Werk gemacht.

Ich hab mir jetzt mal ein layout gebastelt (nach langer Tüftelei), welches ein List-Element repräsentiert:

1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="wrap_content"
5 android:orientation="horizontal" >
6
7 <TextView
8 android:id="@+id/load_item.order"
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:layout_gravity="center_horizontal"
12 android:text="#"
13 android:textAppearance="?android:attr/textAppearanceLarge" />
14
15 <LinearLayout
16 android:layout_width="fill_parent"
17 android:layout_height="wrap_content"
18 android:orientation="vertical" >
19
20 <TextView
21 android:id="@+id/loader_item.uri"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:ellipsize="marquee"
25 android:marqueeRepeatLimit="marquee_forever"
26 android:text="http://rainu.dedssdfsdfdsfdsfsdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
27 android:textAppearance="?android:attr/textAppearanceMedium" />
28
29 <LinearLayout
30 android:layout_width="fill_parent"
31 android:layout_height="wrap_content"
32 android:orientation="horizontal" >
33
34 <ProgressBar
35 android:id="@+id/load_item.progressbar"
36 style="?android:attr/progressBarStyleHorizontal"
37 android:layout_width="wrap_content"
38 android:layout_height="fill_parent"
39 android:layout_weight="1" />
40
41 <TextView
42 android:id="@+id/loader_item.uri"
43 android:layout_width="wrap_content"
44 android:layout_height="wrap_content"
45 android:layout_weight="0"
46 android:text="9 %" />
47 </LinearLayout>
48 </LinearLayout>
49
50</LinearLayout>

Nun hab ich miene "MainActivity" von einer ListActivity ableiten lassen:
1@Override
2 public void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4
5 List<String> l = new ArrayList<String>();
6 for(int i=0; i < 10; i++) l.add("");
7
8 ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.load_item, R.id.load_item_order, new String[]{"# 1","# 2"});
9 setListAdapter(adapter);
10 }

Nun hab ich noch folgende Probleme/Fragen:
  • Ist ein ArrayAdapter die richtige Wahl?
  • Wie komm ich an die enzelnen Elemente eines List-Elements (Progressbar z.b.)
  • Der lauftext funktioniert leider nicht wie gewünscht (nehmlich gar nicht :( )

Antworten
Jenny S.
  • Forum-Beiträge: 8

29.11.2011, 12:26:06 via Website

Hi,

mir scheint es sinnvoller, dir von vorne herein ein Custom Adapter zu bauen. Die Gestaltungsmöglichkeiten und Implementierungsmöglichkeiten sind um ein vielfaches höher. Später sollen andere Funktionen hinzufügen, dann ist dein ArrayAdapter nicht mehr suffizient.

In diesem Thread werden Custom Adapter bei ListViews diskutiert.

Gruß, Jenny

Antworten
Florian B.
  • Forum-Beiträge: 284

29.11.2011, 13:43:53 via Website

Rainu

Nun hab ich noch folgende Probleme/Fragen:
  • Der lauftext funktioniert leider nicht wie gewünscht (nehmlich gar nicht :( )

So viel ich weiß funktioniert der Lauftext nur, wenn die TextView den Focus erhält.

Antworten
Gelöschter Account
  • Forum-Beiträge: 80

29.11.2011, 14:20:14 via Website

So funktioniert es bei mir:

1<TextView
2 android:text="das ist ein Lauftext - das ist ein Lauftext - das ist ein Lauftext - das ist ein Lauftext - das ist ein Lauftext"
3 android:id="@+id/MarqueeText"
4 android:layout_width="fill_parent"
5 android:layout_height="wrap_content"
6 android:singleLine="true"
7 android:ellipsize="marquee"
8 android:marqueeRepeatLimit="marquee_forever"
9 android:scrollHorizontally="true"
10 android:paddingLeft="15dip"
11 android:paddingRight="15dip"
12 android:focusable="true"
13 android:focusableInTouchMode="true"
14 android:freezesText="true" />

Antworten
Florian B.
  • Forum-Beiträge: 284

29.11.2011, 14:35:17 via Website

@ManuMaticx: Ah cool, dass muss ich gleich mal testen. Hab das schon öfters versucht, aber irgendwie nie hinbekommen. Und dann mehrmals gelesen, dass das nur funktionieren würde wenn die TextView den Focus erhält. Wieder was gelernt!

Antworten
Gelöschter Account
  • Forum-Beiträge: 80

29.11.2011, 14:53:19 via Website

Hab das auch nur gegoogelt B)

Antworten
Rainu
  • Forum-Beiträge: 42

29.11.2011, 21:32:03 via Website

Danke für die weiteren Antworten :)

Hab jetzt einen Eigenen Adapter geschrieben, was auch recht gut funktioniert:
1...
2
3 private final Context ctx;
4 private final List<LoadEntry> model;
5
6 Handler handler = new Handler();
7
8 public LoadListAdapter(Context c){
9 this(c, new ArrayList<LoadEntry>());
10 }
11
12 public LoadListAdapter(Context c, List<LoadEntry> model){
13 this.ctx = c;
14 this.model = model;
15 }
16
17 @Override
18 public View getView(int position, View convertView, ViewGroup parent) {
19 LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
20 View rowView = inflater.inflate(R.layout.load_item, parent, false);
21
22 TextView tv = (TextView)rowView.findViewById(R.id.loader_item_uri);
23 ProgressBar pb = (ProgressBar)rowView.findViewById(R.id.load_item_progressbar);
24
25 //model setzen
26 model.get(position).setProgressbar(pb);
27 model.get(position).setUriTextView(tv);
28
29 tv.setText(model.get(position).getUri());
30
31 return rowView;
32 }
33
34 public void addRow(String uri){
35 model.add(new LoadEntry(uri));
36
37 //sgnal geben, dass sich der inhalt geändert hat
38 this.notifyDataSetChanged();
39 }
Ich habe eine JavaBean definiert, die alle Widgets (GUI-Elemente) beinhaltet. Mein Ziel ist es, alles über dieses Model laufen zu lassen (hinzufügen etc.). Das heißt, wenn ich ein neues Element erstellen möchte, rufe ich die "addRow"-Methode auf. Diese befüllt das "Model" und löst das erstellen einer neuen Zeile aus. In der Methode "getView" übergeb ich das gewünschte Layout und zieh mir alle Widgets (GUI-Elemente) in die JavaBean - Damit sind diese auch in dem Model registriert, damit ich so ganz bequem auf diese zugreifen kann. Meine Frage: Ist das "schön"? Oder würdet ihr sagen: "Ne das geht gar nicht, weil ...!"

Bzg. dem Lauftext: Es funktioniert, wenn ich die TextView per "setSelected(true)" fukusiere. Aber auch hier die Frage: Ist es gut, dass man mehrere (in meinen Fall möchte ich ja bei allen Elementen den Lauftext einschalten) TextViews fokusiert?

[Edit] Ich hab gerade bemerkt, dass wenn ich Elemente hinzufüge und dann den Bildschirm drehe, dass dann alle List-Elemente wieder verschwinden. Woran liegt das?

— geändert am 29.11.2011, 21:45:52

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

29.11.2011, 22:29:53 via App

activity lifecycle

swordiApps Blog - Website

Antworten
Rainu
  • Forum-Beiträge: 42

01.12.2011, 14:50:20 via Website

So wie ich das verstanden habe, muss ich bei der OnPause()-Methode mein "Status" speichern und in der OnResume()-Methode diesen wieder auslesen. Da ich aber vorhabe die Logik in einen Service zu implementieren fällt dies eigentlich weg. Da der Service angefragt werden soll, wenn ein neue Download angelegt werden soll. Der Service wird dann das Speichern des "Jobs" übernehmen. Somit benötige ich nur in der OnResume()-Methode einen aufruf des Services, der mir alle aktuell laufenden Downloads übergiebt.

Lange Rede kurzer Sinn: Der Service übernimmt die Persistierung und die GUI liest nur. Damit ist die GUI erstmal abgeckt :) Jetzt mach ich mich an die Service implementierung.

Vielen dank für eure Unterstützung!

Antworten