Daten in Fragmenten anzeigen

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

07.07.2019, 11:35:08 via Website

Hallo zusammen

Ich bastle eine App mit Fragmenten. In den Fragmenten möchte ich Daten anzeigen. Aber ich kriege es einfach nicht hin. Ich habe bereits einiges ausprobiert aber entweder stürzt die App ab oder es wird nichts angezeigt. Dies ist sehr ärgerlich. Ich stelle mal mein Code hin, vielleicht sieht jemand was ich falsch mache.

MainActivity

package ch.robbisoft.sun_app;

import android.app.DatePickerDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.design.widget.TabLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.DatePicker;
import android.widget.EditText;
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 static android.Manifest.permission.*;

public class Main extends AppCompatActivity
implements Frag_Sonne.OnFragmentInteractionListener,
Frag_Astro.OnFragmentInteractionListener,
Frag_Mond.OnFragmentInteractionListener{

public static final String APP = "SONNE";
String[] rechte = new String[]{
        ACCESS_NETWORK_STATE,
        ACCESS_COARSE_LOCATION,
        ACCESS_FINE_LOCATION
};

private Context ctx;
private String str_text;
public static final int MULTIPLE_PERMISSIONS = 99;
private EditText txt_lang;
private EditText txt_breit;
private EditText txt_hoch;
private EditText txt_datum;
private EditText txt_zone;
private TabLayout tabulator;
private Fragment fragment = null;
private Date datum;
private Calendar kalender;
private DatePickerDialog datumdialog;
private DatePickerDialog.OnDateSetListener listener;
private LocationManager posmanager;
private LocationListener horcher;

private Double b_breite = (double) 0;
private Double b_laenge = (double) 0;
private String str_datum = "";

public Integer getN_zone() {
    return n_zone;
}

public void setN_zone(Integer n_zone) {
    this.n_zone = n_zone;
}

private Integer n_zone;

public Double getB_breite() {
    return b_breite;
}

public void setB_breite(Double b_breite) {
    this.b_breite = b_breite;
}

public Double getB_laenge() {
    return b_laenge;
}

public void setB_laenge(Double b_laenge) {
    this.b_laenge = b_laenge;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ctx = getApplicationContext();
    //Verhindert dass eine Tastatur angezeigt wird
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

    txt_lang = findViewById(R.id.edt_lang);
    txt_breit = findViewById(R.id.edt_breit);
    txt_hoch = findViewById(R.id.edt_hoch);
    txt_datum = findViewById(R.id.edt_datum);
    txt_zone = findViewById(R.id.edt_zone);

    //Tabulatoren aufbauen
    tabulator = (TabLayout) findViewById(R.id.tab_anzeige);
    TabLayout.Tab tab_sonne = tabulator.newTab();
    tab_sonne.setText(getResources().getString(R.string.lbl_sonne));

// tab_sonne.setIcon();
TabLayout.Tab tab_astro = tabulator.newTab();
tab_astro.setText(getResources().getString(R.string.lbl_astro));
// tab_astro.setIcon();
TabLayout.Tab tab_mond = tabulator.newTab();
tab_mond.setText(getResources().getString(R.string.lbl_mond));
// tab_mond.setIcon();
tabulator.addTab(tab_sonne, true);
tabulator.addTab(tab_astro);
tabulator.addTab(tab_mond);
//Den richtigen Tab öffnen
tabulator.addOnTabSelectedListener((new TabLayout.BaseOnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//Selektieren der richtigen Seite
switch (tab.getPosition()){
case 0 : fragment = new Frag_Sonne();
break;
case 1 : fragment = new Frag_Astro();
break;
case 2 : fragment = new Frag_Mond();
break;
}
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.simpleFrameLayout, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    }));
    //erste seite anzeigen
    fragment = new Frag_Sonne();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.simpleFrameLayout, fragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commit();
    //Aktuelles Datum anzeigen
    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
    kalender = Calendar.getInstance();
    datum = kalender.getTime();
    str_datum = sdf.format(datum);
    txt_datum.setText(str_datum);
    //Beim anklicken Datumsdialog anzeigen
    listener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
            //gewähltes Datum setzen
            SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
            kalender.set(year, month, dayOfMonth);
            Date datum = kalender.getTime();
            str_datum = sdf.format(datum);
            txt_datum.setText(str_datum);
        }
    };
    txt_datum.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            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);
            v.setFocusable(false);

            datumdialog = new DatePickerDialog(Main.this, listener, n_jahr, n_monat, n_tag);
            datumdialog.show();
        }
    });

    //prüft ob OS Version > 6 ist, denn vorher kann nicht geprüft werden
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        //prüfen ob Rechte vorhanden sind um auf die GPS Daten zu zugreifen
        if (pruefrechte()) {
            str_text = getResources().getString(R.string.lbl_start_neu);
            Toast.makeText(ctx, str_text, Toast.LENGTH_SHORT).show();
            initial();

        } else {
        }
    }else{
        str_text = getResources().getString(R.string.lbl_start_alt);
        Toast.makeText(ctx, str_text, Toast.LENGTH_SHORT).show();
        initial();
    }
}

/**********************************************************************************************
* Ermittelt die Posiotn
*
* @author robbisoft @since 2. Juni 2019
* @param
* @return
**********************************************************************************************/
private void position(){
    posmanager = (LocationManager) getSystemService(LOCATION_SERVICE);
    horcher = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            Double lang = location.getLongitude();
            Double breit = location.getLatitude();
            Double hoch = (double) 0;
            if( location.hasAltitude() )
                hoch = location.getAltitude();

            setB_breite( breit );
            setB_laenge( lang );
            int zone = Sun_calculator.zeitzone(lang);
            setN_zone( zone );

            txt_lang.setText(lang.toString());
            txt_breit.setText(breit.toString());
            txt_hoch.setText(hoch.toString());
            txt_zone.setText(Integer.toString(zone));
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };
    //ungenau möchte noch mit den Optionen verbinden

// posmanager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, (LocationListener) ctx);
//genau
posmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, (LocationListener) horcher);
}

/**********************************************************************************************
* Ermittelt die Position, berechnet die Daten und stellt die ergebnisse dar
*
* @author robbisoft @since 2. Juni 2019
* @param
* @return
**********************************************************************************************/
private void initial(){
    //Gespeicherte Position lesen damit sofort was angezeigt wird
    lese_daten();
    Double b_breit = getB_breite();
    Double b_lang = getB_laenge();
    txt_breit.setText(b_breit.toString());
    txt_lang.setText(b_lang.toString());
    n_zone = Sun_calculator.zeitzone(b_lang);
    txt_zone.setText(Integer.toString(n_zone));
    //Position ermitteln
    position();
    //Daten Berechnen und Werte Anzeigen

// rechne(b_breit, b_lang, datum);
//Parameter übergeben
String str_breit, str_lang;
str_breit = Double.toString(b_breit);
str_lang = Double.toString(b_lang);
Bundle daten = new Bundle();
daten.putString("BREITE", str_breit);
daten.putString("LÄNGE", str_lang);
daten.putString("DATUM", str_datum);
daten.putString("ZONE", Integer.toString(n_zone));
fragment.setArguments(daten);
}

/**********************************************************************************************
* Prüft die Rechte der App
*
* @author robbisoft @since 7. Juni 2019
* @param
* @return
**********************************************************************************************/
private boolean pruefrechte(){
    int result;
    List listPermissionsNeeded = new ArrayList<>();
    for (String p:rechte)
    {
        result = ContextCompat.checkSelfPermission(this,p);
        if (result != PackageManager.PERMISSION_GRANTED)
        {
            listPermissionsNeeded.add(p);
        }
    }
    if (!listPermissionsNeeded.isEmpty())
    {
        ActivityCompat.requestPermissions(this, (String[]) listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),MULTIPLE_PERMISSIONS );
        // keine permissions gesetzt
        return false;
    }
    // alle permissions gesetzt
    return true;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case MULTIPLE_PERMISSIONS:
        {
            if (grantResults.length > 0)
            {
                String permissionsDenied = "";
                for (String per : permissions)
                {
                    if(grantResults[0] == PackageManager.PERMISSION_DENIED)
                    {
                        permissionsDenied += "\n" + per;
                    }
                }
                // Nach dem ersten Male
            }
            return;
        }
    }
}

@Override
public void onFragmentInteraction(Uri uri) {

}

@Override
public void onFragSelectet(int position) {
    Frag_Sonne frag_sonne = (Frag_Sonne)
            getSupportFragmentManager().findFragmentById(R.id.txt_dam_begin_wert);
    if(frag_sonne != null){
        frag_sonne.update_sonne( position );
    }else{

    }
}

@Override
public void onPointerCaptureChanged(boolean hasCapture) {

}

@Override
protected void onDestroy() {
    super.onDestroy();

    double breit, lang;
    breit = getB_breite();
    lang = getB_laenge();
    schreibe_daten(breit, lang);
}

/**********************************************************************************************
* Liest die Daten aus dem Speicher
*
* @author robbisoft @since 8. Juni 2019
* @param
* @return
**********************************************************************************************/
private void lese_daten(){
    float breit, lang;
    SharedPreferences pref = getSharedPreferences(APP, 0);
    breit = pref.getFloat("BREIT", 0);
    setB_breite((double) breit);
    lang = pref.getFloat("LANG", 0);
    setB_laenge((double) lang);
}

/**********************************************************************************************
* Schreibt die Daten in den Speicher
*
* @author robbisoft @since 8. Juni 2019
* @param 'Länge und Breite der aktuellen Position
* @return
**********************************************************************************************/
private void schreibe_daten(double breit, double lang){
    SharedPreferences pref = getSharedPreferences(APP, 0);
    SharedPreferences.Editor edit = pref.edit();
    edit.putFloat("BREIT", (float) breit);
    edit.putFloat("LANG", (float) lang);
    edit.commit();
}

/**********************************************************************************************
*
*
* @author robbisoft  @since 11. Juni 2019
* @param 'Breitengrad der Position
* @param 'Längengrad der Position
* @param 'Datum zum Berechnen
* @return
* @exception
* @throws
**********************************************************************************************/
private void rechne(Double breit, Double lang, Date datum){
    int zone = 0;
    String str_aufgang;

    try {
        Sun_calculator sun = new Sun_calculator();
        zone = sun.zeitzone(lang);
        sun.berechne(breit, lang, datum, zone);
        txt_zone.setText(Integer.toString(zone));
        str_aufgang = sun.getSonnenAufgang();
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

@Override
public void onAttachFragment(Fragment fragment) {
    super.onAttachFragment(fragment);
    if (fragment instanceof Frag_Sonne) {
        Frag_Sonne frag = (Frag_Sonne) fragment;
        frag.setOnFragmentInteractionListener(this);
    }

}

@Override
protected void onStart() {
    super.onStart();
}

}

Das erste Fragment:

package ch.robbisoft.sun_app;

import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link Frag_Sonne.OnFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link Frag_Sonne#newInstance} factory method to
* create an instance of this fragment.
*/
public class Frag_Sonne extends Fragment {
OnFragmentInteractionListener callback;
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "BREITE";
private static final String ARG_PARAM2 = "LÄNGE";
private static final String ARG_PARAM3 = "DATUM";
private static final String ARG_PARAM4 = "ZONE";

private TextView txt_dam_begin;
private TextView txt_sonne_auf;
private TextView txt_sonne_unter;
private TextView txt_dam_ende;
private TextView txt_tag_lang;

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private String mParam3;
private String mParam4;

private Double b_breit;
private Double b_lang;
private Date datum;
private Integer n_zone;

private OnFragmentInteractionListener mListener;

public Frag_Sonne() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Breite der Position.
 * @param param2 Länge der Position.
 * @param param3 Datum für die Berechnungen
 * @return A new instance of fragment Frag_Sonne.
 */
// TODO: Rename and change types and number of parameters
public static Frag_Sonne newInstance(String param1, String param2, String param3, String param4) {
    Frag_Sonne fragment = new Frag_Sonne();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    args.putString(ARG_PARAM3, param3);
    args.putString(ARG_PARAM4, param4);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
        mParam3 = getArguments().getString(ARG_PARAM3);
        mParam4 = getArguments().getString(ARG_PARAM4);
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        b_breit = Double.parseDouble(mParam1);
        b_lang = Double.parseDouble(mParam2);
        n_zone = Integer.parseInt(mParam4);
        try {
            datum = sdf.parse(mParam3);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_frag_sonne, container, false);

    txt_dam_begin = rootView.findViewById(R.id.txt_dam_begin_wert);
    txt_sonne_auf = rootView.findViewById(R.id.txt_aufgang_wert);
    txt_sonne_unter = rootView.findViewById(R.id.txt_untergang_wert);
    txt_dam_ende = rootView.findViewById(R.id.txt_dam_end_wert);
    txt_tag_lang = rootView.findViewById(R.id.txt_lang_wert);

     return rootView;
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

public void setOnFragmentInteractionListener( OnFragmentInteractionListener callback){
    this.callback = callback;
}

/**
 * This interface must be implemented by activities that contain this
 * fragment to allow an interaction in this fragment to be communicated
 * to the activity and potentially other fragments contained in that
 * activity.
 * <p>
 * See the Android Training lesson <a href=
 * "http://developer.android.com/training/basics/fragments/communicating.html"
 * >Communicating with Other Fragments</a> for more information.
 */
public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
    public void onFragSelectet(int position);

}

public void update_sonne(int position){
    //Daten berechnen
    try {
        Sun_calculator sun = new Sun_calculator();
        sun.berechne(b_breit, b_lang, datum, n_zone);
        txt_dam_begin.setText(sun.getDammerungBegin());
        txt_sonne_auf.setText(sun.getSonnenAufgang());
        txt_sonne_unter.setText(sun.getSonnenUntergang());
        txt_dam_ende.setText(sun.getDammerungEnde());
        txt_tag_lang.setText(sun.getTagesLange());
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

}

Ich danke für alle Tips und Hinweise.

Gruss Renato

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

17.07.2019, 21:34:42 via Website

Ja einfach nochmal Übergeben. nachdem du auf einen der Button geklickt hast.
Da du scheinbar deinen eigenen Code nicht versteht hier etwas Hilfe

@Override
public void onTabSelected(TabLayout.Tab tab) {
//Selektieren der richtigen Seite
switch (tab.getPosition()){
case 0 : fragment = new Frag_Sonne();
break;
case 1 : fragment = new Frag_Astro();
break;
case 2 : fragment = new Frag_Mond();
break;
}
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
initial();
ft.replace(R.id.simpleFrameLayout, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}

Wie ich schon sagte ist das mit dem Interfase etwas sinnlos. Oder Besser Falsch. Denn du willst ja sicherlich wenn sich die Position ändert ohne das du erneut den Button klickst sich die anzeige ändert. Das geht mit dem Interface wie du es hast nicht.
Denn das ist ein Interfase um vom Fragment auf die Activity zu zugreifen. Nicht anders rum. Was du eigentlich brauchst.
Eigentlich brauchst du das auch nicht denn im Fragment macht du eine Public Anzeige Methode die hast du ja schon nur nicht public und du kannst wenn sich die Position geändert hat darauf zugreifen.
Nur solltest du auch immer vorher prüfen ob auch das Fragment angezeigt wird nicht das du die Methode aufrufst wenn du in einen anderen Fragment bist.

Code dazu hast du schon hast auch schon gefragt was das mit der ID Ist
@Override
public void onFragSelectet(int position) {
Frag_Sonne frag_sonne = (Frag_Sonne)
getSupportFragmentManager().findFragmentById(R.id.txt_dam_begin_wert);
if(frag_sonne != null){
frag_sonne.update_sonne( position );
}else{

}

}

Die ID ist die deines Fragment layouts ist das Layout geladen also das Fragment sichtbar sollte true zurück kommen.
Nur musstest du das in dem Listner ausführen wenn sich die Position ändert.

— geändert am 17.07.2019, 21:37:07

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

07.07.2019, 15:33:57 via Website

Ohne expliziten Fehler kann ich auch nur raten.
Bitte die entsprechende Exception auch Posten und i.d.r nur die Relevanten Codeauschnitte.
Dein Codestil ist etwas gewöhnungsbedürftig.

Ansonsten: Wie immer: Genauer beschreiben, was tut, was tut nicht, wo tritt der Fehler auf etc.

Du bist jetzt lange genug dabei um zu wissen, dass solche Informationen immer benötigt werden.

Vielleicht hilft die auch eine Strukturierung in Daten (Model) und Activity.
Dann ist die Datenstruktur wenigstens klar und lesbar definiert..

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

Hilfreich?
swa00
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

07.07.2019, 16:28:53 via Website

Hallo ja auch ich kann mir aus deinem Code nicht allzu viel nehmen.
So mal du ja keine Beschreibung deines Fehlers gibst. Und wir wieder mal etwas raten müssen.

Ich vermute mal es liegt an deinem Interface und deiner Update Methode „update_sonne“ im Fragment.

Wenn in die Klasse Sun_calculator richtig läuft und auch sinnvolle werte zurückgibt sollte eine Ausgabe eigentlich gehen.
Test mal in dem du einfach Hardcoded Strings ausgibst werden die angeteigt werden, wird es wohl in der Klasse liegen.

Oder dein Interface und die uptate Methode funktionieren nicht richtig. Bin mir bei deinen Interface Aufbau da nicht so ganz sicher ob das so richtig ist.

So jetzt wäre es Zeit uns mal etwas Infos zu geben.

— geändert am 07.07.2019, 16:37:10

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

07.07.2019, 18:04:14 via Website

Herzlichen Dank für eure Hilfe. Mit einer Fehlermeldung kann ich nicht dienen. Das App läuft tut aber nichts oder nichts sinfolles.

Also ich versuche es mal kurz zusammen zufassen.
In der MainAvitity versuche ich mit der folgenden Methode die Daten in dem Fragment an zu zeigen:

 @Override
public void onFragSelectet(int position) {
    Frag_Sonne frag_sonne = (Frag_Sonne)
            getSupportFragmentManager().findFragmentById(R.id.txt_dam_begin_wert);
    if(frag_sonne != null){
        frag_sonne.update_sonne( position );
    }else{

    }
}

Da gibt es einiges das mir komisch vor kommt. Zum Beispiel "findFragmentById" Zeigt auf ein EditView und nicht auf das Fragment. Aber das Fragment wird nicht gefunden.
Der Parameter position. Wo zu dient er. Für mich nicht logisch.

Die Methode im Fragment lautet wie folgt:

public void update_sonne(int position){
    //Daten berechnen
    try {
        Sun_calculator sun = new Sun_calculator();
        sun.berechne(b_breit, b_lang, datum, n_zone);
        txt_dam_begin.setText(sun.getDammerungBegin());
        txt_sonne_auf.setText(sun.getSonnenAufgang());
        txt_sonne_unter.setText(sun.getSonnenUntergang());
        txt_dam_ende.setText(sun.getDammerungEnde());
        txt_tag_lang.setText(sun.getTagesLange());
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

Gibt es einen Beispielcode von einem funktionierenden Fragmentaufruf? Vielleicht ist das der einfachere Weg.

Gruss Renato

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

07.07.2019, 18:17:02 via Website

Was ist eigentlich der Grund warum du von der Activity aus auf das Fragment zugreifen willst?
Wenn das Fragment sichtbar ist kannst du doch dort auch deine werte holen und anzeigen. Wozu must du die anzeige Methode aus der activity aufrufen und nicht wie üblich in dem Fragment mit einem Button im Fragment zB.
Eine erste anzeige kannst du in der OnActivityCreated machen habe ich auch schon mal gesagt.

https://android.i-visionblog.com/android-fragments-life-cycle-612e85c047dd

Beantworte bitte erstmal meine Frage sonnst kann ich dir nicht helfen.

— geändert am 07.07.2019, 18:30:41

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

07.07.2019, 18:42:43 via Website

Frage mich auch warum du dein Fragment als Singelton machst?

public static Frag_Sonne newInstance(String param1, String param2, String param3, String param4) {

Erkläre uns das erstmal bevor wir dir helfen können.

Für mich macht das absolut keinen Sinn.
Du willst doch nur wenn auf den Tab Reiter geklickt wird das Fragment angezeigt wird mit den aktuellen daten für Sonnenauf und Untergang. Wozu dann der ganze interface und Singelton gram?

Wer oder was Ruft eigentlich den Kostrucktor des Fragment auf?
Ein Kostrucktor im Fragment ist für mich Unsinn.
Wie sieht die Kasse „Sun_calculator“ aus ?
Aus der du die Infos wohl bekommst, brauch die etwas diesen singelton ?
Auch unsinnig ist das du die Klasse Sun_calulator in der Activity ohne einer Instanz benutzt.
n_zone = Sun_calculator.zeitzone(b_lang);

Wenn das eine static Kasse ist wieso dann doch eine Instanz in deiner Updat Methode vom Fragment?

PS.
Auch das übergeben der anfangs daten mit dem Bundle „setArguments(daten)“
In deine Initial Methode wird nicht gehen den zu dem Zeitpunkt hast du das commit schon gemacht
Du sendest somit absolut keine Daten an das Fragment.
Somit wird auch dein Klasse Sun_calculator nichts sinnvolles machen, da sie keine anfangs werte hat.

So denke das sind erstmal genug Fehler. Sind bestimmt noch mehr.

Dein ganzen interface gram kann ich nicht nach vollziehen sehe da auch keinen sein drin. In deinem Anwendung fall.

— geändert am 07.07.2019, 20:13:03

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

07.07.2019, 19:47:46 via App

@Jockel man hat zwar eine statische Methode zum erstellen, dadurch wird es aber kein Singleton.
Es kann trotzdem mehrere Instanzen geben.
Und ich hab das auch so gemacht, damit rufende Klassen die Parameter Strings fürs Bundle nicht kennen müssen.

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

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

07.07.2019, 20:16:47 via Website

@Pascal ja ok
nur wo Ruft er denn?
der Konstrucktor wird in seinem Code nicht benutzt.

 @Override
public void onFragSelectet(int position) {
    Frag_Sonne frag_sonne = (Frag_Sonne)
            getSupportFragmentManager().findFragmentById(R.id.txt_dam_begin_wert);
    if(frag_sonne != null){
        frag_sonne.update_sonne( position );
    }else{

    }
}

das als Interface Methode in der activity Übergibt keine Parameter.

Und auch wenn er hier den Konstruktor benutzt bringt das auch nichts da die onCreate schon vorbei ist.
und somit die vermeidlichen Parameter ins lehre gehen.

wie ich ja auch schon sagte findet keine Parameter Übergabe nicht statt auch nicht durch das Bundle.

Das ganze sieht aus als hätte er sich das alles zusammen gesucht und nicht verstanden.

In seinem fall, er will ja nur eine Anzeige der Daten machen und beim Aufruf des Fragment die in Bundle befindlichen Parameter benutzen. Nur sind da keine daten im Bunde beim Fragment start.

Und die der Berechnung Klasse geben. Wozu da ein Interface? Übergeben von Daten während der Laufzeit des Fragment von der Activity aus glaube das ist nicht sein Ziel.
und wen ja dann müsste das auch alles in das Interface. dann müste das Interface auch daten übertragen was es nicht tut.

— geändert am 07.07.2019, 21:39:57

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

08.07.2019, 12:09:49 via Website

Ciao Jokel

Du hast mein Problem erkant. Ich habe den Code aus verschiedenen Quellen zusammen gesucht. Jeder macht es ein bischen anders. Aber auf eine funktionsfähiges Beispiel wo ich verstehe bin ich bisher noch nicht gestossen. Aus der Not habe ich einiges ausprobiert. Nun drehe ich mich im Kreis.

Doch in einem irrst du dich. Denn im OnCreate werden die Parameter übergeben. Dies funktioniert.
Im OnCreateView kann ich die Daten berechnen und anzeigen. Aber das funktioniert nur einmal. Wenn ich das Fragment verlasse und wieder zurückkomme, greift das Programm ins lehre.

Wo muss ich die Daten berechnen und anzeigen damit es funktioniert?

Gruss Renato

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

08.07.2019, 12:23:23 via Website

Renato :

Im OnCreateView kann ich die Daten berechnen und anzeigen. Aber das funktioniert nur einmal. Wenn ich das Fragment verlasse und wieder zurückkomme, greift das Programm ins lehre.
Wo muss ich die Daten berechnen und anzeigen damit es funktioniert?

OnCreateView kommt auch nur dann , wenn das System es auch benötigt und nicht jedes Mal.

Baue dir einfach eine separate Singleton mit z.b. Getter & Setter oder public Variablen.
Nimm dir eine Instanz davon in deiner MainActivity und tausche in deinen Fragmenten über diese SingelTon deine Daten aus.

Oder schick Dir Broadcasts durch die Gegend - die Aldi Version - allerdings mit Trigger.

— geändert am 08.07.2019, 12:39:15

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Pascal P.
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

08.07.2019, 17:27:25 via Website

Hallo

doch in einem irrst du dich. Denn im OnCreate werden die Parameter übergeben.

Richtig die Parameter übergabebe findet in der onCreate statt stimmt, nur kommen da beim wechsel und tauch der Fagmentns keine Parameter an es weden keine übergeben denn der commit ist schon zu ende. Und die onCreate ist schon durchgelaufen. Ohne das du der Transaktion die werte vor dem commit Übergeben hast.

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.simpleFrameLayout, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();

das ist keine Übergabe der Parameter.
Deine Init Methode wo du die Parameter übergibst um sie in der onCraate auszulesen ist da nicht zu sehen weder beim ersten Aufruf noch zwischen durch deshalb geht es schon mal nicht. Auch in deinem Interface werden keine Daten übergeben deshalb kommt auch keine Anzeige hoffe das du es nun verstanden hast.

Somit habe ich nicht nun recht.

Das mit singelton und so weiter würde ich lassen ist für dich noch zu schwer. Und auch nicht notwendig.
So jetzt hätte ich doch ganz gernne gewusst warum du eine Übergabe der Parameter von der Activity zum Fragment wärend der Laufzeit des Fragment mittels Interface brauchst?

Es reicht doch wenn du vor dem Commit der Transaktion die werde im Bundle speicherst und sie in der oncrate rausholst.

Bundle daten = new Bundle();
daten.putString("BREITE", str_breit);
daten.putString("LÄNGE", str_lang);
daten.putString("DATUM", str_datum);
daten.putString("ZONE", Integer.toString(n_zone));
fragment.setArguments(daten);

wie gesagt muss das vor der dem Commit passieren und nicht danach.

In dem Interface Übergibst du nichts also brauchst du das auch nicht.

Und deine Update Methode rufst du einfach in der onActivityCreadet auf nachdem das Fragment erstellt wurde. Glaube das mit dem Interface hast du noch nicht verstanden lasse es erst mal und mache es klassisch einfach. Übergabe im Bundle. Dann braucht auch den Construcktor nicht. Die onCreate schon. Denn da holst du dir die werte ja aus dem bundle.

if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
        mParam3 = getArguments().getString(ARG_PARAM3);
        mParam4 = getArguments().getString(ARG_PARAM4);

Nur wenn du nichts übergibst kann es nicht gehen sollte klar sein.

@Swa00 das mit dem singelton ist hier etwas sinnlos.
muss leider sagen das dein beitrag hier wenig hilft. deshalb nein
verstehe auch nicht warumm hier pascal ja sagt.

Er erstellt beim Tab wechsle immer eine Neue Instanz somit wird immer die onCreate usw durchlaufen.

public void onTabSelected(TabLayout.Tab tab) {
//Selektieren der richtigen Seite
switch (tab.getPosition()){
case 0 : fragment = new Frag_Sonne();
break;
case 1 : fragment = new Frag_Astro();
break;
case 2 : fragment = new Frag_Mond();
break;
}

— geändert am 08.07.2019, 17:34:58

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

08.07.2019, 17:32:18 via Website

@Jokel

Das mit singelton und so weiter würde ich lassen ist für dich noch zu schwer.

Die fünf Zeilen müsste er eher und schneller inne haben, als den gesamten Kladeradatsch von oben :-)
Alleine die Zeit, die du für deinen letzten Beitrag verwendet hast , würde schon ausreichen :-)

@Saw00 das mit dem singelton ist hier etwas sinnlos.

Sehe ich ein wenig anders : Er müsste sich um das Fragmenthandle, Argumente und Laufzeit abhängige Callbacks überhaupt nicht kümmern.

— geändert am 08.07.2019, 17:36:43

Liebe Grüße - Stefan
[ App - Entwicklung ]

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

08.07.2019, 17:41:16 via Website

@swa00 zeige mir bitte wor er das in seinen Code nutz. und wo er den static Costrucktor nutz.

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

08.07.2019, 18:41:13 via Website

Er nutzt das GAR NICHT , deshalb habe ich ja im empfohlen das so zu machen

Liebe Grüße - Stefan
[ App - Entwicklung ]

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

08.07.2019, 18:49:23 via Website

Genau das habe ich auch gleich gesehen. Und weil er es nicht versteht auch erstmal abgeraten.
Denn er fragt auch wass die variable Position im Interface zubeteuten hat das sagt mir das er den Code zusammen geklaut hat und nicht versteht. Zu mindestens versteht er das Prinzip eines Interfaces nicht. Sonst wäre der Code anders.

PS und wenn er das noch nicht versteht. Was will er dann mit singelton.

Also erstmal klassische Parameter Übergabe im bundle wass er ja auch will nur eben zum falschen Zeitpunkt macht.

Ps2 eine Übergabe mit bundle nach dem Tauch des fragment, durch Klick auf einen tab, giebt es auch nicht bei ihm.

Entweder das Interface auf beiten seiten umschreiben oder das bundle richtig benutzen.
Mu
Da müsste er die Parameter im interface übergeben die Position braucht er nicht wie er selber schon festgestellt hat. Aber die drei anderen Werte. Auf beiten Seiten. Activity und fragment.

— geändert am 08.07.2019, 19:07:32

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

08.07.2019, 19:10:33 via Website

Auch ist die zweite Methode im Interface etwas sinnlos. Die wird wohl in dem benutzen Code da gewesen sein.
Ich. Meine die mit der uri

So und nun nochetwas wo nutzt er den die beiden überschrieben Methoden in der activity? Wie du selber sagst tut er das nicht. Also wass Sol das ganze?

— geändert am 08.07.2019, 19:18:07

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

08.07.2019, 19:54:26 via Website

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

17.07.2019, 20:43:09 via Website

Hallo zusammen

Im OnCreate lege ich das Objekt an und mache die Berechnung. Im OnCreateView zeige ich die Daten an. Beim ersten mal funktioniert es und zeigt sinvolle Daten. Wenn ich das Fragment verlasse und wieder zurückkehre ist das "sun" Objekt null!

Was muss ich ändern damit die Daten immer noch vorhanden sind?

Gruss Renato

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

17.07.2019, 20:47:13 via Website

Entweder erneut übergeben, eine Klasse mit Getter und Setter erstellen, oder Singleton - wie bereits oben erwähnt

— geändert am 17.07.2019, 20:47:52

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

17.07.2019, 21:34:42 via Website

Ja einfach nochmal Übergeben. nachdem du auf einen der Button geklickt hast.
Da du scheinbar deinen eigenen Code nicht versteht hier etwas Hilfe

@Override
public void onTabSelected(TabLayout.Tab tab) {
//Selektieren der richtigen Seite
switch (tab.getPosition()){
case 0 : fragment = new Frag_Sonne();
break;
case 1 : fragment = new Frag_Astro();
break;
case 2 : fragment = new Frag_Mond();
break;
}
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
initial();
ft.replace(R.id.simpleFrameLayout, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}

Wie ich schon sagte ist das mit dem Interfase etwas sinnlos. Oder Besser Falsch. Denn du willst ja sicherlich wenn sich die Position ändert ohne das du erneut den Button klickst sich die anzeige ändert. Das geht mit dem Interface wie du es hast nicht.
Denn das ist ein Interfase um vom Fragment auf die Activity zu zugreifen. Nicht anders rum. Was du eigentlich brauchst.
Eigentlich brauchst du das auch nicht denn im Fragment macht du eine Public Anzeige Methode die hast du ja schon nur nicht public und du kannst wenn sich die Position geändert hat darauf zugreifen.
Nur solltest du auch immer vorher prüfen ob auch das Fragment angezeigt wird nicht das du die Methode aufrufst wenn du in einen anderen Fragment bist.

Code dazu hast du schon hast auch schon gefragt was das mit der ID Ist
@Override
public void onFragSelectet(int position) {
Frag_Sonne frag_sonne = (Frag_Sonne)
getSupportFragmentManager().findFragmentById(R.id.txt_dam_begin_wert);
if(frag_sonne != null){
frag_sonne.update_sonne( position );
}else{

}

}

Die ID ist die deines Fragment layouts ist das Layout geladen also das Fragment sichtbar sollte true zurück kommen.
Nur musstest du das in dem Listner ausführen wenn sich die Position ändert.

— geändert am 17.07.2019, 21:37:07

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

17.07.2019, 22:13:30 via Website

Ciao Jokel

Danke! Diese Antwort habe ich nun verstanden.
Prüfen ob was existiert befor man es ausführt ist in jedem Fall sinnvoll. Ich werde versuchen deine Tipps um zu setzen.

Gruss Renato

Hilfreich?
Kommentieren