Du bist nicht angemeldet.

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

1

15.11.2011, 21:57

App mit GUI - Workshop

Heyho, heute gibts endlich mein nächstes Tutorial. Hat leider etwas länger gedauert, als erwartet :D

Soundqualität ist wieder mal nicht ganz Perfekt, und beim angucken danach ist mir aufgefallen, dass der Anfang entwas arg schlecht geschnitten ist ;D Naja, however, ist wieder ein Video geworden.

In dem Tutorial geht es darum, eine App mit einer Richtigen GUI kennenzulernen. Wir werden einige Views kennenlernen, unter Anderem Spinner, Buttons, Listen etc. Außerdem werden wir ein OptionsMenu implementieren (dieses Menü beim drücken des Menu-Keys), außerdem geben wir dem Back-Key eine Funktion. Des Weiteren kommen auch andere Sachen vor, zum Beispiel das Laden und Speichern von Dateien und ein kleines bisschen XML.

Das ganze ist nicht nur ein Tutorial, sondern eine Art Workshop, denn wir programmieren eine App namens gregowe, die dafür da ist, dass man immer weiß, wer einem wieviel Geld schuldet. Vielleicht wieder etwas sinnlos, aber das kennt ihr ja von mir und es geht ja auch ums Programmieren :D

Die Vorraussetzungen sind, dass ihr eine komplett eingerichtete Android-Entwicklungsumgebung habt. (Wenn nicht, hier ist ein Tutorial) und ihr solltet grundlegende Javakenntnisse haben, um den Code zu verstehen. Ansonsten vielleicht mal hier vorbeischauen.

So, hier ist das Video dazu (Ja, das ist wirklich so lang, hoffe irgendjemand guckt das trotzdem :D):

Ich glaube, das auf YT anzugucken ist besser, der embedded Player ist i-wie komisch :D

Der Code (Diesmal geringfügig komplexer als beim letzten Tutorial):

GregoweActivity.java

Spoiler Spoiler

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
package de.tutorial.gregowe;

import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Date;
import java.util.Vector;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;

public class GregoweActivity extends Activity {
	private Vector<Deptor> deptors;
	private static enum BackKeyAction {QUIT, MAIN_MENU, DEPTORS, DEPTOR, DEPTS, DEPT_THEN_DEPTS, DEPT_THEN_DEPTOR, DEPT}
	private BackKeyAction backKeyAction;
	private Dept backKeyObject;
	private int menuId;
	private final String SAVE_FILE = "deptors.xml";
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /*
        deptors = new Vector<Deptor>();
        Deptor de1 = new Deptor("Justus", new Vector<Dept>());
        Deptor de2 = new Deptor("Peter", new Vector<Dept>());
        Deptor de3 = new Deptor("Bob", new Vector<Dept>());
        Vector<Dept> d1 = de1.getDepts();
        d1.add(new Dept(1337, "€", "Foo", new Date(), de1));
        d1.add(new Dept(1337, "€", "Bar", new Date(), de1));
        Vector<Dept> d2 = de2.getDepts();
        d2.add(new Dept(101, "€", "Lorem Ipsum", new Date(), de2));
        Vector<Dept> d3 = de3.getDepts();
        d3.add(new Dept(123, "€", "no comment", new Date(), de3));
        d3.add(new Dept(987, "€", "ein\npaar\nmehr\nzeilen\n:)", new Date(), de3));
        deptors.add(de1);
        deptors.add(de2);
        deptors.add(de3);
        */
        if(Arrays.asList(fileList()).contains(SAVE_FILE)) {
        	try {
				deptors = Deptor.loadFromFile(openFileInput(SAVE_FILE), getString(R.string.currency));
			} catch (FileNotFoundException e) {}
        } else {
        	deptors = new Vector<Deptor>();
        }
        setMainView();
    }
    
    public void quit() {
    	try {
			Deptor.saveToFile(deptors, openFileOutput(SAVE_FILE, Context.MODE_PRIVATE), getString(R.string.currency));
		} catch (FileNotFoundException e) {}
    	finish();
    }
    
    public void editDeptor(final Deptor deptor, final boolean addNew, final String error) {
    	final EditText input = new EditText(this);
    	input.setText(deptor.getName());
    	if(error != null) {
    		input.setError(error);
    	}
    	new AlertDialog.Builder(this)
    	.setTitle(R.string.edit_deptor)
    	.setMessage(R.string.edit_deptor_message)
    	.setView(input)
    	.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int whichButton) {
				String name = input.getText().toString();
				if(name.length() == 0) {
					editDeptor(deptor, addNew, getString(R.string.insert_something));
					return;
				}
				for(int i = 0; i < deptors.size(); i++) {
					if(name.equals(deptors.elementAt(i).getName()) && !deptors.elementAt(i).equals(deptor)) {
						editDeptor(deptor, addNew, getString(R.string.name_already_exists));
						return;
					}
				}
				deptor.setName(name);
				if(addNew) {
					deptors.add(deptor);
				}
				if(backKeyAction == BackKeyAction.MAIN_MENU) {
					setDeptorsView();
				} else {
					setDeptorView(deptor);
				}
			}
    	})
    	.setNegativeButton(R.string.cancel, null)
    	.show();
    }
    
    public void setMainView() {
    	menuId = 0;
    	setContentView(R.layout.main);
    	backKeyAction = BackKeyAction.QUIT;
    	
    	((TextView)findViewById(R.id.mainTotalDeptors)).setText(""+deptors.size());
    	((TextView)findViewById(R.id.mainTotalDepts)).setText(Deptor.getTotalDepts(deptors) + getString(R.string.currency));
    	if(deptors.size() < 1) {
    		findViewById(R.id.mainDeptsButton).setEnabled(false);
    	}
    	
    	findViewById(R.id.mainDeptsButton).setOnClickListener(new OnClickListener() {
    		public void onClick(View view) {
    			setDeptsView();
    		}
    	});
    	findViewById(R.id.mainDeptorsButton).setOnClickListener(new OnClickListener() {
    		public void onClick(View view) {
    			setDeptorsView();
    		}
    	});
    	findViewById(R.id.mainHelpButton).setOnClickListener(new OnClickListener() {
    		public void onClick(View view) {
    			new AlertDialog.Builder(GregoweActivity.this)
    			.setIcon(android.R.drawable.ic_dialog_info)
    			.setTitle(R.string.help)
    			.setMessage(R.string.help_content)
    			.setPositiveButton(R.string.ok, null)
    			.show();
    		}
    	}); 
    	findViewById(R.id.mainQuitButton).setOnClickListener(new OnClickListener() {
    		public void onClick(View view) {
    			quit();
    		}
    	}); 
    }
    
    public void setDeptorsView() {
    	setContentView(R.layout.deptors);
    	backKeyAction = BackKeyAction.MAIN_MENU;
    	menuId = 0;
    	
    	ListView lv = (ListView) findViewById(R.id.deptorsList);
    	lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, Util.getAsStringArray(Deptor.sortByName(deptors))));
    	lv.setTextFilterEnabled(true);
    	lv.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				backKeyAction = BackKeyAction.DEPTS;
				setDeptorView(deptors.elementAt(position));
			}
    	});
    	
    	findViewById(R.id.deptorsAddButton).setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				editDeptor(new Deptor("", new Vector<Dept>()), true, null);
			}
    	});
    }
    
    public void setDeptorView(final Deptor deptor) {
    	backKeyAction = BackKeyAction.DEPTORS;
    	setContentView(R.layout.deptor);
    	menuId = R.menu.deptor;
    	backKeyObject = new Dept(0, null, null, null, deptor);
    	
    	float percentage = Util.round((deptor.getTotalDepts() / Deptor.getTotalDepts(deptors) * 100), 2);
    	((TextView)findViewById(R.id.deptorName)).setText(deptor.getName());
    	((TextView)findViewById(R.id.deptorTotalDepts)).setText(deptor.getTotalDepts()+getString(R.string.currency));
    	((TextView)findViewById(R.id.deptorPercentage)).setText(percentage+"%");
    	((ProgressBar) findViewById(R.id.deptorProgress)).setProgress(Math.round(percentage));
    	
    	Dept.sortByDate(deptor.getDepts());
    	String[] items = new String[deptor.getDepts().size()];
    	for(int i = 0; i < deptor.getDepts().size(); i++) {
    		Dept dept = deptor.getDepts().elementAt(i);
    		items[i] = Util.formatDate(dept.getDate(), getString(R.string.date_format)) + ": " + dept.getAmount() + dept.getCurrency();
    	}
    	
    	ListView lv = (ListView) findViewById(R.id.deptorList);
    	lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, items));
    	lv.setTextFilterEnabled(true);
    	lv.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				backKeyAction = BackKeyAction.DEPTOR;
				setDeptView(deptor.getDepts().elementAt(position));
			}
    	});
    }
    
    public void setDeptView(Dept dept) {
    	setContentView(R.layout.dept);
    	backKeyObject = dept;
    	menuId = R.menu.dept;
    	if(backKeyAction == BackKeyAction.DEPT_THEN_DEPTS) {
    		backKeyAction = BackKeyAction.DEPTS;
    	} else if(backKeyAction == BackKeyAction.DEPT_THEN_DEPTOR) {
    		backKeyAction = BackKeyAction.DEPTOR;
    	}
    	
    	((TextView)findViewById(R.id.deptDeptor)).setText(dept.getDeptor().getName());
    	((TextView)findViewById(R.id.deptAmount)).setText(dept.getAmount()+dept.getCurrency());
    	((TextView)findViewById(R.id.deptDate)).setText(Util.formatDate(dept.getDate(), getString(R.string.date_format)));
    	((TextView)findViewById(R.id.deptComment)).setText(dept.getComment());
    }
    
    public void setDeptsView() {
    	backKeyAction = BackKeyAction.MAIN_MENU;
    	setContentView(R.layout.depts);
    	menuId = 0;
    	
    	final Vector<Dept> allDepts = Dept.sortByDate(Deptor.getAllDepts(deptors));
    	ListView lv = (ListView) findViewById(R.id.deptsList);
    	lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, Util.getAsStringArray(allDepts)));
    	lv.setTextFilterEnabled(true);
    	lv.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				backKeyAction = BackKeyAction.DEPTS;
				setDeptView(allDepts.elementAt(position));
			}
    	});
    	
    	findViewById(R.id.deptsAddButton).setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				backKeyAction = BackKeyAction.DEPTS;
				setEditDeptView(new Dept(0, getString(R.string.currency), "", new Date(), null), true);
			}
    	});
    }
    
    public void setEditDeptView(final Dept dept, final boolean addNew) {
    	setContentView(R.layout.edit_dept);
    	menuId = 0;
    	
    	final Date date = (Date) dept.getDate().clone();
    	
    	Spinner spinner = (Spinner) findViewById(R.id.editDeptDeptor);
    	ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, Util.getAsStringArray(deptors));
    	adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    	spinner.setAdapter(adapter);
    	if(dept.getDeptor() != null) {
    		spinner.setSelection(deptors.indexOf(dept.getDeptor()));
    	}
    	
    	((EditText)findViewById(R.id.editDeptAmount)).setText(""+dept.getAmount());
    	((EditText)findViewById(R.id.editDeptComment)).setText(dept.getComment());
    	((Button)findViewById(R.id.editDeptDate)).setText(Util.formatDate(dept.getDate(), getString(R.string.date_format)));
    	findViewById(R.id.editDeptDate).setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				new DatePickerDialog(GregoweActivity.this, new OnDateSetListener() {
					public void onDateSet(DatePicker view, int year, int month, int day) {
						date.setYear(year-1900);
						date.setMonth(month);
						date.setDate(day);
						((Button)findViewById(R.id.editDeptDate)).setText(Util.formatDate(dept.getDate(), getString(R.string.date_format)));
					}
				}, date.getYear()+1900, date.getMonth(), date.getDate())
				.show();
			}
    	});
    	
    	findViewById(R.id.editDeptSubmit).setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				EditText amount = (EditText) findViewById(R.id.editDeptAmount);
				EditText comment = (EditText) findViewById(R.id.editDeptComment);
				Spinner deptor = (Spinner) findViewById(R.id.editDeptDeptor);
				if(amount.getText().toString().equals("")) {
    				amount.setError(getString(R.string.insert_something));
    				return;
    			}
				dept.setDeptor(deptors.elementAt(deptor.getSelectedItemPosition()));
				dept.setAmount(Float.parseFloat(amount.getText().toString()));
				dept.setComment(comment.getText().toString());
				dept.setDate(date);
				if(addNew) {
					dept.getDeptor().getDepts().add(dept);
				}
				if(backKeyAction == BackKeyAction.DEPTS) {
					setDeptsView();
				} else {
					setDeptView(dept);
				}
			}
    	});
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    	if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
    		if(backKeyAction == BackKeyAction.QUIT) {
    			quit();
    		}
    		if(backKeyAction == BackKeyAction.MAIN_MENU) {
    			setMainView();
    		}
    		if(backKeyAction == BackKeyAction.DEPTORS) {
    			setDeptorsView();
    		}
    		if(backKeyAction == BackKeyAction.DEPTOR) {
    			setDeptorView(backKeyObject.getDeptor());
    		}
    		if(backKeyAction == BackKeyAction.DEPTS) {
    			setDeptsView();
    		}
    		if(backKeyAction == BackKeyAction.DEPT || backKeyAction == BackKeyAction.DEPT_THEN_DEPTOR || backKeyAction == BackKeyAction.DEPT_THEN_DEPTS) {
    			setDeptView(backKeyObject);
    		}
    		return true;
    	}
    	return super.onKeyDown(keyCode, event);
    }
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
    	if(menuId == 0) {
    		return false;
    	}
    	menu.clear();
    	MenuInflater inflater = new MenuInflater(this);
    	inflater.inflate(menuId, menu);
    	return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	if(item.getItemId() == R.id.deptDelete) {
    		new AlertDialog.Builder(this)
    		.setIcon(android.R.drawable.ic_dialog_alert)
    		.setTitle(R.string.delete)
    		.setMessage(R.string.really_delete)
    		.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int whichButton) {
					backKeyObject.getDeptor().getDepts().remove(backKeyObject);
					if(backKeyAction == BackKeyAction.DEPTOR) {
						setDeptorView(backKeyObject.getDeptor());
					} else {
						setDeptsView();
					}
				}
			})
    		.setNegativeButton(R.string.no, null)
    		.show();
    		return true;
    	}
    	if(item.getItemId() == R.id.deptEdit) {
    		if(backKeyAction == BackKeyAction.DEPTS) {
    			backKeyAction = BackKeyAction.DEPT_THEN_DEPTS;
    		} else if(backKeyAction == BackKeyAction.DEPTORS) {
    			backKeyAction = BackKeyAction.DEPT_THEN_DEPTOR;
    		}
    		setEditDeptView(backKeyObject, false);
    		return true;
    	}
    	if(item.getItemId() == R.id.deptorDelete) {
    		new AlertDialog.Builder(this)
    		.setIcon(android.R.drawable.ic_dialog_alert)
    		.setTitle(R.string.delete)
    		.setMessage(R.string.really_delete)
    		.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int whichButton) {
					deptors.remove(backKeyObject.getDeptor());
					setDeptorsView();
				}
			})
    		.setNegativeButton(R.string.no, null)
    		.show();
    		return true;
    	}
    	if(item.getItemId() == R.id.deptorEdit) {
    		editDeptor(backKeyObject.getDeptor(), false, null);
    		return true;
    	}
    	return super.onOptionsItemSelected(item);
    }
}


Deptor.java

Spoiler Spoiler

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package de.tutorial.gregowe;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Vector;

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

public class Deptor {
	private String name;
	private Vector<Dept> depts;
	
	public Deptor(String name, Vector<Dept> depts) {
		this.name = name;
		this.depts = depts;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Vector<Dept> getDepts() {
		return depts;
	}
	
	public float getTotalDepts() {
		float amount = 0;
		for(int i = 0; i < depts.size(); i++) {
			amount += depts.elementAt(i).getAmount();
		}
		return amount;
	}
	
	@Override
	public String toString() {
		return this.name;
	}
	
	public static float getTotalDepts(Vector<Deptor> deptors) {
		float amount = 0;
		for(int i = 0; i < deptors.size(); i++) {
			amount += deptors.elementAt(i).getTotalDepts();
		}
		return amount;
	}
	
	public static Vector<Deptor> sortByName(Vector<Deptor> deptors) {
		Collections.sort(deptors, new Comparator<Deptor>() {
			public int compare(Deptor d1, Deptor d2) {
				return d1.getName().compareTo(d2.getName());
			}
		});
		return deptors;
	}
	
	public static Vector<Dept> getAllDepts(Vector<Deptor> deptors) {
		Vector<Dept> allDepts = new Vector<Dept>();
		for(int i = 0; i < deptors.size(); i++) {
			allDepts.addAll(deptors.elementAt(i).getDepts());
		}
		return allDepts;
	}
	
	public static Vector<Deptor> loadFromFile(FileInputStream file, String currency) {
		Vector<Deptor> deptors = new Vector<Deptor>();
		XmlPullParser parser = Xml.newPullParser();
		Deptor currentDeptor = null;
		try{
			parser.setInput(file, null);
			int eventType = parser.getEventType();
			while(eventType != XmlPullParser.END_DOCUMENT) {
				String name = null;
				if(eventType == XmlPullParser.START_TAG) {
					name = parser.getName();
					if(name.equals("deptor")) {
						currentDeptor = new Deptor(parser.getAttributeValue(0), new Vector<Dept>());
					} else if(name.equals("dept")) {
						currentDeptor.getDepts().add(new Dept(Float.parseFloat(parser.getAttributeValue(0)), currency, parser.getAttributeValue(1).replaceAll("\\\u00B9", "\\\n"), new Date(Long.parseLong(parser.getAttributeValue(2))), currentDeptor));
					}
				}
				if(eventType == XmlPullParser.END_TAG) {
					name = parser.getName();
					if(name.equals("deptor")) {
						deptors.add(currentDeptor);
					}
				}
				eventType = parser.next();
			}
		} catch(Exception e) {}
		return deptors;
	}
	
	public static void saveToFile(Vector<Deptor> deptors, FileOutputStream file, String currency) {
		String content = "<?xml version="1.0"?>";
		content += "<deptors>";
		for(int i = 0; i < deptors.size(); i++) {
			Deptor deptor = deptors.elementAt(i);
			content += "<deptor name="" + deptor.getName() + "">";
			for(int j = 0; i < deptor.getDepts().size(); i++) {
				Dept dept = deptor.getDepts().elementAt(j);
				content += "<dept " +
						   "amount="" + dept.getAmount() + "" " +
						   "comment="" + dept.getComment().replaceAll("\\n", "\\\u00B6") + "" " +
						   "date="" + dept.getDate().getTime() + "" />";
			}
			content += "</deptor>" ;
		}
		content += "</deptors>";
		try {
			file.write(content.getBytes());
			file.close();
		} catch(IOException e) {e.printStackTrace();}
	}
 }


Dept.java

Spoiler Spoiler

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package de.tutorial.gregowe;

import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Vector;

public class Dept {
	private float amount;
	private String currency;
	private String comment;
	private Date date;
	private Deptor deptor;
	
	public Dept(float amount, String currency, String comment, Date date, Deptor deptor) {
		setAmount(amount);
		this.currency = currency;
		this.comment = comment;
		this.date = date;
		this.deptor = deptor;
	}
	
	@Override
	public String toString() {
		return this.deptor.getName() + " (" + this.amount + this.currency + ")";
	}
	
	public float getAmount() {
		return amount;
	}
	public void setAmount(float amount) {
		this.amount = Util.round(amount, 2);
	}
	public String getCurrency() {
		return currency;
	}
	public void setCurrency(String currency) {
		this.currency = currency;
	}
	public String getComment() {
		return comment;
	}
	public void setComment(String comment) {
		this.comment = comment;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public Deptor getDeptor() {
		return deptor;
	}
	public void setDeptor(Deptor deptor) {
		this.deptor = deptor;
	}
	
	public static Vector<Dept> sortByDate(Vector<Dept> depts) {
		Collections.sort(depts, new Comparator<Dept>() {
			public int compare(Dept d1, Dept d2) {
				return d2.getDate().compareTo(d1.getDate());
			}
		});
		return depts;
	}
}


Util.java

Spoiler Spoiler

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package de.tutorial.gregowe;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;

public class Util {
	public static String[] getAsStringArray(Vector<?> vector) {
		String[] array = new String[vector.size()];
		for(int i = 0; i < vector.size(); i++) {
			array[i] = vector.elementAt(i).toString();
		}
		return array;
	}
	
	public static float round(float value, int decimals) {
		float rounded = Math.round(value * Math.pow(10, decimals));
		return (float) (rounded / Math.pow(10, decimals));
	}
	
	public static String formatDate(Date date, String format) {
		DateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.format(date);
	}
}


Res Dateien:

layout/dept.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent" android:weightSum="1">
	<TableLayout android:stretchColumns="1" android:layout_height="wrap_content" android:id="@+id/tableLayout1" android:layout_width="match_parent">
    	<TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
        	<TextView
        	android:layout_column="1"
        	android:text="@string/deptor"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        	<TextView
        	android:layout_gravity="right"
        	android:text=""
        	android:id="@+id/deptDeptor"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        </TableRow>
        <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
        	<TextView
        	android:layout_column="1"
        	android:text="@string/amount"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        	<TextView
        	android:layout_gravity="right"
        	android:text=""
        	android:id="@+id/deptAmount"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        </TableRow>
        <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
        	<TextView
        	android:layout_column="1"
        	android:text="@string/date"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        	<TextView
        	android:layout_gravity="right"
        	android:text=""
        	android:id="@+id/deptDate"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        </TableRow>
        <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
        	<TextView
        	android:layout_column="1"
        	android:text="@string/comment"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        </TableRow>
    </TableLayout>
	<TextView android:textAppearance="?android:attr/textAppearanceLarge" android:text="TextView" android:layout_height="wrap_content" android:id="@+id/deptComment" android:layout_width="match_parent"></TextView>    
</LinearLayout>


layout/deptor.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
    <TableLayout android:layout_height="wrap_content" android:id="@+id/tableLayout1" android:layout_width="match_parent">
    	<TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
        	<TextView
        	android:layout_column="1"
        	android:text="@string/name"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        	<TextView
        	android:layout_gravity="right"
        	android:text=""
        	android:id="@+id/deptorName"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        </TableRow>
        <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
        	<TextView
        	android:layout_column="1"
        	android:text="@string/total_depts"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        	<TextView
        	android:layout_gravity="right"
        	android:text=""
        	android:id="@+id/deptorTotalDepts"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        </TableRow>
        <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
        	<TextView
        	android:layout_column="1"
        	android:text="@string/percentage_of_depts"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        	<TextView
        	android:layout_gravity="right"
        	android:text=""
        	android:id="@+id/deptorPercentage"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        </TableRow>
    </TableLayout>
    <ProgressBar android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:id="@+id/deptorProgress"></ProgressBar>
    <TextView android:layout_height="wrap_content" android:id="@+id/textView1" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="@string/depts_underlined"></TextView>
    <ListView android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/deptorList"></ListView>   
</LinearLayout>


layout/deptors.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent" android:weightSum="1">
    <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.9" android:id="@+id/deptorsList"></ListView>
    <Button android:layout_weight="0.1" android:textSize="20dp" android:id="@+id/deptorsAddButton" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/add_new_deptor"></Button>
    
</LinearLayout>


layout/depts.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent" android:weightSum="1">
    <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.9" android:id="@+id/deptsList"></ListView>
    <Button android:layout_weight="0.1" android:textSize="20dp" android:id="@+id/deptsAddButton" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/add_new_dept"></Button>
    
</LinearLayout>


layout/edit_dept.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent" android:weightSum="1">
    <TextView android:layout_height="wrap_content" android:id="@+id/textView1" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:text="@string/deptor"></TextView>
    <Spinner android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/editDeptDeptor"></Spinner>
    <TextView android:layout_height="wrap_content" android:id="@+id/textView2" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:text="@string/amount"></TextView>
    <EditText android:layout_height="wrap_content" android:layout_width="match_parent" android:inputType="numberDecimal" android:id="@+id/editDeptAmount">
        <requestFocus></requestFocus>
    </EditText>
    <TextView android:layout_height="wrap_content" android:id="@+id/textView3" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:text="@string/date"></TextView>
    <Button android:textSize="20dp" android:layout_height="wrap_content" android:text="Button" android:layout_width="match_parent" android:id="@+id/editDeptDate"></Button>
    <TextView android:layout_height="wrap_content" android:id="@+id/textView4" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:text="@string/comment"></TextView>
    <EditText android:layout_width="match_parent" android:inputType="textMultiLine" android:layout_height="175dp" android:layout_weight="1.3" android:id="@+id/editDeptComment"></EditText>
    <Button android:textSize="20dp" android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/editDeptSubmit" android:text="@string/ok"></Button>
    
</LinearLayout>


layout/list_item.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:textSize="16sp"
  android:padding="10dp"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">    
</TextView>


layout/main.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TableLayout android:stretchColumns="1" android:layout_height="wrap_content" android:layout_width="match_parent">
        <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
        	<TextView
        	android:layout_column="1"
        	android:text="@string/total_deptors"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        	<TextView
        	android:layout_gravity="right"
        	android:text=""
        	android:id="@+id/mainTotalDeptors"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        </TableRow>
        <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content">
        	<TextView
        	android:layout_column="1"
        	android:text="@string/total_depts"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        	<TextView
        	android:layout_gravity="right"
        	android:text=""
        	android:id="@+id/mainTotalDepts"
        	android:padding="3dip" 
        	android:textSize="20dp"/>
        </TableRow>
    </TableLayout>
    <Button android:textSize="30dp" android:layout_weight="0.25" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/depts" android:id="@+id/mainDeptsButton"></Button>
    <Button android:textSize="30dp" android:layout_weight="0.25" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/deptors" android:id="@+id/mainDeptorsButton"></Button>
    <Button android:textSize="30dp" android:layout_weight="0.25" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/help" android:id="@+id/mainHelpButton"></Button>
    <Button android:textSize="30dp" android:layout_weight="0.25" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/quit" android:id="@+id/mainQuitButton"></Button>
</LinearLayout>


menu/dept.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/deptEdit"
    	  android:icon="@android:drawable/ic_menu_edit"
    	  android:title="@string/edit" />
    <item android:id="@+id/deptDelete"
    	  android:icon="@android:drawable/ic_menu_delete"
    	  android:title="@string/delete" />
</menu>


menu/deptor.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/deptorEdit"
    	  android:icon="@android:drawable/ic_menu_edit"
    	  android:title="@string/edit" />
    <item android:id="@+id/deptorDelete"
    	  android:icon="@android:drawable/ic_menu_delete"
    	  android:title="@string/delete" />
</menu>


values/strings.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">gregowe</string>
    <string name="depts">Schulden</string>
    <string name="deptors">Schuldner</string>
    <string name="help">Hilfe</string>
    <string name="quit">Beenden</string>
    <string name="total_deptors">Schuldner:</string>
    <string name="total_depts">Gesammtschulden:</string>
    <string name="currency">€</string>
    <string name="help_content">gregowe\n\u00A9 2011 Erik Hofer\n\ngregowe ist eine App zur Schuldenverwaltung. Mit gregowe hast du immer einen Überblick, wer dir wieviel Geld schuldet!</string>
    <string name="ok">OK</string>
    <string name="add_new_deptor">Neuen Schuldner hinzufügen</string>
    <string name="name">Name:</string>
    <string name="percentage_of_depts">Anteil an allen Schulden:</string>
    <string name="depts_underlined"><u>Schulden:</u></string>
    <string name="date_format">dd.MM.yyyy</string>
    <string name="edit_deptor">Schuldner bearbeiten</string>
    <string name="edit_deptor_message">Name des Schuldners:</string>
    <string name="cancel">Abbrechen</string>
    <string name="insert_something">Du musst hier etwas eingeben!</string>
    <string name="name_already_exists">Der Name ist schon vergeben!</string>
    <string name="deptor">Schuldner:</string>
    <string name="comment"><u>Kommentar</u></string>
    <string name="amount">Betrag:</string>
    <string name="date">Datum:</string>
    <string name="add_new_dept">Neue Schulden hinzufügen</string>
    <string name="edit">Bearbeiten</string>
    <string name="delete">Löschen</string>
    <string name="really_delete">Wirklich unwiderruflich löschen?</string>
    <string name="yes">Ja</string>
    <string name="no">Nein</string>
</resources>


Manifest:

AndroidManifest.xml

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="de.tutorial.gregowe"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="10" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".GregoweActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>


Das wars auch schon :D

Codezeilen:
Projekt insgesammt: 971
Nur Java-Code und Resources: 856
Nur Java-Code: 598

Downloads im Anhang:
gregowe.rar - Das komplette Eclipse-Projekt
gregowe.apk - Das Android-Installationspaket der App

gregowe installieren:
1. Enistellungen => Anwendungen => Unbekannte Quellen aktivieren
2. QR-Code Scannen und im Browser öffnen und die Datei herunterladen

3. Die Datei aus dem Downolad-Manager heraus öffnen (starten) und Anweisungen befolgen.

Oder die .apk Datei herunterladen, auf das Handy kopieren und über einen File-Manager starte.

So, das wars. Ich hoffe es gibt ein wenig Feedback :D Ich mache gerne auch weitere Tutorials auf Anfrage, aber wahrscheinlich nicht wieder so lang :)
LG, Erik.
»Erik« hat folgende Dateien angehängt:
  • gregowe.rar (103,99 kB - 651 mal heruntergeladen - zuletzt: 11.11.2018, 19:21)
  • gregowe.apk (33,35 kB - 956 mal heruntergeladen - zuletzt: 11.11.2018, 19:22)
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Erik« (04.01.2012, 01:42)


Es haben sich bereits 8 registrierte Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

Simon (15.11.2011), Drakor (15.11.2011), Dia3lo (15.11.2011), far (28.12.2011), aSofaSurfer (06.04.2012), z3Wa (07.05.2012), liro (16.09.2012), |CallmeSupercookie| (12.10.2013)

Dia3lo

Schüler

Beiträge: 77

Registrierungsdatum: 16.08.2011

Wohnort: Braunschweig

Danksagungen: 32

  • Private Nachricht senden

2

15.11.2011, 23:04

Thumbs up,
werde ich leider heute nicht mehr schaffen alles anzusehen
Wie lange hast du für das ganze Tutorial gebraucht?

Es hat sich bereits 1 registrierter Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

JuKu (21.02.2013)

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

3

16.11.2011, 12:08

Also ich hab ein paar Tage gebraucht, um die App zu schreiben. Für das Aufnehmen habe ich 2 Tage gebraucht und fürs Schneiden glaube ich über eine Woche. Dann hat das noch ewig gedauert, da ich das 3 mal Rendern und hochladen musste ;D Ist jetzt schon ein paar Tage up, bis ich endlich mal dazu gekommen bin, den ganzen Code aus der VM zu holen und so :D

Also angefangen habe ich in den Herbstferien ;D
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

JuKu

Profi

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

4

21.02.2013, 12:34

Leider ist das Tut ja so lang... :S
Könntest du mal noch ein Tutorial machen, wie man ein einfaches Menü erstellt, worin auch Fragmente benutzt werden und dann noch eins, wie man ein paar Daten aus dem Internet holt? :)

Am Liebsten in Textform.^^
(Dann kann ich das auch mal lesen, ohne am PC sein zu müssen.^^)
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »JuKu« (21.02.2013, 15:22)


Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

5

21.02.2013, 20:05

In nächster Zeit leider nicht... arbeite grad an nem neuen blog für meine turorials, bevor der nicht steht, kommen auch keine tuts...
ist allerdings auch die frage, wann ich da mit android anfange...
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

JuKu

Profi

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

6

21.02.2013, 20:44

Das mit dem Daten aus den Internet holen habe ich jetzt z.T. geschafft. :P
(--> s. Mini-Tutorial)
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Christian

Fortgeschrittener

Beiträge: 371

Registrierungsdatum: 23.06.2011

Wohnort: Lilienthal

Beruf: Schüler

Danksagungen: 83

  • Private Nachricht senden

7

27.02.2013, 21:40

Moin

zum Teil klingt ja nicht so als wärst du da vollkommen zufrieden, wo hast du noch Probleme mit dem Internet? eventuell kann ich dir da weiterhelfen.


lg
Chris

Zitat

Windows kann entgegen vieler behauptungen kein Virus sein. Denn Viren funktionieren normalerweise und tun etwas Sinnvolles
Wenn Beiträge Hilfreich waren drücke bitte den Bedanken Knopf drücken.

Kein Support per PN oder Mail, wir haben für jede Frage den passenden Bereich.

JuKu

Profi

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

8

28.02.2013, 14:39

z.Z. komm ich mit dem Internet klar, aber nun habe ich ein Problem beim Parsen einer XML-Datei. ^^
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

9

28.02.2013, 17:21

Hmm das geht bei Android glücklicherweise extrem leicht (ist sogar in diesem tutorial :D)... in normalem java hab ichs i-wie noch net hinbekommen :D
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

JuKu

Profi

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

10

28.02.2013, 21:10

Und wie? :D
Naja, muss mir das Tut halt nochmal anschauen.^^
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

11

28.02.2013, 21:29

Jo, der Code dazu ist oben in der Klasse Deptor
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Es hat sich bereits 1 registrierter Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

JuKu (03.03.2013)

JuKu

Profi

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

12

03.03.2013, 17:24

Oh, Danke! :)
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Verwendete Tags

android, app, gregowe, GUI, Java