AlertDialog einbinden

  • Antworten:3
max theis
  • Forum-Beiträge: 31

13.09.2010, 13:36:50 via Website

Hallo Leute,

ich bin es mal wieder. Heute stehe ich programmiertechnisch schon das ein oder andere mal auf dem Schlauch. Im moment habe ich folgendes Problem.
Ich zeichne in meinem Programm eine Linie, diese Linie möchte ich "wenn sie mir gefällt" speichern bzw. oder halt neu machen. Ich möchte das Speichern anhand einer Alertbox machen. Nur wenn ich eine Alertbox erstelle möchten geht das nicht, ist ja auch an sich logisch. Muss ich eine Onlick Methode schreiben in dem ich den Wert übergebe um ihn da zu verarbeiten.

Es tut mir leid, das ich mein Problem nicht so gut erklären konnte. Aber ich hoffe das es jetzt Verständlich ist, was ich meine.

Mein Code

1package com.test.motionpath;
2
3import java.util.ArrayList;
4
5import android.app.AlertDialog;
6import android.content.Context;
7import android.content.DialogInterface;
8import android.graphics.Bitmap;
9import android.graphics.Canvas;
10import android.graphics.Color;
11import android.graphics.Paint;
12import android.graphics.PointF;
13import android.util.Log;
14import android.view.MotionEvent;
15import android.view.SurfaceHolder;
16import android.view.SurfaceView;
17import android.view.View;
18import android.view.View.OnTouchListener;
19
20public class MotionPathView extends SurfaceView implements SurfaceHolder.Callback, OnTouchListener
21{
22
23 private Bitmap line;
24 private Canvas lineCanvas;
25 private DrawThread thread;
26 private Paint paint;
27 private Paint linepaint;
28 private Paint verticalPaint;
29 private ArrayList<PointF> points;
30 private PointF last;
31 private int idx;
32 private float incline;
33 private float inclineVertical;
34 private AlertDialog show;
35
36
37 public void SavePoint(){
38
39 return;
40 }
41
42 public MotionPathView(Context context)
43 {
44 super(context);
45
46 setFocusable(true);
47 setClickable(true);
48 setOnTouchListener(this);
49
50 getHolder().addCallback(this);
51 thread = new DrawThread(getHolder(), this);
52
53 points = new ArrayList<PointF>();
54
55 paint = new Paint();
56 paint.setStrokeWidth(2);
57 paint.setAntiAlias(false);
58 paint.setColor(Color.GREEN);
59
60 linepaint = new Paint();
61 linepaint.setStrokeWidth(15);
62 linepaint.setAntiAlias(true);
63 linepaint.setColor(Color.BLUE);
64
65
66 verticalPaint = new Paint();
67 verticalPaint.setStrokeWidth(3);
68 verticalPaint.setAntiAlias(true);
69 verticalPaint.setColor(Color.RED);
70
71 idx = -1;
72 }
73
74 @Override
75 protected void onDraw(Canvas canvas)
76 {
77 canvas.drawColor(Color.BLACK);
78
79 if (line != null)
80 canvas.drawBitmap(line, 0, 0, null);
81
82 if (idx > -1 && idx < points.size())
83 {
84 if (idx < points.size() - 1)
85 {
86 if (points.get(idx + 1).x - points.get(idx).x != 0)
87 incline = (points.get(idx + 1).y - points.get(idx).y) / (points.get(idx + 1).x - points.get(idx).x);
88 else
89 incline = 0;
90
91 if (points.get(idx + 1).y - points.get(idx).y == 0)
92 {
93 canvas.drawLine(points.get(idx).x, points.get(idx).y, points.get(idx).x, points.get(idx).y + 10, verticalPaint);
94 canvas.drawLine(points.get(idx).x, points.get(idx).y, points.get(idx).x, points.get(idx).y - 10, verticalPaint);
95 idx++;
96 return;
97 }
98 }
99
100
101
102 inclineVertical = incline == 0 ? incline : -1 / incline;
103
104
105
106 float x = points.get(idx).x + 10;
107 float y = inclineVertical * (x - points.get(idx).x) + points.get(idx).y;
108 canvas.drawLine(points.get(idx).x, points.get(idx).y, x, y, verticalPaint);
109
110 x = points.get(idx).x - 10;
111 y = inclineVertical * (x - points.get(idx).x) + points.get(idx).y;
112 canvas.drawLine(points.get(idx).x, points.get(idx).y, x, y, verticalPaint);
113 idx++;
114 }
115 }
116
117 @Override
118 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
119 {
120
121 }
122
123 @Override
124 public void surfaceCreated(SurfaceHolder holder)
125 {
126 thread.setRunning(true);
127 thread.start();
128
129 line = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.RGB_565);
130 lineCanvas = new Canvas(line);
131 lineCanvas.drawColor(Color.BLACK);
132 }
133
134 @Override
135 public void surfaceDestroyed(SurfaceHolder holder)
136 {
137 boolean retry = true;
138 thread.setRunning(false);
139 while (retry)
140 {
141 try
142 {
143 thread.join();
144 retry = false;
145 } catch (InterruptedException ignore)
146 {
147
148 }
149 }
150
151 }
152
153 @Override
154 public boolean onTouch(View v, MotionEvent event)
155 {
156 switch (event.getAction())
157 {
158 case MotionEvent.ACTION_DOWN:
159 idx = -1;
160 points.clear();
161 lineCanvas.drawColor(Color.BLACK);
162 last = null;
163
164
165 case MotionEvent.ACTION_MOVE:
166 if (last == null)
167 {
168 last = new PointF();
169 //lineCanvas.drawLine((int) event.getX(), (int) event.getY(), (int) event.getX(), (int) event.getY(), paint);
170 lineCanvas.drawPoint(event.getX(), event.getY(), paint);
171
172
173
174
175 } else
176 {
177 lineCanvas.drawLine(last.x, last.y, (int) event.getX(), (int) event.getY(), linepaint);
178
179 // Zeichnung
180 }
181
182 points.add(new PointF( event.getX(), event.getY()));
183 last.set(event.getX(), event.getY());
184
185
186 OnClick(points);
187
188 //Log.v("","Punkte" + points);
189
190
191
192
193 //SavePoints(points);
194
195
196 break;
197
198
199 case MotionEvent.ACTION_UP:
200 idx = 0;
201 break;
202
203 default:
204 break;
205 }
206
207 return true;
208 }
209
210
211 private void OnClick(ArrayList<PointF> points) {
212
213 // new AlertDialog.Builder(this).setMessage(R.string.app_name);
214 // TODO Auto-generated method stub
215
216
217 }
218
219 private void SavePoints(ArrayList<PointF> points) {
220 ArrayList<PointF> x = points; // Arraylist von Punkten die gespeichert werden sollen
221 }
222
223}


Gruß
max

— geändert am 13.09.2010, 14:52:24

Antworten
max theis
  • Forum-Beiträge: 31

13.09.2010, 15:50:19 via Website

Muss ich die Klasse um etwas erweitern wenn ich ein AlertDialog nutzen möchte?

Ich hab schon mehrere Möglichkeiten ausprobiert, aber bist jetzt habe ich noch keinen "richtigen Platz für den AlertDialog gefunden. Ich hab schon eine Extra Methode angelegt. Eclipse ist mir aber auch nicht so hilfreich, da er mir ein Fehler anzeigt aber keine Vorschläge macht. 8o

Hat jemand eine Idee wie er mir Helfen kann?

Antworten
mybecks
  • Forum-Beiträge: 27

13.09.2010, 16:03:53 via Website

Hallo,

Welchen Fehler zeigt dir eclipse an?

Hast du dir mal folgende Beispiele/Ressource angeschaut?
http://developer.android.com/guide/topics/ui/dialogs.html
http://developer.android.com/reference/android/app/AlertDialog.Builder.html

Was sein kann ist, dass du den AlertDialog in einem separaten Thread ausführen musst.
Habe sowas ähnliches gehabt, nur das ich einen ProcessDialog hatte, der im Vordergrund angezeigt wurde, während im Background Daten gesammelt wurden!


1public void onClick(View v) {
2
3
4 progressDialog = ProgressDialog.show(RestTest.this,
5 "Please wait...", "Collecting mass of data...", true);
6
7 new Thread() {
8 public void run() {
9
10 //do stuff
11
12
13 handler.post(updateResults);
14 progressDialog.dismiss();
15 }
16 }.start();
17 }
18
19...
20
21final Runnable updateResults = new Runnable() {
22 public void run() {
23 if(entryList != null){
24 Context context = getApplicationContext();
25 String msg = "Found "+ entryList.getDate().size()+" entries!";
26 int duration = Toast.LENGTH_SHORT;
27 Toast toast = Toast.makeText(context, msg, duration);
28 toast.show();
29 }
30
31//for updating the UI
32 updateResultsInUi();
33 }
34 };

Mein erfolgreich verwendeter AlertDialog sieht wie folgt aus und befindet sich in der updateResultsInUi()

1AlertDialog.Builder builder = new AlertDialog.Builder(<classname>.this);
2 builder.setMessage("An Error occoured, please try again.");
3 builder.setCancelable(false);
4 builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
5 public void onClick(DialogInterface dialog, int id) {
6 return;
7 }
8 });
9 AlertDialog alert = builder.create();
10 alert.show();


Hoffe ich hab jetzt nicht kompletter Bullshit geschrieben (entwickle auch noch nicht solange mit Android), falls ja gerne verbessern.

Viele Grüße,
mybecks

Antworten
max theis
  • Forum-Beiträge: 31

14.09.2010, 10:20:30 via Website

Hallo,

okay ich verstehe was du meinst, aber ich glaube das hilft mir nicht so ganz weiter.

Ich habe das Problem das ich ein Alertdialog in meiner View verwende und nicht direkt in der Activity Klasse.
Ich glaube mir bleibt nur eine Möglichkeit, ich muss einen verweis auf die Activity Klasse machen, wo ich mein AlertDialog aufrufen.
Das wird jetzt glaub ich ein bisschen basteln. Aber so müsste das dann auch hoffentlich gehn.

Antworten