动态文本取决于天气温度 - android

时间:2014-01-30 13:20:24

标签: java android dynamic textview

我是Android的初学者,希望在天气温度达到不同温度时显示文字。例如,如果它是5度,则文本将向用户显示"穿外套"。

代码工作正常,但很难实现这个动态文本功能。任何帮助将不胜感激!

Java代码:

public class AdviseMe extends Activity {

private TextView cityText;
private TextView condDescr;
private TextView temp;
private TextView press;
private TextView windSpeed;
private TextView windDeg;
private TextView textview1;

private TextView hum;
private ImageView imgView;

@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.adviseme);
String city = "London,UK";

cityText = (TextView) findViewById(R.id.cityText);
condDescr = (TextView) findViewById(R.id.condDescr);
temp = (TextView) findViewById(R.id.temp);
hum = (TextView) findViewById(R.id.hum);
press = (TextView) findViewById(R.id.press);
windSpeed = (TextView) findViewById(R.id.windSpeed);
windDeg = (TextView) findViewById(R.id.windDeg);
imgView = (ImageView) findViewById(R.id.condIcon);

JSONWeatherTask task = new JSONWeatherTask();
task.execute(new String[]{city});
}

private class JSONWeatherTask extends AsyncTask<String, Void, Weather> {

@Override
protected Weather doInBackground(String... params) 
Weather weather = new Weather();
String data = ( (new WeatherHttpClient()).getWeatherData(params[0]));

try {
weather = JSONWeatherParser.getWeather(data);

weather.iconData = ( (new
WeatherHttpClient()).getImage(weather.currentCondition.getIcon()));

} catch (JSONException e) {                                
e.printStackTrace();
}
return weather;

}

@Override
protected void onPostExecute(Weather weather) {                        
super.onPostExecute(weather);

if (weather.iconData != null && weather.iconData.length > 0) {
Bitmap img = BitmapFactory.decodeByteArray(weather.iconData, 0,
weather.iconData.length); 
imgView.setImageBitmap(img);
}

cityText.setText(weather.location.getCity() + ", " + weather.location.getCountry());
condDescr.setText(weather.currentCondition.getCondition() + "        
weather.currentCondition.getDescr() + ")");
temp.setText("" + Math.round((weather.temperature.getTemp() - 273.15)) + "C");
hum.setText(": " + weather.currentCondition.getHumidity() + "%");
press.setText(": " + weather.currentCondition.getPressure() + " hPa");
windSpeed.setText(": " + weather.wind.getSpeed() + " mps");
windDeg.setText("" + weather.wind.getDeg() + "");

}

}
}

XML代码:

    <ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:src="@drawable/cleanbackground" />

<TextView
    android:id="@+id/cityText"
    style="?android:attr/textAppearanceMedium"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true" />

<ImageView
    android:id="@+id/condIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@id/cityText" />

<TextView
    android:id="@+id/condDescr"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/condIcon"
    android:layout_alignLeft="@id/condIcon" 
   />

<TextView
    android:id="@+id/temp"
    style="@style/tempStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="12dp"
    android:layout_alignBaseline="@id/condDescr"
    android:layout_toRightOf="@id/condDescr"/>

<TextView
    android:id="@+id/pressLab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@id/condDescr"
    android:text="Pressure"
    android:layout_marginTop="15dp" />

<TextView
    android:id="@+id/press"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@id/pressLab"
    android:layout_toRightOf="@id/pressLab" 
    style="@style/valData"/>

<TextView
    android:id="@+id/humLab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@id/pressLab"
    android:text="Humidity" />

<TextView
    android:id="@+id/hum"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@id/humLab"
    android:layout_toRightOf="@id/humLab" 
    android:layout_marginLeft="4dp"
    style="@style/valData"/>

<TextView
    android:id="@+id/windLab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@id/humLab"
    android:text="Wind" />

<TextView
    android:id="@+id/windSpeed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@id/windLab"
    android:layout_toRightOf="@id/windLab"
    android:layout_marginLeft="4dp"
    style="@style/valData" />

<TextView
    android:id="@+id/windDeg"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@id/windLab"
    android:layout_toRightOf="@id/windSpeed"
    android:layout_marginLeft="4dp" 
    style="@style/valData"/>

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="124dp"
    android:text="TextView" />

1 个答案:

答案 0 :(得分:0)

您需要实现一个处理程序,它将每隔五秒检查一次Temperature变量,根据度数将在textview中显示自定义消息。使用本地广播

有一种更有效的方法

Handler的一个例子是:

public void functionA(){
//fetch value from source.
//update value to text view
//update custom textview
}


Handler timerHandler = new Handler();
    Runnable timerRunnable = new Runnable() {

        @Override
        public void run() {
            // Do your task here. 
            //Call functionA() here. 
            }timerHandler.postDelayed(this, 5000);
        }
    };

启动您的处理程序,如:

timerHandler.postDelayed(timerRunnable, 0);

停止它:

timerHandler.removeCallbacksAndMessages(null);

方法二使用本地广播(更强大,更少CPU消耗):

ReceiverActivity.java

监视名为"custom-event-name"的事件的通知的活动。

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Register to receive messages.
  // We are registering an observer (mMessageReceiver) to receive Intents
  // with actions named "custom-event-name".
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

// Our handler for received Intents. This will be called whenever an Intent
// with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    // Get extra data included in the Intent
    String message = intent.getStringExtra("message");
    Log.d("receiver", "Got message: " + message);
  }
};

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

SenderActivity.java

发送/广播通知的第二个活动。

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Every time a button is clicked, we want to broadcast a notification.
  findViewById(R.id.button_send).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      sendMessage();
    }
  });
}

// Send an Intent with an action named "custom-event-name". The Intent sent should 
// be received by the ReceiverActivity.
private void sendMessage() {
  Log.d("sender", "Broadcasting message");
  Intent intent = new Intent("custom-event-name");
  // You can also include some extra data.
  intent.putExtra("message", "This is my message!");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

使用上面的代码,每次点击按钮R.id.button_send时,都会广播一个意图,并由mMessageReceiver中的ReceiverActivity收到。

调试输出应如下所示:

01-16 10:35:42.413: D/sender(356): Broadcasting message
01-16 10:35:42.421: D/receiver(356): Got message: This is my message! 

实现目标的一种肮脏方式是:

public void functionA(){
    JSONWeatherTask task = new JSONWeatherTask();
    task.execute(new String[]{city});

}

在您的班级代码处理程序如:

Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {

    @Override
    public void run() {

        functionA()
    }timerHandler.postDelayed(this, 5000);
}
};

从你的onCreate开始就像(onCreate中的任何地方):

timerHandler.postDelayed(timerRunnable, 0);