Java 无法在if语句外部使用字符串变量
我已经实现了这样的计时器(在代码中提到)。我更改了它的字符串格式,这样就需要Java 无法在if语句外部使用字符串变量,java,android,android-intent,Java,Android,Android Intent,我已经实现了这样的计时器(在代码中提到)。我更改了它的字符串格式,这样就需要hours:minutes:seconds,对于我来说,要使用开关,我必须添加一个if(){}条件语句 所以我这样做了,我必须在if(){}内声明字符串,因为我不能在if(){}外声明。但现在我想使用该字符串信息来打开一个新活动,并将字符串值分配给文本视图 问题是我不能在if(){}之外使用字符串,起初我将hms字符串与名为myText的TextView一起使用 问题是myText TextView在第一个活动中工作得很
hours:minutes:seconds
,对于我来说,要使用开关,我必须添加一个if(){}
条件语句
所以我这样做了,我必须在if(){}
内声明字符串,因为我不能在if(){}
外声明。但现在我想使用该字符串信息来打开一个新活动,并将字符串值分配给文本视图
问题是我不能在if(){}
之外使用字符串,起初我将hms字符串与名为myText的TextView一起使用
问题是myText TextView在第一个活动中工作得很好,但是在另一个活动中,当使用Inetnt将信息发送到另一个TextView时,它在TextView上没有显示任何变化
代码如下:
if (mySwitch.isChecked()) {
int getvaluehour = numPickerHour.getValue();
int getvalueminute = numPickerMin.getValue();
getvaluehour = getvaluehour * 3600000;
getvalueminute = getvalueminute * 60000;
long hoursandMinstomils = getvalueminute + getvaluehour;
new CountDownTimer(hoursandMinstomils, 1000) {
public void onTick(long millisUntilFinished) {
//here you can have your logic to set text to edittext
long millis = millisUntilFinished;
//Convert milliseconds into hour,minute and seconds
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
myText.setText(hms);
}
public void onFinish() {
myText.setText("TIME'S UP!!"); //On finish change timer text
}
}.start();
下面是我如何使用意图活动1:
Intent toST = new Intent(MainActivity.this, ShowTime.class);
String textMessage = myText.getText().toString() ;
toST.putExtra("wargra", textMessage);
startActivity(toST);
下面是我在活动2中收到的:
Bundle receiver = getIntent().getExtras();
if(receiver == null){
return;
}
String textMessage = reciver.getString("wargra");
myText2.setText(textMessage);
如何将hms值发送到myText2
以下是完整的activity1代码:
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.NumberPicker;
import android.widget.Switch;
import android.widget.TextView;
import java.util.concurrent.TimeUnit;
public class MainActivity extends AppCompatActivity {
Button silentButton;
AudioManager myAudioManager;
NumberPicker numPickerHour;
NumberPicker numPickerMin;
Switch mySwitch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Text,Audio,Button,Time
myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
silentButton = (Button) findViewById(R.id.Start);
//Number Picker
numPickerHour = (NumberPicker) findViewById(R.id.numberPickerHour);
numPickerMin = (NumberPicker) findViewById(R.id.numberPickerMinute);
mySwitch = (Switch) findViewById(R.id.Toggle);
//Hour
numPickerHour.setMaxValue(24);
numPickerHour.setMinValue(0);
numPickerHour.setWrapSelectorWheel(true);
//Min
numPickerMin.setMaxValue(60);
numPickerMin.setMinValue(0);
numPickerMin.setWrapSelectorWheel(true);
silentButton.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
final TextView myText;
myText = (TextView)findViewById(R.id.timeText);
if (mySwitch.isChecked()) {
int getvaluehour = numPickerHour.getValue();
int getvalueminute = numPickerMin.getValue();
getvaluehour = getvaluehour * 3600000;
getvalueminute = getvalueminute * 60000;
long hoursandMinstomils = getvalueminute + getvaluehour;
new CountDownTimer(hoursandMinstomils, 1000) {
public void onTick(long millisUntilFinished) {
//here you can have your logic to set text to edittext
long millis = millisUntilFinished;
//Convert milliseconds into hour,minute and seconds
String hms = String.format("Viberation end in: " + "%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
myText.setText(hms);
//set text
myAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
}
public void onFinish() {
myAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
myText.setText("TIME'S UP!!"); //On finish change timer text
}
}.start();
} else {
int getvaluehour = numPickerHour.getValue();
int getvalueminute = numPickerMin.getValue();
getvaluehour = getvaluehour * 3600000;
getvalueminute = getvalueminute * 60000;
long hoursandMinstomils = getvalueminute + getvaluehour;
new CountDownTimer(hoursandMinstomils, 1000) {
public void onTick(long millisUntilFinished) {
//here you can have your logic to set text to edittext
long millis = millisUntilFinished;
//Convert milliseconds into hour,minute and seconds
String hms = String.format("Silent ends in (" + "%02d:%02d:%02d" + ")", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
myText.setText(hms);//set text
myAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
}
public void onFinish() {
myAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
myText.setText("TIME'S UP!!"); //On finish change timer text
}
}.start();
}
Intent toST = new Intent(MainActivity.this, ShowTime.class);
String textMessage = myText.getText().toString() ;
toST.putExtra("wargra", textMessage);
startActivity(toST);
}
}
);
}
}
改变这两行。全局声明myText(正如您已经对silentButton、myAudioManager、numPickerHour、numPickerMin、mySwitch所做的那样)
希望你的问题解决。可能有两个原因和解决方案: 案例1:如果在线程内使用
如果则应更新UIThread
上的TextView
,即main线程
像这样:
if (mySwitch.isChecked()) {
int getvaluehour = numPickerHour.getValue();
int getvalueminute = numPickerMin.getValue();
getvaluehour = getvaluehour * 3600000;
getvalueminute = getvalueminute * 60000;
long hoursandMinstomils = getvalueminute + getvaluehour;
new CountDownTimer(hoursandMinstomils, 1000) {
public void onTick(long millisUntilFinished) {
//here you can have your logic to set text to edittext
long millis = millisUntilFinished;
//Convert milliseconds into hour,minute and seconds
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
MainActivity.this.runOnUIThread(new Runnable()
{
@Override
public void run()
{
myText.setText(hms);
}
}).start();
}
public void onFinish() {
MainActivity.this.runOnUIThread(new Runnable()
{
@Override
public void run()
{
myText.setText("TIME'S UP!!"); //On finish change timer text
}
}).start();
}
}.start();
您应该始终仅使用runOnUIThread()方法更新主线程上的任何UI元素。也许这就是你问题的原因
案例2:Sudip Podder给出的解决方案
案例3:回答您的问题:
在java中,不能只使用其作用域之外的变量。您所能做的就是将值放入类变量,如下所示:
只需声明一个类变量并将值放入其中,然后使用类变量作为值
public class MainActivity extends AppCompatActivity {
....
....
String time;
....
....
}
....
....
....
if (mySwitch.isChecked()) {
int getvaluehour = numPickerHour.getValue();
int getvalueminute = numPickerMin.getValue();
getvaluehour = getvaluehour * 3600000;
getvalueminute = getvalueminute * 60000;
long hoursandMinstomils = getvalueminute + getvaluehour;
new CountDownTimer(hoursandMinstomils, 1000) {
public void onTick(long millisUntilFinished) {
//here you can have your logic to set text to edittext
long millis = millisUntilFinished;
//Convert milliseconds into hour,minute and seconds
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
MainActivity.this.time=hms;
MainActivity.this.runOnUIThread(new Runnable()
{
@Override
public void run()
{
myText.setText(MainActivity.this.time);
}
}).start();
}
public void onFinish() {
MainActivity.this.runOnUIThread(new Runnable()
{
@Override
public void run()
{
myText.setText("TIME'S UP!!"); //On finish change timer text
}
}).start();
现在,您可以通过类变量time
使用hms变量的值。是的,别忘了将myText声明为类变量。您能添加整个活动吗。1代码?如果没有完整的代码,很难说你什么时候能从文本视图中获得意图的值。如果你能提供一个@SudipPodder,那就太好了。我刚刚编辑了它,在第一个版本中我没有包含所有的代码,但现在它是完整的活动,我没有包含所有的原因是为了让找到解决方案变得更简单我知道我没有包含的代码与我的problem@kardio你调试了你的代码吗?在你的意图代码和捆绑接收代码附近放一个断点,看看接收到了什么值。我怎么放断点?没有,我试过了,它不起作用。问题不在于我不能在第二个活动的文本视图中显示时间!您的第二个活动应该显示“时间到了!!”是带有您当前代码的myText2文本视图。现在显示的是什么?我只需要一种方法来访问外部的字符串hms,如果可能的话?
if (mySwitch.isChecked()) {
int getvaluehour = numPickerHour.getValue();
int getvalueminute = numPickerMin.getValue();
getvaluehour = getvaluehour * 3600000;
getvalueminute = getvalueminute * 60000;
long hoursandMinstomils = getvalueminute + getvaluehour;
new CountDownTimer(hoursandMinstomils, 1000) {
public void onTick(long millisUntilFinished) {
//here you can have your logic to set text to edittext
long millis = millisUntilFinished;
//Convert milliseconds into hour,minute and seconds
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
MainActivity.this.runOnUIThread(new Runnable()
{
@Override
public void run()
{
myText.setText(hms);
}
}).start();
}
public void onFinish() {
MainActivity.this.runOnUIThread(new Runnable()
{
@Override
public void run()
{
myText.setText("TIME'S UP!!"); //On finish change timer text
}
}).start();
}
}.start();
public class MainActivity extends AppCompatActivity {
....
....
String time;
....
....
}
....
....
....
if (mySwitch.isChecked()) {
int getvaluehour = numPickerHour.getValue();
int getvalueminute = numPickerMin.getValue();
getvaluehour = getvaluehour * 3600000;
getvalueminute = getvalueminute * 60000;
long hoursandMinstomils = getvalueminute + getvaluehour;
new CountDownTimer(hoursandMinstomils, 1000) {
public void onTick(long millisUntilFinished) {
//here you can have your logic to set text to edittext
long millis = millisUntilFinished;
//Convert milliseconds into hour,minute and seconds
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
MainActivity.this.time=hms;
MainActivity.this.runOnUIThread(new Runnable()
{
@Override
public void run()
{
myText.setText(MainActivity.this.time);
}
}).start();
}
public void onFinish() {
MainActivity.this.runOnUIThread(new Runnable()
{
@Override
public void run()
{
myText.setText("TIME'S UP!!"); //On finish change timer text
}
}).start();