Du bist nicht angemeldet.

Android KoordDroid v2.0

Lieber Besucher, herzlich willkommen bei: DeveloperTalk. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

1

09.10.2011, 18:36

KoordDroid v2.0

So, die finale Version von KoordDroid ist endlich fertig!
Nochmal die Beschreibung:

Zitat von »Erik«

Es geht um KoordDroid, eine App, mit der man GPS Koordinaten verarbeiten kann, zum Beispiel die Entfernung zwischen zwei Punkten ausrechen. Diese App fällt mal wieder in die Kategorie extrem sinnlos, aber ne super Übung. Wir sollten in Mathe in so einer Projektwoche einen großen Sportplatz vermessen sollten, also die GPS Koordinaten einzelner Messpunkte bestimmen, um dann einen maßstabsgetreuen Umrissplan zu zeichnen. Außerdem sollten wir die Fläche eines Sees annähernd bestimmen, auch mit GPS.
Nachdem mann die Koordinaten auf einem ungefähren Grundriss eingetragen hatte, musste man die Werte jetzt verarbeiten. Da wir die Koordinaten nur mit Grad und Minuten messen konnten (z.B. 54° 19,123'), mussten wir sie zuerst in Grad mit Dezimalstellen umrechnen. Außerdem mussten wir für die zweite Aufgabe jeweils den Abstand zwischen zwei Punkten ausrechnen. Da das ganze bei einer relativ großen Anzahl an Punkten extrem viel Aufwand ist (und langweilig noch dazu), ist diese App entstanden, in die man die Punkte mit Grad und Minuten eintragen kann. Alle weiteren Rechnungen übernimmt die App.

Jetzt der komplette Src und ein paar Screenshots :)

Koord.java (Repräsentiert eine Koordinate)

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
package de.erik.koorddroid;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;
import android.content.Context;
import android.widget.Toast;

public class Koord {
	public final int U = 40000; //Erdumfang
	public final int R = 6370;  //Erdradius
	
	//Breitengrad = latitude
	//Längengrad  = longitude
	
	private double latitudeDeg;  //Grad des Breitengrades
	private double latitudeMin;  //Minuten des Breitengrades
	private char   latitudeDir;  //Richtung des Breitengrades (N/S)
	private double longitudeDeg; //Grad des Längengrades
	private double longitudeMin; //Minuten des Längengrades
	private char   longitudeDir; //Richtung des Längengrades (O/W)
	
	public Koord(char latitudeDir, double latitudeDeg, double latitudeMin, char longitudeDir, double longitudeDeg, double longitudeMin) {
		this.latitudeDeg  = latitudeDeg;
		this.latitudeMin  = latitudeMin;
		this.latitudeDir  = latitudeDir;
		this.longitudeDeg = longitudeDeg;
		this.longitudeMin = longitudeMin;
		this.longitudeDir = longitudeDir;
	}
	
	//Umgerechneter Breitengrad
	public double getLatitude() {
		return this.latitudeDeg + (this.latitudeMin / 60);
	}
	
	//Umgerechneter Längengrad
	public double getLongitude() {
		return this.longitudeDeg + (this.longitudeMin / 60);
	}
	
	//Distanz zum Äquator: l=40.000km * N/360°
	public double getDistanceToEquator() {
		return this.U * (this.getLatitude() / 360);
	}
	
	//Distanz zum Greenwich-Meridian: r = R * cos(N); U = 2*pi*r; b=U * O/360°
	public double getDistanceToZeroMeridian() {
		double r = this.R * Math.cos(this.getLatitude() * Math.PI / 180); //Radius des Breitenkreises
		double u = 2 * Math.PI * r;
		return u * (this.getLongitude() / 360);
	}
	
	//Abstand zwischen zwei Koords (im Metern)
	public static double getDistance(Koord koord1, Koord koord2) {
		/*
		double a = Util.getValue(koord1.getLatitude() - koord2.getLatitude());
		double b = Util.getValue(koord1.getLongitude() - koord2.getLongitude());
		//Satz des Pythagoras:
		double c = Math.sqrt(a*a + b*b);
		return koord2.getLatitude();
		*/
		
		//Lösungsweg nach http://www.java-forum.org/mathematik/21041-gps-koordinaten.html
		double lat1InRad = koord1.getLatitude() * Math.PI / 180;
		double lat2InRad = koord2.getLatitude() * Math.PI / 180;

		double tmp = Math.sin(lat1InRad) * Math.sin(lat2InRad) + Math.cos(lat1InRad)
				* Math.cos(lat2InRad)
				* Math.cos((koord2.getLongitude() - koord2.getLongitude()) * Math.PI / 180);

		tmp = Math.acos(tmp);

		return tmp * 6378388;
	}
	
	//Zwei Koords vertauschen
	public static void interchange(Koord koord1, Koord koord2, Vector<Koord> koords) {
		if(koords.indexOf(koord1) > koords.indexOf(koord2)) {
			Koord temp = koord1;
			koords.set(koords.indexOf(koord1), koord2);
			koords.set(koords.indexOf(koord2), temp);
		} else {
			Koord temp = koord2;
			koords.set(koords.indexOf(koord2), koord1);
			koords.set(koords.indexOf(koord1), temp);
		}
	}
	
	@Override
	public String toString() {
		return this.latitudeDir + ": " + this.latitudeMin + "\' " + this.longitudeDir + ": " + this.longitudeMin + "\'";
	}
	
	//Getter und Setter für die Instanzvariablen
	public char getLatitudeDir() {
		return this.latitudeDir;
	}
	
	public double getLatitudeDeg() {
		return this.latitudeDeg;
	}
	
	public double getLatitudeMin() {
		return this.latitudeMin;
	}
	
	public double getLongitudeDeg() {
		return this.longitudeDeg;
	}
	
	public double getLongitudeMin() {
		return this.longitudeMin;
	}
	
	public char getLongitudeDir() {
		return this.longitudeDir;
	}
	
	public void setLatitudeDir(char laDir) {
		this.latitudeDir = laDir;
	}
	
	public void setLatitudeDeg(double laDeg) {
		this.latitudeDeg = laDeg;
	}
	
	public void setLatitudeMin(double laMin) {
		this.latitudeMin = laMin;
	}
	
	public void setLongitudeDeg(double loDeg) {
		this.longitudeDeg = loDeg;
	}
	
	public void setLongitudeMin(double loMin) {
		this.longitudeMin = loMin;
	}
	
	public void setLongitudeDir(char loDir) {
		this.longitudeDir = loDir;
	}
	
	//Koordinaten in Datei speichern
	public static void saveKoordList(Vector<Koord> koords, String fileName, Context contextRef) throws IOException {
		String content = "";
		for(int i = 0; i < koords.size(); i++) {
			Koord koord = koords.elementAt(i);
			content += koord.getLatitudeDir();
			content += "|";
			content += koord.getLatitudeDeg();
			content += "|";
			content += koord.getLatitudeMin();
			content += "|";
			content += koord.getLongitudeDir();
			content += "|";
			content += koord.getLongitudeDeg();
			content += "|";
			content += koord.getLongitudeMin();
			content += "\n";
		}
		FileOutputStream fos = contextRef.openFileOutput(fileName, Context.MODE_PRIVATE);
		fos.write(content.getBytes());
		fos.close();
		Toast.makeText(contextRef, (String.format(contextRef.getResources().getString(de.erik.koorddroid.R.string.saved), fileName)), Toast.LENGTH_SHORT).show();
	}
	
	//Koordinaten aus Datei laden
	public static Vector<Koord> loadKoordList(String fileName, Context contextRef) throws IOException {
		FileInputStream fis = contextRef.openFileInput(fileName);
		InputStreamReader isr = new InputStreamReader(fis);
		BufferedReader br = new BufferedReader(isr);
		String line;
		Vector<Koord> koords = new Vector<Koord>();
		while((line = br.readLine()) != null) {
			String[] data = line.split("\\|");
			System.out.println(data.length);
			koords.add(new Koord(data[0].charAt(0), Double.parseDouble(data[1]), Double.parseDouble(data[2]), data[3].charAt(0), Double.parseDouble(data[4]), Double.parseDouble(data[5])));
		}
		fis.close();
		return koords;
	}
}


KoordDroidActivity.java (Die Activity der App)

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
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
package de.erik.koorddroid;


import java.io.IOException;
import java.util.Vector;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.KeyEvent;
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.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class KoordDroidActivity extends Activity {
	
	public Koord currentKoord;        //Aktuelle Koordinate
	public Vector<Koord> koords;      //Alle Koordinaten (die Liste)
	public String backKeyAction = ""; //Was machen, wenn man 'zurück' drückt?
	public String listName = "";      //Name der Liste (beim Speichern/Laden)
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setMainMenuView();       
    }
    
    public void setEditKoordView() {
    	
    	Koord koord = this.currentKoord;
    	
    	setContentView(R.layout.edit_koord);
    	Spinner spinner = (Spinner) findViewById(R.id.la_spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                this, R.array.latitude_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner = (Spinner) findViewById(R.id.lo_spinner);
        adapter = ArrayAdapter.createFromResource(
                this, R.array.longitude_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        
        EditText laDeg = (EditText) findViewById(R.id.input_la_deg);
        laDeg.setText(Double.toString(koord.getLatitudeDeg()));
        EditText laMin = (EditText) findViewById(R.id.input_la_min);
        laMin.setText(Double.toString(koord.getLatitudeMin()));
        EditText loDeg = (EditText) findViewById(R.id.input_lo_deg);
        loDeg.setText(Double.toString(koord.getLongitudeDeg()));
        EditText loMin = (EditText) findViewById(R.id.input_lo_min);
        loMin.setText(Double.toString(koord.getLongitudeMin()));
        
        findViewById(R.id.ok_button).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	Spinner  laDir = (Spinner)  findViewById(R.id.la_spinner);
            	EditText laDeg = (EditText) findViewById(R.id.input_la_deg);
                EditText laMin = (EditText) findViewById(R.id.input_la_min);
                Spinner  loDir = (Spinner)  findViewById(R.id.lo_spinner);
                EditText loDeg = (EditText) findViewById(R.id.input_lo_deg);
                EditText loMin = (EditText) findViewById(R.id.input_lo_min);
                
                //Wenn in einem Feld nichts steht, nichts machen (außer Fehlermeldung)
                if(laDeg.getText().toString().equals("") || laMin.getText().toString().equals("") || loDeg.getText().toString().equals("") || loMin.getText().toString().equals("")) {  
                	Toast.makeText(KoordDroidActivity.this, R.string.something_is_empty, Toast.LENGTH_SHORT).show();
                	return;
                }
                editCurrentKoord(laDir.getSelectedItem().toString().charAt(0), Double.parseDouble(laDeg.getText().toString()), Double.parseDouble(laMin.getText().toString()), loDir.getSelectedItem().toString().charAt(0), Double.parseDouble(loDeg.getText().toString()), Double.parseDouble(loMin.getText().toString()));
                setKoordListView();
            }
        });
    }
    
    public void setKoordListView() {
    	setContentView(R.layout.koord_list);
    	this.backKeyAction = "main_menu";
    	
    	ListView lv = (ListView) findViewById(R.id.list_koords);    	
    	lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, this.getKoordsAsStringArray()));    	  
    	lv.setTextFilterEnabled(true);
    	lv.setOnItemClickListener(new OnItemClickListener() {
    		public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    			currentKoord = koords.elementAt(position);
    			setKoordDetailsView();
    	    }
    	});

    	findViewById(R.id.new_koord).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	backKeyAction = "koord_list_delete_last";
            	addNewKoord();
            }
        });
        
        findViewById(R.id.main_menu_button).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	quitToMain();
            }
        });
        
        findViewById(R.id.graph_button).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	setGraphView();
            }
        });
        
        findViewById(R.id.save_button).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	final EditText input = new EditText(KoordDroidActivity.this);
            	input.setText(listName);
            	new AlertDialog.Builder(KoordDroidActivity.this)
                .setTitle(R.string.save)
                .setMessage(R.string.save_message)
                .setView(input)
                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        final String fileName = input.getText().toString();
                        listName = fileName;
                        if(fileName.length() == 0) {
                        	Toast.makeText(KoordDroidActivity.this, getText(R.string.name_required), Toast.LENGTH_SHORT).show();
                        	return;
                        }
                        String[] files = fileList();
                        for(int i = 0; i < files.length; i++) {
                        	if(fileName.equals(files[i])) {
                        		new AlertDialog.Builder(KoordDroidActivity.this)
                                .setIcon(android.R.drawable.ic_dialog_alert)
                                .setTitle(R.string.overwrite)
                                .setMessage(String.format(getResources().getString(R.string.really_overwrite), fileName))
                                .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        try {
											Koord.saveKoordList(koords, fileName, KoordDroidActivity.this);
										} catch (IOException e) {
											e.printStackTrace();
										}
                                    }
                                })
                                .setNegativeButton(R.string.no, null)
                                .show();
                        		return;
                        	}                        	
                        }
                        try {
							Koord.saveKoordList(koords, fileName, KoordDroidActivity.this);
						} catch (IOException e) {
							e.printStackTrace();
						}
                    }
                }).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // nichts machen
                    }
                }).show();
            }
        });
    }
    
    public void editCurrentKoord(char laDir, double laDeg, double laMin, char loDir, double loDeg, double loMin) {
    	//currentKoord = new Koord(laDir, laDeg, laMin, loDir, loDeg, loMin);
    	this.currentKoord.setLatitudeDir(laDir);
    	this.currentKoord.setLatitudeDeg(laDeg);
    	this.currentKoord.setLatitudeMin(laMin);
    	this.currentKoord.setLongitudeDir(loDir);
    	this.currentKoord.setLongitudeDeg(loDeg);
    	this.currentKoord.setLongitudeMin(loMin);
    }
    
    public String[] getKoordsAsStringArray() {
    	String[] array = new String[this.koords.size()];
    	for(int i = 0; i < this.koords.size(); i++) {
    		array[i] = "Punkt " + (i+1) + ": " + this.koords.elementAt(i).toString();
    	}
    	return array;
    }
    
    public Koord addNewKoord() {
    	//Als Default-Werte die Vorkommastellen des vorherigen Punktes nehmen
    	Koord k;
    	if(koords.size() == 0) {
    		k = new Koord('N', 0d, 0d, 'O', 0d, 0d);
    	} else {
    		Koord last = koords.lastElement();
    		k = new Koord(last.getLatitudeDir(), (double)(int)last.getLatitudeDeg(), (double)(int)last.getLatitudeMin(), last.getLongitudeDir(), (double)(int)last.getLongitudeDeg(), (double)(int)last.getLongitudeMin());
    	}
    	this.koords.add(k);
    	this.currentKoord = k;
    	this.setEditKoordView();
    	return k;
    }
    
    public void setKoordDetailsView() {
    	setContentView(R.layout.koord_details);
    	this.backKeyAction = "koord_list";
    	Koord koord = this.currentKoord;
    	TextView tv = (TextView) findViewById(R.id.details);
    	String text = "";
    	text += "Punkt " + (this.koords.indexOf(koord) + 1) + "\n";
    	text += "Koordinate: " + koord.getLatitudeDir() + " " + koord.getLatitudeDeg() + "° " + koord.getLatitudeMin() + "'  ";
    	text += koord.getLongitudeDir() + " " + koord.getLongitudeDeg() + "° " + koord.getLongitudeMin() + "'\n";
    	text += "Breitengrad: " + koord.getLatitude() + "°\n";
    	text += "Längengrad: " + koord.getLongitude() + "°\n";
    	text += "Dintanz zum Äquator: " + koord.getDistanceToEquator() + "km\n";
    	text += "Distanz zum 0-Meridian: " + koord.getDistanceToZeroMeridian() + "km\n";
    	tv.setText(text);
    	
    	Spinner spinner = (Spinner) findViewById(R.id.distance_spinner);
        ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, getKoordsAsStringArray());
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        
        Spinner spinner2 = (Spinner) findViewById(R.id.interchange_spinner);
        ArrayAdapter<CharSequence> adapter2 = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, getKoordsAsStringArray());
        adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner2.setAdapter(adapter2);
        
        findViewById(R.id.calc_distans).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	TextView tv = (TextView) findViewById(R.id.details);
    			String text = (String) tv.getText();
    			Spinner spinner = (Spinner) findViewById(R.id.distance_spinner);
    			Koord koord = koords.elementAt((int)spinner.getSelectedItemId());
    			text += "Distanz zu Punkt " + ((int)spinner.getSelectedItemId()+1) + " (" + koord.toString() + "): " + Koord.getDistance(currentKoord, koord) + "m\n";
    			tv.setText(text);
            }
        });
        
        findViewById(R.id.edit_koord).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	backKeyAction = "koord_details";
            	setEditKoordView();
            }
        });
        
        findViewById(R.id.list_button).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	setKoordListView();
            }
        });
        
        findViewById(R.id.delete_koord).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	final String name = "Punkt " + (koords.indexOf(currentKoord)+1) + " (" + currentKoord.toString() + ")";
            	new AlertDialog.Builder(KoordDroidActivity.this)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle(R.string.delete)
                .setMessage(String.format(getResources().getString(R.string.really_delete_koord), name))
                .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) { 
                        koords.remove(currentKoord);
                        setKoordListView();
                        Toast.makeText(getApplicationContext(), (String.format(getResources().getString(R.string.koord_deleted), name)), Toast.LENGTH_SHORT).show();

                    }
                })
                .setNegativeButton(R.string.no, null)
                .show();
            }
        });
        
        findViewById(R.id.move_up).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	if(currentKoord != koords.firstElement()) {
            		Koord.interchange(currentKoord, koords.elementAt(koords.indexOf(currentKoord) - 1), koords);
            		setKoordDetailsView();
            	}
            }
        });
        
        findViewById(R.id.move_down).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	if(koords.indexOf(currentKoord) != koords.size()-1) {
            		Koord.interchange(currentKoord, koords.elementAt(koords.indexOf(currentKoord) + 1), koords);
            		setKoordDetailsView();
            	}
            }
        });
        
        findViewById(R.id.interchange_button).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	Spinner spinner = (Spinner) findViewById(R.id.distance_spinner);
            	Koord.interchange(currentKoord, koords.elementAt((int)spinner.getSelectedItemId()), koords);
            	setKoordDetailsView();
            }
        });
        
    }
    
    public void setMainMenuView() {
    	this.setContentView(R.layout.main);
    	this.backKeyAction = "quit";
    	
    	findViewById(R.id.new_list_button).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	koords = new Vector<Koord>();
            	backKeyAction = "main_menu";
            	listName = "";
            	setKoordListView();
            }
        });
    	
    	findViewById(R.id.load_button).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	setLoadListView();
            }
        });
    	
    	findViewById(R.id.help_button).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	new AlertDialog.Builder(KoordDroidActivity.this)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle(R.string.help)
                .setMessage(String.format(getResources().getString(R.string.help_content)))
                .setPositiveButton(R.string.ok, null)
                .show();
            }
        });
    	
    	findViewById(R.id.quit_button).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	finish();
            }
        });
    }
    
    public void setLoadListView() {
    	this.backKeyAction = "return_to_main_menu";
    	this.setContentView(R.layout.load_list);
    	
    	RadioGroup fileList = (RadioGroup) findViewById(R.id.file_list);
    	String[] files = fileList();
    	for(int i = 0; i < files.length; i++) {
    		RadioButton radio = new RadioButton(this);
    		radio.setText(files[i]);
    		fileList.addView(radio);
    		if(i == 0) {
    			radio.setChecked(true);
    		}
    	}
    	
    	findViewById(R.id.main_menu).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	setMainMenuView();
            }
        });
    	
    	findViewById(R.id.load_list).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	RadioButton rb = (RadioButton)findViewById(((RadioGroup) findViewById(R.id.file_list)).getCheckedRadioButtonId());
            	if(rb == null) return;
            	String name = rb.getText().toString();
            	try {
					koords = Koord.loadKoordList(name, KoordDroidActivity.this);
				} catch (IOException e) {
					e.printStackTrace();
					return;
				}
				listName = name;
				backKeyAction = "main_menu";
				setKoordListView();
            }
        });
    	
    	findViewById(R.id.delete_list).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	RadioButton rb = (RadioButton)findViewById(((RadioGroup) findViewById(R.id.file_list)).getCheckedRadioButtonId());
            	if(rb == null) return;
            	final String name = rb.getText().toString();
            	new AlertDialog.Builder(KoordDroidActivity.this)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle(R.string.delete)
                .setMessage(String.format(getResources().getString(R.string.really_delete), name))
                .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        deleteFile(name);
                        setLoadListView();
                        Toast.makeText(getApplicationContext(), (String.format(getResources().getString(R.string.deleted), name)), Toast.LENGTH_SHORT).show();

                    }
                })
                .setNegativeButton(R.string.no, null)
                .show();
            }
        });
    }
    
    public void setGraphView() {
    	this.backKeyAction = "koord_list";
    	this.setContentView(R.layout.plan);
    	PointF[] points = new PointF[this.koords.size()];
    	for(int i = 0; i < this.koords.size(); i++) {
    		Koord koord = this.koords.elementAt(i);
    		points[i] = new PointF((float)koord.getLongitude(), (float)koord.getLatitude());
    	}
        ((LinearLayout)findViewById(R.id.wrapper_layout)).addView(new GraphView(this, points, getText(R.string.longitude).toString(), getText(R.string.latitude).toString(), true, true));
    }
    
    public void quitToMain() {
    	new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle(R.string.quit)
        .setMessage(R.string.really_quit)
        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                KoordDroidActivity.this.setMainMenuView();    
            }
        })
        .setNegativeButton(R.string.no, null)
        .show();
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        	if(this.backKeyAction.equals("koord_list")) {
        		this.setKoordListView();
        		return true;
        	}
        	if(this.backKeyAction.equals("koord_list_delete_last")) {
        		koords.remove(koords.lastElement());
        		this.setKoordListView();
        		return true;
        	}
        	if(this.backKeyAction.equals("koord_details")) {
        		this.setKoordDetailsView();
        		return true;
        	}
        	if(this.backKeyAction.equals("quit")) {
        		this.finish();
        		return true;
        	}
        	if(this.backKeyAction.equals("main_menu")) {
        		this.quitToMain();
        	}
        	if(this.backKeyAction.equals("return_to_main_menu")) {
        		this.setMainMenuView();
        	}
            return false;
        }
        return super.onKeyDown(keyCode, event);
    }
}


GraphView.java (Ein View, in dem ein Diagramm dargestellt wird)

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
package de.erik.koorddroid;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.PointF;
import android.graphics.Rect;
import android.view.View;

public class GraphView extends View {
	private Bitmap bitmap;  	//Bitmap (Buffer)
	private Canvas canvas;  	//Das Canvas
	private boolean isInitialized;  //Wurde init() aufgerufen?
	private Paint paint;    	//Farbe, Füllung, etc.
	private String xLabel;  	//Beschriftung der x-Achse
	private String yLabel;  	//Beschriftung der y-Achse
	private final int padding = 20; //Abstand der Achsen zum Rand (in Pixeln)
	private boolean closed; 	//Ersten und letzten Punkt verbinden?
	private PointF[] points;	//Alle punkte
	private boolean labelPoints;    //Punkte beschriften?

	public GraphView(Context context, PointF[] points, String xLabel, String yLabel, boolean closed, boolean labelPoints) {
		super(context);
		this.setFocusable(true);
		this.setFocusableInTouchMode(true);
		
		this.paint = new Paint();
		paint.setColor(Color.BLACK);
		paint.setAntiAlias(true);
		paint.setStyle(Style.FILL_AND_STROKE);
		paint.setTextAlign(Align.CENTER);
		this.xLabel = xLabel;
		this.yLabel = yLabel;
		this.closed = closed;
		this.points = points;
		this.labelPoints = labelPoints;

		this.isInitialized = false;
	}

	private void init() {
		this.bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.RGB_565);

		this.canvas = new Canvas();
		this.canvas.setBitmap(this.bitmap);
		this.canvas.drawColor(Color.WHITE);
		
		//Den Graphen generieren 
		
		//Achsen zeichnen
		canvas.drawLine(padding, getHeight()-padding, getWidth()-padding, getHeight()-padding, paint); //x-Achse
		canvas.drawLine(getWidth()-padding-10, getHeight()-padding-10, getWidth()-padding, getHeight()-padding, paint);
		canvas.drawLine(getWidth()-padding-10, getHeight()-padding+10, getWidth()-padding, getHeight()-padding, paint);
		canvas.drawText(xLabel, getWidth()/2, getHeight()-padding+15, paint);
		canvas.drawLine(padding, getHeight()-padding, padding, padding, paint); //y-Achse
		canvas.drawLine(padding-10, padding+10, padding, padding, paint);
		canvas.drawLine(padding+10, padding+10, padding, padding, paint);
		int x = -20;
		int y = getHeight()/2;
		Rect rect = new Rect();
		paint.getTextBounds(yLabel, 0, yLabel.length(), rect);		 		 		 
		canvas.rotate(-90, x + rect.exactCenterX(),y + rect.exactCenterY());
		canvas.drawText(yLabel, x, y, paint);
		canvas.rotate(90, x + rect.exactCenterX(),y + rect.exactCenterY());
		
		//Wenn es garkeine Punkte gibt, braucht man sie auch nicht zeichnen ;)
		if(points.length == 0 || points == null) {
			return;
		}
		
		//Größten und kleinsten x und y wert ermitteln
		float highestX = points[0].x;
		float lowestX  = points[0].x;
		float highestY = points[0].y;
		float lowestY  = points[0].y;
		for(int i = 0; i < points.length; i++) {
			if(points[i].x > highestX) {
				highestX = points[i].x;
			}
			if(points[i].x < lowestX) {
				lowestX = points[i].x;
			}
			if(points[i].y > highestY) {
				highestY = points[i].y;
			}
			if(points[i].y < lowestY) {
				lowestY = points[i].y;
			}
		}
		
		float deltaHlX = highestX - lowestX; //Abstand des größten und kleinsten x-Wertes
		float deltaHlY = highestY - lowestY; //Abstand des größten und kleinsten y-Wertes
		float factor; //Der Faktor, mit dem man den jeweiligen Abstand zum kleinsten Punkt multiplizieren muss, um des Abstand zum Nullpunkt in Pixeln zu bekommen
		float factorX = (getWidth()-2*padding)/deltaHlX;  //Faktor nur für x
		float factorY = (getHeight()-2*padding)/deltaHlY; //Faktor nur für y
		if(factorX <= factorY) {
			factor = factorX;
		} else {
			factor = factorY;
		}
		PointF[] pixelPoints = new PointF[points.length]; //Neues Punktearray mit Pixelwerten
		for(int i = 0; i < points.length; i++) {
			pixelPoints[i] = new PointF((points[i].x-lowestX)*factor, (points[i].y-lowestY)*factor);
		}
		
		//Koordinaten in das Richtige Koordinatensystem umrechnen (mit Ursprung oben links)
		for(int i = 0; i < pixelPoints.length; i++) {
			pixelPoints[i].x = pixelPoints[i].x+padding;
			pixelPoints[i].y = getHeight()-padding-pixelPoints[i].y;
		}
		
		/* Bräuchte man für drawLines(), die ist aber verbuggt :(
		float[] rawPoints = new float[pixelPoints.length*2]; //Punkte aus dem Point Objekt holen und als Float Array speichern [x0 y0 x1 y1 x2 y2 ...]
		for(int i = 0; i < pixelPoints.length; i++) {
			rawPoints[i*2]   = pixelPoints[i].x;
			rawPoints[i*2+1] = pixelPoints[i].y;
		}
		for(int i = 0; i < rawPoints.length; i+=2) {
			canvas.drawCircle(rawPoints[i], rawPoints[i+1], 5, paint);
			if(i != rawPoints.length - 2) {
				canvas.drawLine(rawPoints[i], rawPoints[i+1], rawPoints[i+2], rawPoints[i+3], paint);
			}
		}*/
		
		//Punkte zeichnen
		for(int i = 0; i < pixelPoints.length; i++) {
			canvas.drawCircle(pixelPoints[i].x, pixelPoints[i].y, 3, paint);
			if(labelPoints) {
				canvas.drawText(""+(i+1), pixelPoints[i].x+10, pixelPoints[i].y+10, paint);
			}
			if(i != pixelPoints.length - 1) {
				canvas.drawLine(pixelPoints[i].x, pixelPoints[i].y, pixelPoints[i+1].x, pixelPoints[i+1].y, paint);
			}
		}
		
		//ggf. schließen
		if(closed) {
			canvas.drawLine(pixelPoints[0].x, pixelPoints[0].y, pixelPoints[pixelPoints.length-1].x, pixelPoints[pixelPoints.length-1].y, paint);
		}
		
		this.isInitialized = true;

	}

	@Override
	public void onDraw(Canvas canvas) {		
		//Beim ersten Aufruf initialisieren
		if (!this.isInitialized) {
			this.init();
		}
		
		//Buffer in das Canvas zeichnen
		canvas.drawBitmap(bitmap, 0, 0, paint);
	}

}


edit_koord.xml (Bearbeiten/Hinzufügen von Koordinaten)

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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">
    <TextView android:text="@string/latitude" android:id="@+id/TextView02" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content"></TextView>
    <Spinner android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/la_spinner"></Spinner>
    <TextView android:text="@string/degree" android:id="@+id/TextView01" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_height="wrap_content"></TextView>
    <EditText android:inputType="numberDecimal" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/input_la_deg"></EditText>
    <TextView android:text="@string/minutes" android:id="@+id/TextView03" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_height="wrap_content"></TextView>
    <EditText android:inputType="numberDecimal" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/input_la_min"></EditText>
    <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content" android:text="@string/longitude"></TextView>
    <Spinner android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/lo_spinner"></Spinner>
    <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="@string/degree" android:layout_height="wrap_content"></TextView>
    <EditText android:inputType="numberDecimal" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/input_lo_deg"></EditText>
    <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_height="wrap_content" android:text="@string/minutes"></TextView>
    <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="numberDecimal" android:id="@+id/input_lo_min"></EditText>
    <Button android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/ok" android:id="@+id/ok_button" android:textSize="15dp"></Button>
    
</LinearLayout>




koord_details.xml (Die ausgerechneten Werte einer Koordinate)

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
<?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">
    <TextView android:text="TextView" android:layout_width="match_parent" android:id="@+id/details" android:layout_height="258dp"></TextView>
    <LinearLayout android:layout_weight="0.2" android:layout_width="match_parent" android:id="@+id/linearLayout1" android:layout_height="wrap_content" android:weightSum="1">
        <Spinner android:layout_height="wrap_content" android:layout_weight="1" android:layout_width="wrap_content" android:id="@+id/distance_spinner"></Spinner>
        <Button android:id="@+id/calc_distans" android:text="@string/calc_distance" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button>
    </LinearLayout>
    <LinearLayout android:layout_weight="0.2" android:id="@+id/linearLayout2" android:layout_height="wrap_content" android:layout_width="match_parent">
        <Spinner android:layout_weight="1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/interchange_spinner" android:prompt="@string/inerchange_with"></Spinner>
        <Button android:layout_height="wrap_content"  android:layout_width="wrap_content" android:id="@+id/interchange_button" android:text="@string/interchange"></Button>
        <Button android:id="@+id/move_up" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/up"></Button>
        <Button android:id="@+id/move_down" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/down"></Button>
    </LinearLayout>
    <Button android:layout_weight="0.2" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/edit" android:id="@+id/edit_koord"></Button>
    <Button android:layout_weight="0.2" android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/delete_koord" android:text="@string/delete"></Button>
    <Button android:layout_weight="0.2" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/list" android:id="@+id/list_button"></Button>
    
</LinearLayout>




koord_list.xml (Liste der Koordinaten)

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
<?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="fill_parent" android:id="@+id/list_koords" android:layout_height="328dp"></ListView>
    <Button android:layout_weight="0.25" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/new_koord" android:id="@+id/new_koord" android:textSize="20dp"></Button>
    <Button android:layout_weight="0.25" android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/save_button" android:text="@string/save" android:textSize="20dp"></Button>
    <Button android:layout_weight="0.25" android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/main_menu_button" android:text="@string/main_menu" android:textSize="20dp"></Button>
    <Button android:layout_weight="0.25" android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/graph_button" android:text="@string/graph" android:textSize="20dp"></Button>
</LinearLayout>




list_item.xml (Template für die Listrenelemente)

Spoiler Spoiler

Quellcode

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


load_list.xml (Das Laden-Menü)

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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">
    <RadioGroup android:id="@+id/file_list" android:layout_width="match_parent" android:layout_height="370dp">
        
    </RadioGroup>
    
<Button android:layout_height="wrap_content" android:layout_weight="0.33" android:layout_width="match_parent" android:id="@+id/load_list" android:text="@string/load" android:textSize="20dp"></Button>
<Button android:layout_height="wrap_content" android:layout_weight="0.33" android:layout_width="match_parent" android:id="@+id/delete_list" android:text="@string/delete" android:textSize="20dp"></Button>
<Button android:layout_height="wrap_content" android:layout_weight="0.33" android:layout_width="match_parent" android:text="@string/main_menu" android:id="@+id/main_menu" android:textSize="20dp"></Button>
    
</LinearLayout>




main.xml (Hauptmenü)

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
9
10
11
<?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"
    >
    <Button android:text="@string/new_list" android:layout_height="wrap_content" android:layout_weight="0.25" android:layout_width="match_parent" android:id="@+id/new_list_button" android:textSize="30dp"></Button>
    <Button android:layout_height="wrap_content" android:layout_weight="0.25" android:layout_width="match_parent" android:text="@string/load" android:id="@+id/load_button" android:textSize="30dp"></Button>
    <Button android:layout_height="wrap_content" android:layout_weight="0.25" android:layout_width="match_parent" android:text="@string/help" android:id="@+id/help_button" android:textSize="30dp"></Button>
    <Button android:layout_height="wrap_content" android:layout_weight="0.25" android:layout_width="match_parent" android:text="@string/quit" android:id="@+id/quit_button" android:textSize="30dp"></Button>
</LinearLayout>




plan.xml (Grundriss-Vorschau)

Spoiler Spoiler

Quellcode

1
2
3
4
5
6
7
8
<?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:id="@+id/wrapper_layout">
    
</LinearLayout>




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.erik.koorddroid"
      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=".KoordDroidActivity"
                  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>


strings.xml (Die ganzen Strings halt)

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
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">KoordDroid</string>
    <string name="latitude">Breitengrad</string>
    <string-array name="latitude_array">
        <item>N</item>
        <item>S</item>
    </string-array>
    <string-array name="longitude_array">
        <item>O</item>
        <item>W</item>
    </string-array>
        <string name="degree">Grad</string>
        <string name="minutes">Minuten</string>
        <string name="longitude">Längengrad</string>
        <string name="ok">OK</string>
        <string name="new_koord">Neue Koordinate</string>
        <string name="save">Speichern</string>
        <string name="list">Liste</string>
        <string name="edit">Bearbeiten</string>
        <string name="calc_distance">Distanz Berechnen</string>
        <string name="delete">Löschen</string>
        <string name="distance_to">Distanz zu</string>
        <string name="quit">Beenden</string>
        <string name="up">Hoch</string>
        <string name="down">Runter</string>
        <string name="interchange">Tauschen</string>
        <string name="inerchange_with">Tauschen mit</string>
        <string name="no">Nein</string>
        <string name="yes">Ja</string>
        <string name="really_quit">Wirklich zum Hauptmenü zurückkehren? Ungespeicherte Daten gehen verloren!</string>
        <string name="new_list">Neue Liste</string>
        <string name="load">Laden</string>
        <string name="help">Hilfe</string>
        <string name="main_menu">Hauptmenü</string>
        <string name="cancel">Abbrechen</string>
        <string name="save_message">Name, unter der die Liste gespeichert werden soll:</string>
        <string name="really_overwrite">Die Liste %s existiert bereits. Vorhandene Liste überschreiben?</string>
        <string name="overwrite">Überschreiben</string>
        <string name="really_delete">Möchten Sie die Liste %s wirklich unwiderruflich löschen?</string>
        <string name="deleted">Liste %s wurde erfolgreich gelöscht.</string>
        <string name="saved">Liste %s wurde erfolgreich gespeichert.</string>
        <string name="something_is_empty">Alle Werte müssen ausgefüllt werden!</string>
        <string name="name_required">Sie müssen einen Namen eingeben!</string>
        <string name="koord_deleted">%s wurde erfolgreich gelöscht.</string>
        <string name="really_delete_koord">Soll %s wirklich gelöscht werden?</string>
        <string name="help_content">KoordDroid v2.0\n\u00A9 2011 Erik Hofer\n\nKoordDroid ist eine App, die für ein Schulprojekt entwickelt wurde. Sie können GPS-Koordinaten mit Grad und Minuten (optional) eingeben. KoordDroid kann nun alle weiteren Werte, wie den Abstand zwischen zwei Punkten, berechnen. Außerdem kann eine Vorschau des Grundrissplans angezeigt werden.</string>
        <string name="graph">Plan-Vorschau</string>
    
</resources>


Jetzt sinds schon 3 Klassen :D
Ja, ich habe versucht, das etwas mehr zu kommentieren. In der KoordDroidActivity.java sind kaum Kommentare, weil es da nur Funktionen gibt, um die Views zu ändern und auf Buttonklicks zu reagieren...

Codezeilen:
Projekt insgesammt: 1141
Nur Java-Code und Resources: 958
Nur Java-Code: 805

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

KoordDroid 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.

Wäre cool, wenn das jemand testen kann :) Auf meinem S2 mit Android 2.3.3 funtionierts super.
LG Erik.

Changelog:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
v2.0
-Back-Key intigriert
-Koordlisten speichern/laden möglich
-Hauptmenü
-Vorschau des Grundrisses
-Nachfragen beim Löschen/Beenden
-Fehlermeldung, wenn man in einem Eingabefeld nichts eingegeben hat
-Fertiges Implementieren von den Richtungsbuchstaben (N/S, O/W)
-Bessere Defaultwerte beim Erstellen neuer Koordinaten

v1.0
-Man kann die App beenden
-Man kann die Reihenfolge der Punkte ändern (hoch+runter schieben, tauschen)
-Bug behoben, dass die App abstürtzt, wenn man bei einem Eingabefeld nichts eingibt
-Man kann Punkte löschen
-Icon

v1.0 pre (initial release)
Features:
-Liste mit beliebig vielen Punkten
-Koords hinzufügen und bearbeiten
-Ausrechnen von Distanz zwischen 2 Punkten
-Automatisches Anzeigen von Koordinaten nur in Grad und dem Abstand zum 0-Meridian bzw. zum Äquator
»Erik« hat folgende Dateien angehängt:
  • Koord-Droid.rar (148,82 kB - 237 mal heruntergeladen - zuletzt: 17.10.2018, 05:14)
  • Koord-Droid.apk (45,86 kB - 294 mal heruntergeladen - zuletzt: Gestern, 08:08)
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Erik« (09.10.2011, 18:57)


Ähnliche Themen

Verwendete Tags

android, app, KoordDroid, Koordinaten App