Toast wird nicht angezeigt

  • Antworten:12
  • Bentwortet
Robbiani Renato
  • Forum-Beiträge: 609

01.01.2020, 17:26:03 via Website

Hallo zusammen

Meine Toasts werden nicht angezeigt. Kann mir Jemand sagen warum?

package ch.robbisoft.sakristanhilfe;

import android.app.DatePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Set;

public class eingabe extends AppCompatActivity {

public static final String APPNAME = "SAKRISTAN";
public static final String FELDNAME = "TEXT";
public static final String DATNAME = "STRDAT";
public static final String DATUM = "dd. MMMM yyyy";
private Context ctx;
private Button btn_speichern;
private TextView edt_datum;
private ListView liste;
private listAdapter adapter;
private List<Eintrag> EintragListe;
private int n_position;
private Button btn_suche;
private Button btn_plus;

private SimpleDateFormat datumsformat;
private AlertDialog.Builder dialog;
private int n_aktpos;
private String str_jetzt;
private Memory speicher;
private Intent param;
private Eintrag inhalt;
private DatePickerDialog dat_dialog;
private Calendar kalender;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_eingabe);
    ctx = getApplication();
    speicher = new Memory(ctx);

    //macht das die Tastatur nicht gliech angezeigt wird
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

    datumsformat = new SimpleDateFormat(DATUM);
    EintragListe = new ArrayList<Eintrag>();
    inital();

    edt_datum = (TextView) findViewById(R.id.edt_datum);
    edt_datum.setText(get_datum());
    edt_datum.setOnClickListener(new TextView.OnClickListener() {
        @Override
        public void onClick(View view) {
            kalender = Calendar.getInstance();
            int n_jahr, n_monat, n_tag;
            n_jahr = kalender.get(Calendar.YEAR);
            n_monat = kalender.get(Calendar.MONTH);
            n_tag = kalender.get(Calendar.DAY_OF_MONTH);
            dat_dialog = new DatePickerDialog(eingabe.this, dat_horcher, n_jahr, n_monat, n_tag);
            dat_dialog.show();
        }
    });

    liste = (ListView) findViewById(R.id.livi_text);
    adapter = new listAdapter(ctx, 0);
    liste.setAdapter(adapter);
    //Liste aufbauen
    adapter.notifyDataSetInvalidated();
    //Klick Ereignisse
    liste.setOnItemLongClickListener(new ListView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            Log.d("sakristanhilfe", "LongClickEreignis");
            //Langes Klicken auf ein Feld in der ListView
            n_aktpos = position;
            clickMinus(position);
            return true;
        }
    });
    liste.setOnItemClickListener(new ListView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Log.d("sakristanhilfe", "ClickEreignis");
            param = new Intent(ctx, work.class);
            n_position = i;
            inhalt = EintragListe.get(n_position);
            param.putExtra("datum", datumsformat.format(inhalt.dat_datum));
            param.putExtra("text", inhalt.str_text);
            startActivityForResult(param, 2);
        }
    });

    btn_speichern = (Button) findViewById(R.id.btn_speichern);
    btn_speichern.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            speicher.save(EintragListe);
            finish();
        }
    });

    btn_suche = (Button) findViewById(R.id.btn_suchen);
    btn_suche.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            datumsformat = new SimpleDateFormat(DATUM);
            try {
                Date such_dat = datumsformat.parse(edt_datum.getText().toString());
                //Datensuchen
                n_position = -1;
                int n_menge = EintragListe.size();
                n_menge--;//weil es bei 0 beginnt
                Eintrag inhalt = new Eintrag();
                inhalt.str_text = getResources().getString(R.string.lbl_kein);
                do{
                    n_position++;
                    inhalt = EintragListe.get(n_position);
                }while ((such_dat.compareTo(inhalt.dat_datum) != 0) && (n_position < n_menge) );
                param = new Intent(ctx, work.class);
                param.putExtra("datum", datumsformat.format(such_dat));
                param.putExtra("text", inhalt.str_text);
                //nur Aufrufen wenn auch was gefunden wurde
                if(n_position < n_menge) {
                    startActivityForResult(param, 4);
                }else{
                    Toast.makeText(ctx, inhalt.str_text, Toast.LENGTH_LONG).show();
                }
            } catch (ParseException e) {
                e.printStackTrace();
                Toast.makeText(ctx, ctx.getResources().getString(R.string.lbl_error) + e.getMessage(), Toast.LENGTH_LONG).show();
            }
        }
    });

    btn_plus = (Button) findViewById(R.id.btn_plus);
    btn_plus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent AufRuf = new Intent(ctx, work.class);
            AufRuf.putExtra("datum", str_jetzt);
            AufRuf.putExtra("text", "");
            startActivityForResult(AufRuf, 1);
        }
    });

    liste.requestFocus();
}

/**********************************************************************************************
 * Zeig einen Löschdialog an
 *
 * @autor robbisoft @version 18. November 2019
 * @param
 * @return
 **********************************************************************************************/
private void clickMinus(int n_pos) {
    try {
        Eintrag pool;
        pool = EintragListe.get(n_pos);
        dialog = new AlertDialog.Builder(eingabe.this);
        dialog.setMessage(getResources().getString(R.string.lbl_delete) + pool.str_text);
        dialog.setPositiveButton(getResources().getString(R.string.lbl_ja), positivListener);
        dialog.setNegativeButton(getResources().getString(R.string.lbl_nein), negativListener);
        dialog.show();
    }catch (Exception  e){
        e.getMessage();
        Toast.makeText(ctx, ctx.getResources().getString(R.string.lbl_error) + e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

DialogInterface.OnClickListener positivListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        EintragListe.remove(n_aktpos);
        adapter.notifyDataSetInvalidated();
        dialogInterface.dismiss();
    }
};

DialogInterface.OnClickListener negativListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        dialogInterface.dismiss();
    }
};

/**********************************************************************************************
 * Nimt die initialisierung des Fensters vor
 *
 * @autor robbisoft @version 9. Februar 2019
 * @param
 * @return
 **********************************************************************************************/
private void inital(){
    Date jetzt;
    Calendar zeitstempel = Calendar.getInstance();
    jetzt = zeitstempel.getTime();
    str_jetzt = datumsformat.format(jetzt);
    //Laden der Liste
    EintragListe = speicher.load();
}

/**********************************************************************************************
 * Ermittelt das aktuelle Datum und gibt es als String zurück
 *
 * @autor robbisoft @version 2.02.2019
 * @param
 * @return aktuelles Datum als String
 **********************************************************************************************/
private String get_datum(){
    String d_jetzt;

    //Zeitermitteln und ausgeben
    Calendar zeitstempel = Calendar.getInstance();
    SimpleDateFormat datumsformat = new SimpleDateFormat("d. MMMM yyyy");
    d_jetzt = datumsformat.format(zeitstempel.getTime());

    return d_jetzt;
}

/**********************************************************************************************
 * Legt einen Eintrag in den Speicher
 *
 * @autor robbisoft @version 13.02.2019
 * @param "String zum Speichern"
 * @return
 **********************************************************************************************/
private void speichern(List<String> d_datum, List<String> str_text){
    SharedPreferences pref = getSharedPreferences(APPNAME, 0);
    SharedPreferences.Editor edit = pref.edit();
    edit.putStringSet(DATNAME, (Set<String>;) d_datum);
    edit.putStringSet(FELDNAME, (Set<String>;) str_text);
    edit.commit();
}

/**********************************************************************************************
 * Liest einen Eintrag aus dem Speicher
 *
 * @autor robbisoft @version 10.02.2019
 * @param "String zum Speichern"
 * @return
 **********************************************************************************************/
private List<String> lesen(){
    List<String> str_text;
    SharedPreferences pref = getSharedPreferences(APPNAME, 0);

// str_text = pref.getString(FELDNAME, "Fehler");
str_text = (List) pref.getStringSet(FELDNAME, null);
return str_text;
}

/**********************************************************************************************
 * Adapter um die Besonderheiten einzugeben
 *
 * @autor robbisoft @version 6. November 2019
 * @param "Liste der Besonderheitn"
 * @return
 **********************************************************************************************/
class listAdapter extends  ArrayAdapter<Eintrag>{

    private SimpleDateFormat dataformat;

    public listAdapter( Context context, int resource) {
        super(context, resource);
        dataformat = new SimpleDateFormat(DATUM);
    }

    @Override
    public int getCount(){
        int n_anzahl = EintragListe.size();
        return n_anzahl;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView==null){
            convertView = getLayoutInflater().inflate(R.layout.list_element, null);
        }
        Eintrag eintrag;
        eintrag = EintragListe.get(position);

        TextView datum = (TextView) convertView.findViewById(R.id.edt_datum);
        datum.setText(dataformat.format(eintrag.dat_datum));

        TextView text = (TextView) convertView.findViewById(R.id.edt_text);
        text.setText(eintrag.str_text);

        return convertView;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try{
        switch(requestCode) {
            case 1: {
                //bei 9 wurde der Abbrechenbutton gedrückt
                if(resultCode != 9) {
                    String str_datum, str_text;
                    str_datum = data.getStringExtra("datum");
                    str_text = data.getStringExtra("text");
                    Eintrag in = new Eintrag();
                    in.dat_datum = datumsformat.parse(str_datum);
                    in.str_text = str_text;
                    EintragListe.add(in);
                    //Liste aufbauen
                    adapter.notifyDataSetInvalidated();
                    return;
                }
            }
            case 2: {
                //bei 9 wurde der Abbrechenbutten gedrückt
                if(resultCode != 9) {
                    String str_datum, str_text;
                    str_datum = data.getStringExtra("datum");
                    str_text = data.getStringExtra("text");
                    EintragListe.get(n_position).dat_datum = datumsformat.parse(str_datum);
                    EintragListe.get(n_position).str_text = str_text;
                    //Liste aufbauen
                    adapter.notifyDataSetInvalidated();
                    return;
                }
            }
            case 4:{
                //bei 9 wurde der Abbrechenbutten gedrückt
                if(resultCode != 9) {
                    String str_datum, str_text;
                    str_datum = data.getStringExtra("datum");
                    str_text = data.getStringExtra("text");
                    EintragListe.get(n_position).dat_datum = datumsformat.parse(str_datum);
                    EintragListe.get(n_position).str_text = str_text;
                    //Liste aufbauen
                    adapter.notifyDataSetInvalidated();
                    return;
                }
            }
        }
    } catch (ParseException e) {
            e.printStackTrace();
            Toast.makeText(ctx, ctx.getResources().getString(R.string.lbl_error) + e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

private DatePickerDialog.OnDateSetListener dat_horcher = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker datePicker, int n_jahr, int n_monat, int n_tag) {
        datumsformat = new SimpleDateFormat("d.MM.yyyy");
        try {
            Date datum = datumsformat.parse(Integer.toString(n_tag) + "." + Integer.toString(n_monat + 1) + "." + Integer.toString(n_jahr) );
            datumsformat = new SimpleDateFormat(DATUM);
            edt_datum.setText(datumsformat.format(datum));
        } catch (ParseException e) {
            e.printStackTrace();
            Toast.makeText(ctx, ctx.getResources().getString(R.string.lbl_error) + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
};

}

Gruss Renato

Kommentieren
Beste Antwort
Robbiani Renato
  • Forum-Beiträge: 609

02.01.2020, 20:54:09 via Website

Ich konnte das Problem lösen.

Ich musste auf meinem Handy unter Einstellungen Applikationsverwaltung die Benachrichtigungen bei meiner App einschalten und dann werden die Meldungen angezeigt.

Warum dies bei dieser App ausgeschaltet war habe ich keine Ahnung. Vielleicht Jemand Rat?

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.529

01.01.2020, 17:49:05 via Website

Hallo erstmal ein gutes neues Jahr.

Habe den Code nur überflogen.
Du machst nur einen Toast wenn ein Fehler entsteht im Catch Block.
Wahrscheinlich gibt es keine Fehler und du kommst nicht in den Catch teil.

PS.
Der Catch Blog wird nur aufgerufen wenn etwas beim Parsen schief geht.
Schief meine ich wenn es nicht geparst werden kann.

Ob du das richtige geparst hast wird nicht überprüft. Dafür bist du selber verantwortlich.

— geändert am 01.01.2020, 18:02:48

Hilfreich?
Pascal P.
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

01.01.2020, 18:25:50 via Website

Ciao Jokel

Dir ebenfalls ein gutes neues Jahr.
Ich habe mit dem Debugger geprüft. Er kommt in den catch Block. Aber ich habe auch anderen Code wo er im else Teil ein Toast ausführt aber nichts anzeigt.

if(n_position < n_menge) {
                    startActivityForResult(param, 4);
                }else{
                    Toast.makeText(ctx, inhalt.str_text, Toast.LENGTH_LONG).show();
                }

Da habe ich getestet. Da kommt er je nach Fall durch. Aber gezeigt wird nichts.
Warum nur?

Gruss Renato

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.01.2020, 18:30:57 via Website

Du hast aus der Verganhenheit wohl nicht gelernt ;)

Wie schon öfters bei Dialogen oder View Objekten nimmst du den falsche Context.

Dein ctx ist ctx = getApplication(); Das ist aber der Application Context und nicht der ActivityContext der für View bzw. Toast benutzt werden kann.

Du solltest für deinen Toast den ActivityContext nehemen also ctx = this; oder so.
Dann sollte das auch funktionieren.

Siehe: https://stackoverflow.com/a/10347346
Vielleicht solltest du dir das für die Zukunft merken, der Fehler scheint bei dir oft vor zu kommen ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Jokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.529

01.01.2020, 18:31:13 via Website

Als Empfehlung benutze zwei SDF Variablen.
Und überschreibe nicht immer deine „datumsformat“ Variable mit einen neuen Format.
Da kommst du schnell durcheinander vor allen wenn da noch ein Listner o. Callback Methode im flachen Moment dazwischen kommt.

Hilfreich?
Pascal P.
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

01.01.2020, 18:43:13 via Website

Ciao Jokel

Danke für deine Tipps. Da hast du Recht ich verwechsle das immer.
Als ich muss den Activity context verwenden. Ich versuch es mal.

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.529

01.01.2020, 18:58:14 via Website

lese den Link von Pascal

Hilfreich?
Pascal P.
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

02.01.2020, 10:54:40 via Website

Ciao Jokel

Danke für die Hilfe. In einem hast du nicht ganz Recht. Ich habe ein Beispiel gemacht. Da wird der Toast wird angezeigt egal ob ich den Activity-Context oder den Application-Context verwende. Einfach die Darstellung ändert sich ein wenig. Aber ansonsten wird der Toast angezeigt.

Aber das Problem liegt nicht in diesem Bereich. Denn in meiner App werden die Toast noch immer nicht angezeigt. Weiss der Geier warum!

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.529

02.01.2020, 11:48:21 via Website

Es kommt immer darauf an wo du dich gerade befindest. Welchen context du brauchst.

Ja in deinem Fall sollten beide Kontexte gehn, eigentlich müsste this reichen.

Denn du bist in einer Ativity und in einem Listner deiner Button.

So wichtig wäre jetzt erst mal zu wissen wo an welcher Stelle der Toast nicht kommt.
Wird denn wirklich ein Fehler geworfen und du kommst in den Catch.
Setze doch statt Toast auch ein Log.
Beobachte in Logcat was passiert.

Bei deinem Beispiel wäre auch interessant wie das if ausfällt und ob du überhaupt in den else zweig kommst?

— geändert am 02.01.2020, 14:52:22

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

02.01.2020, 18:06:13 via Website

Fehler finde ich keinen. Die else Schlaufe wird durchlaufen aber der Toast wird nicht angezeigt.

Das einzige was andauernd erscheint ist der folgende Eintrag:

E/ViewRootImpl: sendUserActionEvent() mView == null

Aber ich habe mal Dr. Google befragt und der meint, dass dies kein wichtiger Fehler ist.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.529

02.01.2020, 18:31:53 via Website

Ist den in der variablen „inhalt.str_text“ überhaupt ein Inhalt drin oder ist der Null?
Schreibe das mal in einen String und gib diesen aus. Oder setze einen Breakpoint drauf.
Wenn man nicht sicher ist ob ein wert richtig zurück geben wird sollte man immer eine Variable benutzen und die im Debugger testen.
Dann siehst du on da gültige Daten zum anzeigen enthalten sind.

Oder gib einfach mal einen Text aus an der stelle dann weist du zumindest ob der Context richtig ist.

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

02.01.2020, 20:27:52 via Website

Ich habe eine Fehlermeldung erhalten.

1-02 20:23:56.322 807-1528/? E/NotificationService: Suppressing toast from package ch.robbisoft.sakristanhilfe by user request.

Mal schauen ob ich im Netz was finde.

Hilfreich?
Kommentieren
Beste Antwort
Robbiani Renato
  • Forum-Beiträge: 609

02.01.2020, 20:54:09 via Website

Ich konnte das Problem lösen.

Ich musste auf meinem Handy unter Einstellungen Applikationsverwaltung die Benachrichtigungen bei meiner App einschalten und dann werden die Meldungen angezeigt.

Warum dies bei dieser App ausgeschaltet war habe ich keine Ahnung. Vielleicht Jemand Rat?

Gruss Renato

Hilfreich?
Kommentieren