Oha das hätte ich eigentlich selbst hin bekommen müssen...
Aber abermals danke für die ausführliche Beschreibung, nach der ersten war ich ein wenig verwirrt und wusste nichts damit anzufangen.
Welche Foren kannst du mir denn eigentlich empfehlen?
Beiträge von B34ST
-
-
Das Event Triggere ich direkt in der activity_main.xml Datei.
Code
Alles anzeigen<Button android:id="@+id/clear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentBottom="true" android:layout_marginStart="30dp" android:layout_marginTop="144dp" android:layout_marginBottom="68dp" android:layout_toEndOf="@+id/abbr" android:onClick="clear" android:text="CLEAR" />
-
Hey, ich habe ein Problem mit meiner App. Und zwar ist es so das ich sie starten kann und alles auch so aussieht wie gewollt aber sobald ich den clear Button drücke stürzt die App ab. Kann mir wer sagen woran das liegen kann?
Code
Alles anzeigenpublic class MainActivity extends Activity { public Button abbr; public Button clear; public Button save; private DrawView drawview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DrawView drawview = new DrawView(this, null); drawview.setBackgroundColor(Color.BLACK); drawview.requestFocus(); } public void clear() { drawview.clearBitmap(); } }
-
Hey,
Ich glaube mich daran zu probieren das alles so zu Verstehen das ich das umsetzten kann wenn ich vorher nie mit OOP gearbeitet habe ist schwierig und Zeitaufwendig. Und da ich das wahrscheinlich danach nicht mehr verwenden werde da dies nicht in meinem Arbeitsfeld liegt.Daher kannst du (jogimuc) mich da so unterstützen das ich die App Zeit bald fertig bekomme, da das nächste Projekt schon in den Startlöchern steht?
-
Ok habe meinen Fehler gefunden und bin auf den nächsten gestoßen. Die App lässt sich nun ausführen jedoch crasht sie sobald er drawView.clearBitmap(); ausführen soll.
Error: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.unterschrift.DrawView.clearBitmap()' on a null object reference -
So das Layout wird jetzt richtig geladen. Ich habe die drei Buttons auch hinzugefügt das sie an der richtigen stelle sind. Jetzt habe ich onClicklistener hinzugefügt und da jetzt die Methoden drawView.clearBitmap(); und drawView.saveBitmap() ausführen.
abbr.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
drawView.clearBitmap();
}
});wenn ich das einfüge startet die App aber nicht mehr und ich weiß nicht warum. -
Alles klar probiere das mal umzusetzen.
Und danke für deine Geduld.
-
Ja das habe ich an sich verstanden und probiere das so umzusetzen. Das Layout als xml mit der Klasse als Widget hatte ich auch schon erstellt aber als ich das mit setContentView eingefügt habe startet die App nicht mehr da ich keinen Richtigen Konstruktor habe.
Ich habe mit deinem und diesem Link probiert das heraus zu finden. Kannst du mir ein Beispiel für einen Konstruktor zeigen wo ein Button mitgegeben wird? Ist das so richtig public DrawView(Context context, Button clear,Button abbr, Button save) { -
Hatte in letzer zeit ne menge zu tun und konnte mich nicht mit dem Programm beschäftigen. Ich habe mich jetzt wieder rein gelesen und komme immer noch nicht weiter. Hier mal der Quelltext für die Unterschrift.
Code
Alles anzeigenpackage com.example.unterschrift; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import static java.lang.Boolean.TRUE; public class MainActivity extends Activity { private static final int MENU_CLEAR = Menu.FIRST; private static final int MENU_SAVE = Menu.FIRST+1; private static final int MENU_LOAD = Menu.FIRST+2; private DrawView drawView = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Button clear = new Button(this); clear.setText("Clear"); clear.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); clear.setX(350); clear.setY(350); clear.setVisibility(View.VISIBLE); drawView = new DrawView(this); drawView.setBackgroundColor(Color.BLACK); setContentView(drawView); drawView.requestFocus(); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.clearButton) { drawView.clearBitmap(); return true; } if (id == R.id.abbrButton) { return true; } if (id == R.id.saveButton) { drawView.saveBitmap(); return true; } return super.onOptionsItemSelected(item); } }
DrawView:Java
Alles anzeigenpackage com.example.unterschrift; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Environment; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; public class DrawView extends View { private Paint paint = new Paint(); private float lastX, lastY; private boolean drawing = false; private Bitmap bitmap; private Canvas canvas; private Context context; public DrawView(Context context) { super(context); setFocusable(true); paint.setAntiAlias(true); paint.setARGB(255,0 ,255, 255); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565); canvas = new Canvas(bitmap); bitmap.setHeight(300); bitmap.eraseColor(Color.LTGRAY); if (bitmap != null) { canvas.drawBitmap(bitmap, 0 , 0, null); } invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (bitmap != null) { canvas.drawBitmap(bitmap, 0 , 0, null); } } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { drawPoint(event.getX(), event.getY(), event.getPressure()); return true; } else if (event.getAction() == MotionEvent.ACTION_UP) { drawing = false; return true; } else if (event.getAction() == MotionEvent.ACTION_MOVE) { drawing = true; drawPoint(event.getX(), event.getY(), event.getPressure()); return true; } return false; } private void drawPoint(float x, float y, float pressure) { if (bitmap != null) { //int pressureLevel = (int)(pressure * 255); //paint.setARGB(pressureLevel, 255, 255, 255); paint.setARGB(255, 0, 0, 0); if (drawing) { canvas.drawLine(lastX, lastY, x, y, paint); } else { canvas.drawPoint(x, y, paint); } lastX = x; lastY = y; invalidate(); } } public void clearBitmap() { if (canvas != null) { paint.setARGB(255, 255, 255, 255); canvas.drawPaint(paint); invalidate(); } } public void saveBitmap() { if (bitmap != null) { try { String path = Environment.getExternalStorageDirectory() + "/unterschrift/signatures"; File dir = new File(path); if (!dir.exists() || !dir.isDirectory()) { dir.mkdirs(); } File file = new File(dir.getAbsolutePath() + "/signature.png"); FileOutputStream fos; fos = new FileOutputStream(file); bitmap.compress(CompressFormat.PNG, 100, fos); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException io) { io.printStackTrace(); } } } public void loadBitmap() { String path = Environment.getExternalStorageDirectory() + "/unterschrift/signatures/signature.png"; Bitmap bmp = BitmapFactory.decodeFile(path); if (bmp != null) { if (canvas != null) { canvas.drawBitmap(bmp, 0, 0, null); } invalidate(); } } }
1.
es wird bei mir das menu nicht angezeigt
2.
ich weiß nicht wie ich die Größe des Canvas anpassen kann. -
Ich Probiere es erstmal selbst und bin nächste Woche erstmal in der Schule und Schreibe ein Paar Klausuren wenn ich nicht weiter komme melde ich mich dann nochmal. Ich bedanke mich auf jeden Fall für die ganze Hilfe.
-
Ja gebe mein Bestes das zu verstehen habe ich auch schon ein wenig. Also ich habe das Bitmap auf Hellgrau und das Paint auf Schwarz gesetzt dann die Bitmap auf eine Höhe von 300px. Das Problem ist gerade das das Canvas noch über den ganzen Bildschirm geht und ich versuche das gerade zu verändern und dann darunter über die Klasse View auch noch die Buttons einzufügen.
-
Ich habe seine App 1 zu 1 kopiert habe aber dabei nur einen Schwarzen Hintergrund mit weißer Schrift, ich möchte das aber genau umgekehrt. Desweiteren möchte ich der Bitmap eine feste Höhe von 300px geben und darunter die drei Buttons die eigentlich im menu sind.
-
Ja damit arbeite ich schon aber da das schon sehr veraltet ist funktioniert das bei mir nicht so wie gewollt und ich probiere heraus zu finden warum nicht.
-
Also ich habe mir jetzt eine zweite Liste erstellt mit anderen Buttons etc. Jetzt möchte ich noch möglich machen das man über einen Button eine unterschrift erstellen und dem Datensatz zuordnen kann. Weißt du wie ich z.B. ein Feld öffnen kann wo man unterschreiben und das dann speichern kann.
-
Ich habe mir eine Linux VM aufgesetzt wo meine Datenbank drauf ist. Darauf habe ich dann noch einen Webserver über Apache2 aufgesetzt und rufe darüber dann die Scrips auf. Mit PHP sowie der Datenbank komme ich gut klar da sind auch schon mehr Felder vorhanden und da bekomme ich wenn nötig auch Informationen aus der Firma. Das Problem ist dass ich, wie du wahrscheinlich schon bemerkt hast, in Android Studio kompletter Anfänger bin.
Also ich möchte die Dialog Box erweite damit ich mehr Informationen weitergeben kann, dass Anpassen der PHP Skripte ist dann nur eine Kleinigkeit und ich habe mir viel von der App aus dem Internet kopiert da ich mit meinem Wissen nicht in der Lage bin das komplett selbst zu machen, daher brauche ich auch so viel Unterstützung. -
Habe noch eine Frage und zwar wie kann ich hier: weitere Zeilen zum editieren einfügen?
Hier ist der Aufruf davon:Code
Alles anzeigenpublic void doEdit(View view) { if (view.getTag() instanceof Eintrag) { eintrag = (Eintrag) view.getTag(); AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this); alertBuilder.setTitle("Eintrag bearbeiten"); eingabefeld = new EditText(this); eingabefeld.setText(eintrag.getEintrag()); alertBuilder.setView(eingabefeld); alertBuilder.setCancelable(true); alertBuilder.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { (new DBRequestTask(MainActivity.this)).execute( getString(R.string.basis_url) + "update.php", "Name", eingabefeld.getText().toString(), "ID", Integer.toString(eintrag.getId())); } }); alertBuilder.create().show(); } }
-
Alles klar da setz ich mich gleich mal ran danke
-
Hab eh schon überlegt mir dafür eine neue Liste zu machen wollte nur meine Möglichkeiten überprüfen und mein Adapter ist weiter oben im Thema schon drin. Ich schaue mir das morgen mal in ruhe an und bedanke mich schon mal für deine Hilfe.
Hier nochmal der Adapter:
Java
Alles anzeigenpackage com.example.parseapp; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; public class EintragAdapter extends BaseAdapter { private ArrayList<Eintrag> eintragListe; private Context context; public EintragAdapter(Context context) { super(); this.eintragListe = new ArrayList<Eintrag>(); this.context = context; } public ArrayList<Eintrag> getEintragListe() { return eintragListe; } @Override public int getCount() { return eintragListe.size(); } @Override public Object getItem(int position) { return eintragListe.get(position); } @Override public long getItemId(int position) { return eintragListe.get(position).getId(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.eintrag_layout, parent, false); } TextView textView = (TextView) view.findViewById(R.id.eintragTextView); textView.setText(eintragListe.get(position).getEintrag()); View deleteButton = view.findViewById(R.id.deleteButton); deleteButton.setTag(eintragListe.get(position)); View editButton = view.findViewById(R.id.editButton); editButton.setTag(eintragListe.get(position)); return view; }}
-
Hey hatte ein wenig viel zu tum und kann mich jetzt erst wieder an die app setzten. Also zurzeit ist es so das ich in die gleiche Liste ein neues select schreibe. Ich hänge hier mal meine mainActivity an
Code
Alles anzeigenpackage com.example.parseapp; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import static java.sql.Types.NULL; public class MainActivity extends AppCompatActivity implements DBResultHandler { private EintragAdapter eintragAdapter; private EditText eingabefeld; private EditText eingabefeld1; private Eintrag eintrag; int rid=NULL; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView) findViewById(R.id.container); eintragAdapter = new EintragAdapter(this); listView.setAdapter(eintragAdapter); if (rid==NULL) { ladeDaten();} } private void ladeDaten() { (new DBRequestTask(this)).execute(getString(R.string.basis_url) + "selectm.php"); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.hinzufuegenButton) { neuerEintrag(); return true; } if (id == R.id.reselectButton) { reSelect(); return true; } return super.onOptionsItemSelected(item); } private void reSelect() { (new DBRequestTask(this)).execute(getString(R.string.basis_url) + "selectm.php"); rid=NULL; Toast.makeText(this,String.valueOf(rid),Toast.LENGTH_LONG).show(); } private void neuerEintrag() { AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this); alertBuilder.setTitle("Neuer Eintrag"); eingabefeld = new EditText(this); eingabefeld1 = new EditText(this); alertBuilder.setView(eingabefeld); alertBuilder.setCancelable(true); alertBuilder.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { (new DBRequestTask(MainActivity.this)).execute( getString(R.string.basis_url) + "insert.php", "Name", eingabefeld.getText().toString(), "ID", eingabefeld1.getText().toString()); } }); alertBuilder.create().show(); } public void doEdit(View view) { if (view.getTag() instanceof Eintrag) { eintrag = (Eintrag) view.getTag(); AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this); alertBuilder.setTitle("Eintrag bearbeiten"); eingabefeld = new EditText(this); eingabefeld.setText(eintrag.getEintrag()); alertBuilder.setView(eingabefeld); alertBuilder.setCancelable(true); alertBuilder.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { (new DBRequestTask(MainActivity.this)).execute( getString(R.string.basis_url) + "update.php", "Name", eingabefeld.getText().toString(), "ID", Integer.toString(eintrag.getId())); } }); alertBuilder.create().show(); } } public void doSelect(View view) { if (view.getTag() instanceof Eintrag) { ImageButton select = findViewById(R.id.selectButton ) ; select. setVisibility(View.GONE ); eintrag = (Eintrag) view.getTag(); (new DBRequestTask(MainActivity.this)).execute( getString(R.string.basis_url) + "select.php", "ID", Integer.toString(eintrag.getId())); rid = eintrag.getId(); Toast.makeText(this,String.valueOf(rid),Toast.LENGTH_LONG).show(); } } @Override public void ergebnisVerarbeiten(String ergebnis) { try { JSONObject jsonErgebnis = new JSONObject(ergebnis); JSONArray statusArray = jsonErgebnis.getJSONArray("Status"); int status = statusArray.getInt(0); switch (status) { case 0: JSONArray datenArray = jsonErgebnis.getJSONArray("Liste"); eintragAdapter.getEintragListe().clear(); for (int i = 0; i < datenArray.length(); i++) { JSONObject einzelsatz = datenArray.getJSONObject(i); eintragAdapter.getEintragListe().add( new Eintrag(einzelsatz.getInt("ID"), einzelsatz .getString("Name"))); } eintragAdapter.notifyDataSetChanged(); break; case 1: Toast.makeText(this, statusArray.getString(1), Toast.LENGTH_SHORT).show(); if (rid==NULL) { ladeDaten();} break; case 2: Toast.makeText(this, statusArray.getString(1), Toast.LENGTH_SHORT).show(); if (rid==NULL) { ladeDaten();} break; case 3: Toast.makeText(this, statusArray.getString(1), Toast.LENGTH_SHORT).show(); if (rid==NULL) { ladeDaten();} break; default: Toast.makeText(this, statusArray.getString(1), Toast.LENGTH_SHORT).show(); break; } } catch (JSONException e) { Toast.makeText(this, "Serverantwort konnte nicht verarbeitet werden", Toast.LENGTH_SHORT).show(); } } }
-
Ich habe meine MainActivity so angepasst das der Button der vorerst für das löschen da war jetzt ein select Statement aufruft welches dann in das ListView eingetragen wird. Also wenn ich bei Katrin Oy auf die Lupe klicke kommt das ListView mit dem Eintrag PC 123456 wo die Lupe eigentlich unsichtbar(bzw. View.GONE) sein müsste. Da ich dort an der Stelle der Lupe einen anderen Button zum löschen einfügen will. Wenn ich Dann auf den zurück Button klicke welcher oben im Menü zu sehen ist klicke soll der Button (die Lupe) wieder sichtbar sein.