Android TextView最初不会更新,可以在进一步调用时使用

时间:2016-10-24 05:29:31

标签: android logging textview fragment

我有一个简单的太阳升起/太阳落山应用程序,可以为用户提供选定位置的时间。

当我在updateTime()方法中运行代码时,输​​出到日志的时间(SUNRISE Unformatted \ SUNRISE Formatted)是正确的,但TextView显示在日期更改为别的东西(当日期改变回来时是正确的。)

是否有任何可能导致日志显示正确输出但是TextView之后不会显示正确的输出?

完整碎片代码:

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);
    }
};
}

布局文件:

<?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>

2 个答案:

答案 0 :(得分:0)

您应该在onActivityCreated方法中初始化UI(设置文本)。您正在尝试设置文本而不返回onCreateView中的视图。 您只需在onActivityCreated方法中调用initialiseUI()方法即可。这应该工作。 这也是您在之后更改日期时更新UI的原因,因为在此之前,onCreateView方法已返回视图。

答案 1 :(得分:0)

您需要考虑Android的视图Lifecycle(按Arpit Mathur

您可能会在平局之后和之后的新抽奖之前更改TextView。更改时间后尝试使用requestLayout()或invalidate()。应该立即更新屏幕上的时间。

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

另见:Force Layout Requests