- Forum-Beiträge: 602
07.07.2019, 11:35:08 via Website
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