无法从OnTimeSetListener

时间:2019-02-08 19:24:18

标签: java android android-studio

我向我的应用添加了一个TimePicker。所选时间显示在TextView中,但我以后无法调用String将其发送到服务器。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mArrivalTimepicker = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            String ArrivalTimeString = hourOfDay + ":" + minute;
            TextView ArriavalTime = findViewById(R.id.arrival_time_tv);
            ArriavalTime.setText(ArrivalTimeString);
        }
    };
}

稍后我尝试调用它时,它说“无法解析符号'ArrivalTimeString'。

public void addMessage() {
    String arrivalTime = ArrivalTimeString;
}

感谢您的帮助!

编辑: 我现在将String声明为全局。我现在可以调用String了,但是它的Value ist仍然为空。

String ArrivalTimeString;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

mArrivalTime = findViewById(R.id.arrival_time_tv);

mArrivalTimepicker = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            ArrivalTimeString = hourOfDay + ":" + minute;
        }
    };
mArrivalTime.setText(ArrivalTimeString);
}

因此,选择时间后,它仍然不会显示所选时间。

解决方案: 我仍然在.setText中呼叫.OnTimeSetListener。为了稍后使用String,我使用

ArrivalTimeString = mArrivalTime.getText().toString();

3 个答案:

答案 0 :(得分:0)

字符串到达​​时间= ArrivalTime.getText()。toString(); 如果分配的字符串和显示的字符串相同。
切勿在任何时间或日期选择器内声明视图。它应该在onCreate()方法中,否则您将无法从时间选择器之外的文本视图中获取数据。

答案 1 :(得分:0)

String ArrivalTimeString = hourOfDay +“:” +分钟; 上面的线应该是 String ArrivalTimeString = String.valueOf(hourOfDay)+“:” + String.valueOf(minute); 同样,您不能在其他函数中使用String ArrivalTimeString,因为您在内联类中声明了它。最好是将其设置为字段/类变量。

答案 2 :(得分:0)

String ArrivalTimeString;
TextView ArriavalTime;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ArriavalTime = findViewById(R.id.arrival_time_tv);

    mArrivalTimepicker = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            ArrivalTimeString = hourOfDay + ":" + minute;
            ArriavalTime.setText(ArrivalTimeString);
        }
    };
}

如果要在onTimeSet()方法之外重用ArrivalTimeString,则应将其更改为全局变量而不是局部变量。

onTimeSet()内创建ArrivalTimeString时,正在将其创建为局部变量。局部变量将一直存在,直到您在其中声明该方法的末尾为止,因此,一旦到达onTimeSet()的末尾,ArrivalTimeString变量就已经消失了。

这样,当您尝试在其他方法中使用ArrivalTimeString时,会出现cannot resolve Symbol 'ArrivalTimeString'错误。

这是因为ArrivalTimeString根本不存在,因为创建它的方法已经完成。

因此,解决此问题的方法是声明 ArrivalTimeString变量为全局变量。通过将变量放置在方法之外,只要类仍然存在,就可以使变量的“生命”存在。

此外,您应该避免在findViewById()内部使用OnTimeSetListener()。通过ID查找视图可能是一个昂贵的过程,因此,如果要经常访问TextView,则还应该在OnTimeSet()之外声明ArriavalTime。这样可以避免您的应用在每次设置时间时都不断搜索视图。

P.S。我相信您可能对于TextView ArriavalTime可能有错字。