Menü erst anzeigen, wenn Passwort korrekt.

  • 24 Antworten
  • Letztes Antwortdatum
K

Klawifiantix

Neues Mitglied
0
Hiho,
ich bin dabei eine App zu basteln, bei der man ein Passwort zum öffnen benötigt. Soweit funktioniert alles.
Allerdings gib es einen sehr doofen Bug. Über das Menü der App (diese drei Punkte) kann man das Passwort ändern. Das Menü wird von Beginn an angezeigt.

Man startet also die App und wird aufgefordert das Passwort einzugeben.
Doch stattdessen kann man einfach über das Menü das Passwort ändern^^.

Wie kann ich das machen, dass das Menü erst zur Verfügung steht, nachdem man das Passwort korrekt eingegeben hat?

Dieser Code baut das Menü und haucht den Items leben ein:
Code:
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {//Hier wird das             Optionsmenü erstellt

        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.main, menu);
        return true;

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {//Das ist die Abfrage, ob ein Item im Optionsmenü angeklickt wurde

        switch (item.getItemId())
        {
            case R.id.menu_archiv://Hier steht, was passiert, wenn das Item menu_archiv angeklickt wird

                tv.setVisibility(View.GONE);
                et.setVisibility(View.GONE);
                btnEingabe.setVisibility(View.GONE);
                passwort_Eingabe.setVisibility(View.GONE);
                edit_passwort.setVisibility(View.GONE);

                edit_datum.setVisibility(View.VISIBLE);
                edit_datum.setText("");
                datum_Eingabe.setVisibility(View.VISIBLE);

                return true;

            case R.id.menue_Tagebuch:

                tv.setVisibility(View.VISIBLE);
                et.setVisibility(View.VISIBLE);
                btnEingabe.setVisibility(View.VISIBLE);

                passwort_Eingabe.setVisibility(View.GONE);
                edit_passwort.setVisibility(View.GONE);
                edit_datum.setVisibility(View.GONE);
                datum_Eingabe.setVisibility(View.GONE);

                return true;

            case R.id.menue_passwort:

                tv.setVisibility(View.GONE);
                et.setVisibility(View.GONE);
                btnEingabe.setVisibility(View.GONE);
                edit_datum.setVisibility(View.GONE);
                datum_Eingabe.setVisibility(View.GONE);

                edit_passwort.setVisibility(View.VISIBLE);
                edit_passwort.setText("");
                edit_passwort.setHint("Neues Passwort");
                passwort_Eingabe.setVisibility(View.VISIBLE);
                counter = 1;

                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

Ob das eingegebene Passwort korrekt ist, wird beim Drücken eines Buttons geprüft. Ich hätte es gerne so, dass das Menü erst erstellt wird, wenn das eingegebene Passwort korrekt ist.
Weiß jemand Rat?
 
disable doch alle Menueinträge
und sobald das Passwort richtig eingegeben wurde

enabled´st du die alle wieder.
 
  • Danke
Reaktionen: Klawifiantix
Kannst Du mir da bitte ein Codebeispiel geben? Ich bekomme das so leider nicht hin :-(
 
Code:
Globaler passwortstaus 


private boolean passwort_richtig = false;

.
.
.

@Override public boolean onPrepareOptionsMenu (Menu menu) {  
   if (passwort_richtig==false) {         
     return false;    // Menu wird gar nicht angezeigt
 }
else {
  return true;    // Menu wird normal angezeigt
}

}

Man könnte auch einen 1 Zeiler draus machen und gleich den status von passwort_richtig als Retrunwert nutzen, ich habs mal wegen der Lesbarkeit als if/else Konstrukt gelassen
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Klawifiantix
Super, vielen Dank dafür! :D

Edit:
Allerdings hilft es mir noch nicht ganz, da ich nicht weiß, wie ich es richtig benutzen soll.
Wenn ich das von Dir angeführte in meine MainActivity einbinde habe ich zum Start kein Menü, soweit so gut.
Aber was muss ich nun machen, damit das Menü sichtbar wird?

Ich habe es mit:
Code:
public void passwortUebertragen (View view) {
if(passwort stimmt) {

mach was 

passwort_richtig = true;}
}
versucht, aber das klappt nicht, weil die Abfrage nach dem Zustand ja schon passierte. "passwortUerbertragen" wird ausgeführt, wenn ein bestimmter Button geklickt wird.
Die Abfrage selber kann ich aber nicht erneut in meine if Bedingung einbinden.

Code:
public void passwortUebertragen (View view) {
if(passwort stimmt) {

mach was 

private boolean passwort_richtig = true;

    @Override public boolean onPrepareOptionsMenu (Menu menu) {
        if (passwort_richtig==false) {
            return false;    // Menu wird gar nicht angezeigt
        }
        else {
            return true;    // Menu wird normal angezeigt
        }

    }
}

Da wird dann schon im Editor sehr viel rot unterstrichen...
 
Zuletzt bearbeitet:
Warum machst du keine eigene Activity für die Passwort eingabe?
Wenn mich nicht alles täuscht brauchst du da ja einfach gar kein Menü anzeigne und fertig.
 
  • Danke
Reaktionen: Klawifiantix
OnprepareOptionsMenu ist eine Methode ganz normal in deiner Activity. Für welche API entwickelst du? Ab v11 kann es notwendig sein nach dem ändern des paasswortstatus zusätzlich noch einmal activity.invalidateOptionsMenu(); aufzurufen,
Hier am besten die Google SupportLibrary einbinden dann funktioniert die Methode auch ab API 4, Wenn deine App die älteren Geräte nicht unterstützen soll, dann kannst du das vernachlässigen. Ich rekapituliere: OnprepareOptionsMenu einfach als einzelne Methode in deine Activity, deine Passwortpruefung nach der Eingabe des Passwortes und dort nach positiver Prüfung das Optionsmenu invalidieren .
 
  • Danke
Reaktionen: Klawifiantix
@ amfa
Das klingt toll, aber ich weiß nicht wie man eine andere Activity als die Mainactivity erstellt, ausführt und/ oder dann zwischen Activities wechselt.

@killphill75
Das klingt auch alles toll, aber um ehrlich zu sein komme ich damit nicht weiter, das ist mir zu hoch.
Kannst Du mir ein Buch empfehlen, damit ich bald mal eure Tipps verstehen und umsetzten kann?

Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
Meiner Meinung nach brauchst du für diese Fragestellungen dir nicht direkt ein Buch kaufen. Arbeite erstmal die Beginner-Tutorials durch, das sollte erstmal ausreichen.

Google mal die Stichworte "Activity", "Lebenszyklus Activity", "Intent" und schau dir an was in Android Manifest alles festgehalten ist bzw. festgehalten werden kann.

Wenn du diese Recherchen sorgfältig anstellst und Grundkenntnisse in Java hast, wirst du dein Problem lösen können.
 
  • Danke
Reaktionen: Klawifiantix
Ich würde es auch mit zwei Acitivities lösen. Macht einen saubereren Eindruck.

Wenn du den "Wizard" benutzt um eine neue Activity zu erstellen, dann fragt er dich, ob diese eine "MainActivity" ist. Falls du das überspringst kannst du das noch nachträglich im Manifest ändern. Wichtig hierbei noch: Die Kennzeichnung "Main" und "Launcher" bei der ursprünglichen MainActivity entfernen.

Eine Frage: Wo speicherst du denn das Passwort? in einer SQLite Datenbank? Oder als Preferences?

Grüße Flo
 
  • Danke
Reaktionen: Klawifiantix
Das Passwort wird ohne jeden Schutz als Klartext in einer .txt Datei gespeichert. Diese ganze App dient mir zum lernen von Java und zum sammeln von Erfahrungen.
Ich gehe mal davon aus, dass Passwörter niemals so abgespeichert werden sollten. Aber um es mit dem Gamerjagon auszudrücken, ich bin ein Absoluter Noob und habe keine Ahnung von dem was ich tue. Trotzdem möchte ich das Programmieren verstehen lernen und bin Euch dankbar für jede Hilfe. Selbst dann, wenn ich die Ratschläge und Hinweise nicht verstehe, aber das bringt mir wieder was zum googeln :)
 
Versuche es doch mal mit der Lösung:

Code:
@Override 
public boolean onCreateOptionsMenu(Menu menu) {[INDENT] this.menu = menu;
getMenuInflater().inflate(R.menu.options, menu);
return true; 
[/INDENT] }

// hide menu item

private void hideMenuItem (int id) {[INDENT] MenuItem item = menu.findItem(id);     
item.setVisible(false); 
[/INDENT]}

// show menu item
private void showMenuItem (int id) {[INDENT]  MenuItem item = menu.findItem(id);
  item.setVisible(true); 
[/INDENT]}
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Klawifiantix
Klawifiantix schrieb:
Das Passwort wird ohne jeden Schutz als Klartext in einer .txt Datei gespeichert.

Vielleicht entsteht der Fehler ja auch beim Auslesen aus der Textdatei? Kleiner Tipp (falls du es noch nicht probiert hast):
Lege das PW erstmal in deiner Klasse fest (also zB einen String initialisieren) und prüfe dann, ob die Logik, die du anwenden willst funktioniert.
-> Wenn das der Fall ist und alles wie erwartet funktioniert, kannst du den nächsten Schritt machen und das PW in eine Textdatei ablegen.

(Ggf. kannst du den Schritt auch mit einer Ausgabe über Logcat prüfen, nur wenns da schon Probleme gibt, ist es sehr gut möglich dass deine Logik nie was von dem PW was in der txtDatei steht erfährt...)

Kannst ja nochmal deinen aktuellen Code reinstellen ;-)
 
  • Danke
Reaktionen: Klawifiantix
@ markus.tullius
Danke für Deinen Lösungsvorschlag! Aber ich weiß nicht, wie ich einen private void in meine Buttonfuktion packen kann. Es ließt sich so simpel, aber mir fehlt das Wissen, deine Idee bei mir einbauen zu können. :-/

@ ui_3k1
Die Abfrage funktioniert, das habe ich getestet. Naja, sie funktioniert so, wie ich denke, dass sie funktionieren sollte.

Hier mal der komplette Code meiner Main Activity:
Code:
package de.diz.versuch;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Path;
import android.os.Bundle;
import android.os.Environment;
import android.text.Layout;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
import android.view.ViewTreeObserver;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.PrintStream;
import java.io.Writer;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.Date;

import static de.diz.versuch.R.string;

public class MainActivity extends Activity {

    public TextView tv; //Das Textfeld, in dem der Text abschließend stehen soll.
    public EditText et; //Das Textfeld, in das geschrieben wird.
    public EditText edit_datum;
    public EditText edit_passwort;
    public Button btnEingabe;
    public Button datum_Eingabe;
    public Button passwort_Eingabe;
    public SimpleDateFormat Datum = new SimpleDateFormat("dd.MM.yyyy"); //Definieren des Formats, mit dem das Datum angezeigt werden soll.
    public SimpleDateFormat Dateidatum = new SimpleDateFormat("MMMyyyy");
    public SimpleDateFormat Uhrzeit = new SimpleDateFormat("HH:mm");
    public SimpleDateFormat Wochentag = new SimpleDateFormat("EEEE");
    public FileOutputStream fos;
    public FileInputStream fis;
    public Date currentTime = new Date();
    public String Dateiname = Dateidatum.format(currentTime) +".txt";
    public String Passwort = "passwort.txt";
    public String collected;
    public String collected_passwort;
    public int counter = 0;
    public int unlock = 0;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        tv = (TextView)findViewById(R.id.Text);
        tv.setMovementMethod(new ScrollingMovementMethod());
        tv.setVisibility(View.GONE);
        et = (EditText)findViewById(R.id.eingabe);
        et.setVisibility(View.GONE);
        btnEingabe = (Button)findViewById(R.id.BtnEingabe);
        btnEingabe.setVisibility(View.GONE);
        edit_datum = (EditText)findViewById(R.id.edit_Datum);
        edit_datum.setVisibility(View.GONE);
        datum_Eingabe = (Button)findViewById(R.id.datum_eingabe);
        datum_Eingabe.setVisibility(View.GONE);
        edit_passwort = (EditText)findViewById(R.id.edit_Passwort);
        passwort_Eingabe = (Button)findViewById(R.id.passwort_eingabe);

        File file = getBaseContext().getFileStreamPath(Passwort);
        if (file.exists()) {
            try {//Hier wird das gesetzt Passwort ausgelesen
                fis = openFileInput(Passwort);
                byte[] readData = new byte [fis.available()];
                while (fis.read(readData) != -1){
                    collected_passwort = new String(readData);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally{
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                edit_passwort.setHint("Passwort eingeben");
            }

                }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {//Hier wird das Optionsmenü erstellt

        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.main, menu);
        return true;

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {

        switch (item.getItemId())
        {//Das ist die Abfrage, ob ein Item im Optionsmenü angeklickt wurde
            case R.id.menu_archiv://Hier steht, was passiert, wenn das Item menu_archiv angeklickt wird

                tv.setVisibility(View.GONE);
                et.setVisibility(View.GONE);
                btnEingabe.setVisibility(View.GONE);
                passwort_Eingabe.setVisibility(View.GONE);
                edit_passwort.setVisibility(View.GONE);

                edit_datum.setVisibility(View.VISIBLE);
                edit_datum.setText("");
                datum_Eingabe.setVisibility(View.VISIBLE);

                return true;

            case R.id.menue_Tagebuch:

                tv.setVisibility(View.VISIBLE);
                et.setVisibility(View.VISIBLE);
                btnEingabe.setVisibility(View.VISIBLE);

                passwort_Eingabe.setVisibility(View.GONE);
                edit_passwort.setVisibility(View.GONE);
                edit_datum.setVisibility(View.GONE);
                datum_Eingabe.setVisibility(View.GONE);

                return true;

            case R.id.menue_passwort:

                tv.setVisibility(View.GONE);
                et.setVisibility(View.GONE);
                btnEingabe.setVisibility(View.GONE);
                edit_datum.setVisibility(View.GONE);
                datum_Eingabe.setVisibility(View.GONE);

                edit_passwort.setVisibility(View.VISIBLE);
                edit_passwort.setText("");
                edit_passwort.setHint("Neues Passwort");
                passwort_Eingabe.setVisibility(View.VISIBLE);
                counter = 1;

                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

    public void passwortUebertragen (View view) {

        File file = getBaseContext().getFileStreamPath(Passwort);
        if (file.exists()) {

        }
        else{
            if (edit_passwort.getText().toString().equals("")){ //Bei keiner Eingabe des Passworts, wird erneut zur Eingabe aufgefordert.

                Context context = getApplicationContext();
                CharSequence text = "Bitte Passwort eingeben";
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.setGravity(0, 0, 0);
                toast.show();

            }else{
            try {//Da noch kein Passwort gesetzt wurde, wird jetzt eins gesetzt.
                String data = edit_passwort.getText().toString();
                fos = openFileOutput(Passwort, Context.MODE_PRIVATE);
                fos.write(data.getBytes());
                fos.close();
            }   catch (FileNotFoundException e) {
                e.printStackTrace();
            }   catch (IOException e) {
                e.printStackTrace();
            }
            Context context = getApplicationContext();
            CharSequence text = "Passwort gespeichert";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.setGravity(0, 0, 0);
            toast.show();

            unlock = 1;
            }
            edit_passwort.setText("");
            edit_passwort.setVisibility(View.GONE);
            passwort_Eingabe.setVisibility(View.GONE);

            tv.setVisibility(View.VISIBLE);
            et.setVisibility(View.VISIBLE);
            btnEingabe.setVisibility(View.VISIBLE);

        }

        if (edit_passwort.getText().toString().equals(collected_passwort.toString()) && counter == 0) {//Wenn das eingegebene Passwort mit dem abgespeicherten übereinstimmt, und man das Passwort nicht ändern möchte. Startet die App.
            edit_passwort.setVisibility(View.GONE);
            passwort_Eingabe.setVisibility(View.GONE);
            tv.setVisibility(View.VISIBLE);
            et.setVisibility(View.VISIBLE);
            btnEingabe.setVisibility(View.VISIBLE);

            unlock =1;

            File file2 = getBaseContext().getFileStreamPath(Dateiname);
            if (file2.exists()) {
                try {//Hier wird die Datei für den Text des Tagebuchs geladen und angezeigt.
                    fis = openFileInput(Dateiname);
                    byte[] readData = new byte [fis.available()];
                    while (fis.read(readData) != -1){
                        collected = new String(readData);
                    }
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally{
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    tv.setText(collected);
                }
                Context context = getApplicationContext();
                CharSequence text = Dateiname + " geladen";
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.setGravity(0, 0, 0);
                toast.show();
            }else{
                Context context = getApplicationContext();
                CharSequence text = "Willkommen bei Deinem neuen Tagebuch";
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.setGravity(0, 0, 0);
                toast.show();
            }
        }else{
            if (counter == 0){//Wenn das eingegebene Passwort nicht mit dem gespeicherten übereinstimmt, kommt die Ausgabe "Falsches Passwort"

            Context context = getApplicationContext();
            CharSequence text = "Falsches Passwort";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.setGravity(0, 0, 0);
            toast.show();
            }
        }
        if (file.exists() && counter == 1) {
            if (edit_passwort.getText().toString().equals("")){//Wenn man das Passwort ändern möchte, aber keins eingab, wird erneut aufgefordert

                Context context = getApplicationContext();
                CharSequence text = "Bitte Passwort eingeben";
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.setGravity(0, 0, 0);
                toast.show();

            }else{
                if(unlock == 0){

                    Context context = getApplicationContext();
                    CharSequence text = "Bitte vorher mit altem Passwort einloggen";
                    int duration = Toast.LENGTH_SHORT;

                    Toast toast = Toast.makeText(context, text, duration);
                    toast.setGravity(0, 0, 0);
                    toast.show();
                }else{

            try {//Wenn man ein neues Passwort bestimmt hat, wird dieses abgespeichert
                String data = edit_passwort.getText().toString();
                fos = openFileOutput(Passwort, Context.MODE_PRIVATE);
                fos.write(data.getBytes());
                fos.close();
            }   catch (FileNotFoundException e) {
                e.printStackTrace();
            }   catch (IOException e) {
                e.printStackTrace();
            }
            Context context = getApplicationContext();
            CharSequence text = "Neues Passwort gespeichert";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.setGravity(0, 0, 0);
            toast.show();
            counter = 0;

            edit_passwort.setText("");
            edit_passwort.setVisibility(View.GONE);
            passwort_Eingabe.setVisibility(View.GONE);

            tv.setVisibility(View.VISIBLE);
            et.setVisibility(View.VISIBLE);
            btnEingabe.setVisibility(View.VISIBLE);
            }
            }
        }
    }

    //Diese Funktion/en wird/werden ausgeführt, wenn der Button "Eingabe" benutzt wird.

    public void textUebertragen(View view) {

        //Hier wird der Text aus dem EditText Feld in das ViewText Feld übertragen.
        if (tv.getText().toString().equals("")&(et.getText().toString().equals(""))){

        }else {//Das hier wird gemacht, wenn kein Text im TextViewfeld steht.
            if(tv.getText().toString().equals("")){
                Date currentTime = new Date();
                String editTextValue = (Wochentag.format(currentTime) + " - " + Datum.format(currentTime) + " - " + (Uhrzeit.format(currentTime)) + ('\n') + et.getText().toString());
                tv.setText (editTextValue);
                et.setText("");
                try {//Der Text wird direkt in der Datei Tagebuch.txt gespeichert.
                    String data = tv.getText().toString();
                    fos = openFileOutput(Dateiname, Context.MODE_PRIVATE);
                    fos.write(data.getBytes());
                    fos.close();
                }   catch (FileNotFoundException e) {
                    e.printStackTrace();
                }   catch (IOException e) {
                    e.printStackTrace();
                }
                et.setText("");
                Context context = getApplicationContext();
                CharSequence text = "Eingabe gespeichert in " + Dateiname;
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.setGravity(0, 0, 0);
                toast.show();
            }

        }

        if(et.getText().toString().equals("")) {
            Context context = getApplicationContext();
            CharSequence text = "Bitte Text eingeben";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.setGravity(0, 0, 0);
            toast.show();
        }else{//Das hier wird gemacht, wenn schon Text im TextView Feld steht.
            Date currentTime = new Date();
            String editTextValue = ((Wochentag.format(currentTime) + " - " + Datum.format(currentTime) + " - " + (Uhrzeit.format(currentTime)) + ('\n') + et.getText().toString()) + ('\n') + ('\n') + tv.getText().toString());
            tv.setText(editTextValue);
            try {//Der Text wird direkt in der Datei Tagebuch.txt gespeichert.
                String data = tv.getText().toString();
                fos = openFileOutput(Dateiname, Context.MODE_PRIVATE);
                fos.write(data.getBytes());
                fos.close();
            }   catch (FileNotFoundException e) {
                e.printStackTrace();
            }   catch (IOException e) {
                e.printStackTrace();
            }
            et.setText("");
            Context context = getApplicationContext();
            CharSequence text = "Eingabe gespeichert in " + Dateiname;
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.setGravity(0, 0, 0);
            toast.show();
        }
    }

    public void datumUebertragen(View view) {//Das ist der Button mit seiner Funktion, um eine Datei entsprechend einer Eingabe zu laden

        tv.setVisibility(View.VISIBLE);
        String gesDatei = edit_datum.getText().toString() +".txt";
        File file = getBaseContext().getFileStreamPath(gesDatei);
        if (file.exists()) {
            try {//Hier wird die Datei Tagebuch.txt geladen und angezeigt.
                fis = openFileInput(gesDatei);
                byte[] readData = new byte [fis.available()];
                while (fis.read(readData) != -1){
                    collected = new String(readData);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally{
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                tv.setText(collected);

                Context context = getApplicationContext();
                CharSequence text = edit_datum.getText().toString() + ".txt geladen";
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.setGravity(0, 0, 0);
                toast.show();
            }
        }else{
            if(edit_datum.getText().toString().equals("")){
                Context context = getApplicationContext();
                CharSequence text = "Es wurde kein Datum eingegeben";
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.setGravity(0, 0, 0);
                toast.show();
            }else {
            Context context = getApplicationContext();
            CharSequence text = "Datei nicht gefunden";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.setGravity(0, 0, 0);
            toast.show();
            }
        }


        et.setVisibility(View.VISIBLE);
        btnEingabe.setVisibility(View.VISIBLE);

        edit_datum.setVisibility(View.GONE);
        datum_Eingabe.setVisibility(View.GONE);
    }

}

Ziemlich lang und unübersichtlich. Ich habe mir Kommentare dazu geschrieben, damit ich die Übersicht behalten kann. Dabei muss das was ich da geschrieben habe nicht der Wahrheit entsprechen. Vielleicht passiert bei diversen Abschnitten gar nicht das, was ich vermute. Ich verstehe auch noch nicht alles von dem Code, den ich da benutzt. Vieles habe ich mir einfach zusammen gesucht und versucht so anzupassen, dass es meiner Sache dienlich ist. Aber vielleicht hat ja jemand die Motivation sich damit auseinander zu setzen.

Vielen Dank schon mal im Voraus!
 
Zuletzt bearbeitet:
Mal zwei Dinge vorweg:

1. Ganz Generell: Wenn eine Methode/Funktion zwei Aufgaben erledigt, dann splitte sie.
2. Fällt mir auf, dass du häufig den Context ziehst. Deklariere dir den Context einmal innerhalb der Klasse und verweise in onCreate() auf den ApplicationContext. Solche Verweise, oder auch "findViewById"s fressen unnötig Resourcen.

Um auf die Problematik deines Bugs zurück zu kommen:
Wie schon in Punkt 1 erwähnt, rate ich dir dazu, 2 Activitys zu benutzen.

Activity 1:
Schreibe in EditBox das PW
Prüfe mit buttonX_click die Richtigkeit
Wenn richtig, dann starte Activity 2
Code:
Intent i = new Intent(this, Activity2.class);
startActivity(i);
Wenn falsch, mach zb einen Toast
Code:
Toast.makeText(this, "Passwort Falsch", Toast.LENGTH_SHORT).show();

Activity2:
Lade das Menü mit den Optionen

Du sparst dir ein Haufen verwirrendes "setVisible Zeugs", was du in 2 Monaten, wenn du deinen Code begutachtest, nicht mehr kapierst.
Trust me, ich spreche aus Erfahrung ;)

Grüße Flo
 
  • Danke
Reaktionen: Klawifiantix
Da ich scheinbar nur den IQ von getrocknetem Treibholz habe, werde ich nicht darum herum kommen nochmal bei Null anzufangen.
Ich werde mal nach Literatur ausschau halten, damit ich endlich begreife was mir hier vorgeschlagen wird.
Ich weiß nicht wie man eine Funktion/Methode splitte.
Ich weiß nicht wie ich den Context deklarieren soll/kann.
Und ich weiß auch nicht wie ich eine neue Activity erstelle und sie nutzen kann.

Trotzdem danke an Euch alle für die Zeit, die ihr in mich investiert habt. Aber es frustriert mich, dass ihr so viel investiert und ich trotzdem nichts peile.

Naja, bevor man ein Haus baut, sollte man wohl besser wissen was Steine sind^^

Gruß Klawi

Edit: Was meint ihr, dieses Buch könnte doch ein guter Start sein, oder?
 
Zuletzt bearbeitet:
Mach mal ganz langsam ^^

Code:
Ich weiß nicht wie man eine Funktion/Methode splitte.
Mit "splitten" (SemiFachGesimpel von mir) meine ich nichts anderes, als, du sollst keine 2 Aufgaben in einer Methode bearbeiten.

Code:
Ich weiß nicht wie ich den Context deklarieren soll/kann.
du deklarierst ja schon feinsäuberlich deine TextViews und Buttons in deiner onCreate() Methode. Und zuvor machst du sie deiner Klasse mit
Code:
public TextView deinTextView;
und in deiner onCreate() sagst du dann, welches TextView zu welchem Layout gehört.
Code:
deinTextView = (TextView)findViewById(r.id.textView);

das gleiche geht auch mit dem Context:
Code:
public Context context
onCreate()
Code:
context = getApplicationContext();
und diesen context kannst du dann überall in deiner Activity benutzen.

Und ich weiß auch nicht wie ich eine neue Activity erstelle und sie nutzen kann.
In Eclipse:
Im Projektbaum navigierst du zu deiner package, da wo auch schon deine MainActivity steht.
RechtKlick auf Package -> New -> other -> Android Activity -> next
Damit startest du den Wizard mit dem du eine neue Activity erstellst.
Blank Activity -> next ->
jetzt kannst du der Activity einen Name vergeben.
Auserdem kannst du wählen, ob die Activity eine "Launcher Activity" ist. (Ob diese Activity bei App Start geladen werden soll)
Wähle am besten "nein", da du ja schon eine "Launcher Activity" hast.
Fertigstellen

schon hast du eine zweite Activity mit Layout erstellt.

Wie starte ich die zweite Activity aus der ersten Activity?
Activity1:
zum Beispiel in einem Button onClick()

Code:
Intent i = new Intent(this, Activity2.class);
startActivity(i);

"this" gibt den Context an.
"Activity2.class" ist der Name deiner Zweiten Activity.
"startActivity(i)" löst den Start aus.

Ist wirklich nur ein simpler Zweizeiler.

Und wenn du dir wirklich so unsicher bist, dann schau dir auf YouTube ein paar Taschenrechner Tutorials an. Das war für mich der beste Einstieg.

Gruß Flo
 
  • Danke
Reaktionen: Klawifiantix
Klawifiantix schrieb:
Da ich scheinbar nur den IQ von getrocknetem Treibholz habe, werde ich nicht darum herum kommen nochmal bei Null anzufangen.
Quatsch, das ist ganz normal, selbst Profis passiert das wenn sie eine Programmiersprache / Umgebung wie Android neu lernen. Es ist ganz normal, dass man erst dann effizienten und übersichtlichen Code produzieren kann, wenn man halbwegs kapiert hat wie das alles funktioniert. Nur nicht den Mut verlieren :)
 
  • Danke
Reaktionen: Klawifiantix
@ Flocke123
Danke, ich versuche es mal mit den Hilfestellungen, die Du niedergeschrieben hast. Das sollte sogar ich nachvollziehen können!

@ Sentenza
Echt nett von Dir sowas zu schreiben, es hat mir wirklich wieder den Rücken gestärkt. Leider habe ich nur in meiner Freizeit auch Zeit mich mit dem Üben auseinander zu setzen. Aber ich bleibe sicher am Ball, weil mich das Programmieren fasziniert!

Wie ich das mitbekomme wird oft auf Eclipse verwiesen, dummer Weise habe ich mit Android Studio angefangen zu üben. Sollte ich dann besser auf Eclipse umsatteln? Die Unterschiede zwischen beiden scheinen nicht so groß zu sein, aber es wird doch sicher welche geben, nicht wahr?

Gruß
Klawi
 
Zurück
Oben Unten