2016-10-24 2 views
0

Ich habe eine einfache Sonne Sonnenaufgang/Sonne Set-App, die dem Benutzer die Zeiten gegeben einen ausgewählten Ort gegeben.Android TextView nicht zunächst zu aktualisieren, funktioniert bei weiteren Anrufen

Wenn ich führen Sie den Code in der updateTime() Methode die Zeit, um die Log ausgegeben (SUNRISE Unformatted \ SUNRISE Formatiert) korrekt ist, aber die TextView Anzeige nicht aktualisiert, bis das Datum auf etwas anderes geändert wurde (und ist korrekt, wenn das Datum wird zurück geändert).

Gibt es irgendetwas, das dazu führen würde, dass das Protokoll die korrekte Ausgabe anzeigt, aber die TextView sofort danach nicht?

Voll Fragment Code:

import android.app.Fragment; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.DatePicker; 
import android.widget.TextView; 

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

import swindroid.suntime.R; 
import swindroid.suntime.calc.AstronomicalCalendar; 
import swindroid.suntime.calc.GeoLocation; 

public class singleRiseSet extends Fragment { 

int year, month, day; 
private static GeoLocation currentLocation; 

DatePicker dp; 
static TextView sunriseTV, sunsetTV; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.single_rise_set, container, false); 

    dp = (DatePicker) view.findViewById(R.id.datePicker); 
    sunriseTV = (TextView) view.findViewById(R.id.sunriseTimeTV); 
    sunsetTV = (TextView) view.findViewById(R.id.sunsetTimeTV); 

    initialiseUI(); 

    return view; 
} 

public void initialiseUI() { 
    Log.d("SINGLERISESET", "INIT"); 
    Calendar cal = Calendar.getInstance(); 
    year = cal.get(Calendar.YEAR); 
    month = cal.get(Calendar.MONTH); 
    day = cal.get(Calendar.DAY_OF_MONTH); 
    dp.init(year,month,day,dateChangeHandler); // setup initial values and reg. handler 
} 


public void updateTime(int newYear, int monthOfYear, int dayOfMonth, GeoLocation currentLocation) { 
    AstronomicalCalendar ac = new AstronomicalCalendar(currentLocation); 
    Log.d("SUNRISE Current", currentLocation.getLocationName()); 
    if (!(newYear == 0 && monthOfYear == 0 && dayOfMonth == 0)) { 
     this.year = newYear; 
     this.month = monthOfYear; 
     this.day = dayOfMonth; 
    } 
    ac.getCalendar().set(year, month, day); 
    Date srise = ac.getSunrise(); 
    Date sset = ac.getSunset(); 

    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 

    Log.d("SUNRISE Unformatted", srise+""); 
    Log.d("SUNRISE formatted", sdf.format(srise)); 

    sunriseTV.setText(sdf.format(srise)); 
    sunsetTV.setText(sdf.format(sset)); 
} 

DatePicker.OnDateChangedListener dateChangeHandler = new DatePicker.OnDateChangedListener() 
{ 
    public void onDateChanged(DatePicker dp, int year, int monthOfYear, int dayOfMonth) 
    { 
     updateTime(year, monthOfYear, dayOfMonth, currentLocation); 
    } 
}; 
} 

Layout-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TableLayout android:id="@+id/TableLayout01" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:stretchColumns="0,1" 
     android:gravity="center" 
     android:padding="5sp"> 
     <TableRow android:id="@+id/TableRow01" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
      <TextView android:padding="2sp" 
       android:gravity="center" 
       android:textColor="#ffd700" 
       android:textSize="20sp" 
       android:text="Sun Rise" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content"> 
      </TextView> 
      <TextView android:padding="2sp" 
       android:gravity="center" 
       android:textColor="#ff8400" 
       android:textSize="20sp" 
       android:text="Sun Set" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content"> 
      </TextView> 
     </TableRow> 

     <TableRow android:id="@+id/TableRow02" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
      <TextView android:padding="2sp" 
       android:textSize="38sp" 
       android:textColor="#ffd700" 
       android:gravity="center" 
       android:layout_height="wrap_content" 
       android:id="@+id/sunriseTimeTV" 
       android:layout_width="wrap_content"> 
      </TextView> 
      <TextView android:padding="2sp" 
       android:textSize="38sp" 
       android:textColor="#ff8400" 
       android:gravity="center" 
       android:layout_height="wrap_content" 
       android:id="@+id/sunsetTimeTV" 
       android:layout_width="wrap_content"> 
      </TextView> 
     </TableRow> 

    </TableLayout> 

    <ImageView android:id="@+id/ImageView01" 
     android:layout_width="match_parent" 
     android:src="@drawable/sunpic" 
     android:padding="8dp" 
     android:layout_height="60sp"> 
    </ImageView> 
    <DatePicker android:id="@+id/datePicker" 
     android:layout_width="fill_parent" 
     android:padding="5sp" 
     android:gravity="center" 
     android:layout_height="wrap_content" 
     android:calendarViewShown="false"> 
    </DatePicker> 

</LinearLayout> 
+0

vielleicht müssen Sie Ihr Fragment aktualisieren. Schauen Sie sich das http://stackoverflow.com/questions/20702333/refresh-fragment-at-reload an. – grant

Antwort

0

Sie sollten Ihre UI (setzen Sie Ihren Text) in onActivityCreated Methode initialisieren. Sie versuchen, den Text festzulegen, ohne Ihre Ansicht in OnCreateView zurückzugeben. Sie rufen einfach Ihre initialiseUI() Methode in OnActivityCreated-Methode. Das sollte funktionieren. Das ist auch der Grund, dass Ihre Benutzeroberfläche aktualisiert wird, wenn Sie das Datum später ändern, da bis zu diesem Zeitpunkt die onCreateView-Methode die Ansicht zurückgegeben hat.

+0

Mit "setze deinen Text" meinst du die Initialisierung der Textansicht zB: "sunriseTV = (TextView) view.findViewById (R. id.sunriseTimeTV); " ? Ich kann nicht auf die Ansicht von den Argumenten onActivityCreated zugreifen. Sonst habe ich gerade initialisiertUI() in eine onActivityCreated-Methode und jetzt stürzt es beim Ändern des Datums (NullPointerException) ab. Der Text ist "set" (sunriseTV.setText (sdf.format (srise));) nachdem die Ansicht zurückgegeben wird, wie updateTime() nach der Rückkehr von onCreateView aufgerufen wird, es sei denn, ich missverstanden Ihre Bedeutung. – Twulz

+0

Entschuldigung, die NullPointerException wurde durch etwas anderes, das ich versuchte, verursacht, obwohl damit das Problem behoben ist, das in der ersten Frage beschrieben wurde. – Twulz

0

Sie benötigen Android Ansicht Lifecycle (By Arpit Mathur)

Sie betrachten sind Ihre Textview irgendwann nach einem Unentschieden und vor einem nachfolgenden neuen Unentschieden wahrscheinlich ändern. Versuchen Sie es mit requestLayout() oder invalidate(), nachdem Sie die Uhrzeit geändert haben. Sollte die Zeit auf dem Bildschirm fast sofort aktualisieren.

sunriseTV.setText(sdf.format(srise)); 
sunsetTV.setText(sdf.format(sset)); 
sunriseTV.requestLayout(); 
sunsetTV.requestLayout(); 

Siehe auch: Force Layout Requests

+0

Danke für die Antwort, aber weder requestLayout() noch invalidate() beheben dieses Problem, einschließlich der Kombination mit der anderen Antwort unter Verwendung der onActivityCreated() -Methode. – Twulz

+0

könnte falsch sein - nur im Dunkeln stechen, aber Ihr DatePicker-Listener läuft möglicherweise außerhalb des UI-Threads. In diesem Fall glaube ich nicht, dass Updates für Ihre TextViews ordnungsgemäß aktualisiert werden. Sie könnten versuchen, Ihre updateTime-Methode in einem UI-Thread auszuführen. Versuchen Sie, den Inhalt Ihrer updateTime-Methode im oben beschriebenen UI-Thread zu verpacken (http://stackoverflow.com/questions/5400288/update-textview-from-thread-please-help) –

+0

Danke, aber würde das nicht verursachen das gegenteilige Problem? d.h. der Anfangswert würde korrekt eingestellt werden, aber nachfolgende Änderungen (d. h. Änderungen, die durch den datePicker vorgenommen werden) wären falsch? Alle Änderungen, die durch die Auswahl von datePicker vorgenommen werden, werden korrekt aktualisiert. – Twulz

Verwandte Themen