时间戳在更改 Activity 时无法正常工作
TimeStamp not working correctly, when changing Activity
我对 Android 编程真的很陌生(昨天开始),我目前正在开发一个应用程序,它应该给我第一次单击按钮和第二次单击按钮之间的时间。
当我留在 Activity 时它工作正常。但是,如果我在时间为 "running" 时更改 activity,然后重新输入主 activity,它会给我一个奇怪的时间戳。
时间戳的工作原理:
我有一个 Start/Stop 按钮
单击开始时,它调用一个方法,我在其中获取以毫秒为单位的当前系统时间并将其保存到一个变量中。
单击停止时,它会执行相同的操作并减去 endTime-startTime。这就是我得到总时间的方式。
(工作正常)
但是当更改 activity(我有一个按钮,它变成了 activity,我可以在其中添加客户)并重新进入 main 并停止计时器时,它会将 totalTime 增加到某个值我无法理解.. 目前我的停止时间是 45 分钟。
也许我在保存我的价值观时做错了什么?
我只是 post 我的代码。也许有人可以帮助我并给我提示。谢谢,对不起我的英语不好!
Class "Timerecording"
package com.example.cmsolutions.zeiterfassung;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.view.View;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
public class ZeitErfassen extends AppCompatActivity {
public static LinkedList<Kunde> kunden = new LinkedList();
boolean running = false;
long startTime,endTime,totalTime;
public Date date = new Date();
private SharedPreferences app_preferences;
private SharedPreferences.Editor editor;
private static final int PREFERENCE_MODE_PRIVAT=0;
private TextView displayTime;
public Button startEndButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_zeit_erfassen);
//Einstellungen laden
app_preferences = getPreferences(PREFERENCE_MODE_PRIVAT);
displayTime = (TextView)findViewById(R.id.zeit_bei_Kunde);
startTime= app_preferences.getLong("startTime", 0);
endTime = app_preferences.getLong("endTime", 0);
running = app_preferences.getBoolean("running", false);
totalTime = app_preferences.getLong("totalTime", 0);
displayTime.setText((CharSequence) app_preferences.getString("zeitAnzeige", "Zeit bei Kunde"));
startEndButton = (Button)findViewById(R.id.start_Timer);
startEndButton.setText((CharSequence)app_preferences.getString("timerButton","Start Timer"));
editor = app_preferences.edit();
editor.commit();
createDropDown();
}
public void startTimer(View view) {
if(running == false) {
startTime = getTime();
displayTime.setText("Zeitstoppung läuft");
editor.putString("zeitAnzeige",(String)displayTime.getText());
running = true;
editor.putBoolean("running",true);
editor.putLong("startTimer", startTime);
startEndButton.setText("End Timer");
editor.putString("timerButton", (String)startEndButton.getText());
editor.commit();
} else {
endTime = getTime();
editor.putLong("endTime",endTime);
totalTime = endTime - startTime;
editor.putLong("totalTime",totalTime);
int hours = (int) ((totalTime / (1000*60*60)) % 24);
int minutes = (int) ((totalTime / (1000*60)) % 60);
int seconds = (int) (totalTime / 1000) % 60;
displayTime.setText(String.valueOf(hours)+ ":"+String.valueOf(minutes)+":"+ String.valueOf(seconds));
startEndButton.setText("Start Timer");
editor.putString("timerButton",(String)startEndButton.getText());
editor.commit();
running = false;
}
}
public void neuerKunde(View view) {
Intent intent = new Intent(this, AddKunde.class);
startActivity(intent);
}
public long getTime() {
long millis = System.currentTimeMillis();
return millis;
}
public void createDropDown() {
if(kunden.size() > 0) {
Spinner spinner = (Spinner) findViewById(R.id.chooseCustomer);
ArrayList<String> names = new ArrayList<>();
for(Kunde k:kunden) {
names.add(k.getName());
}
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, names);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
}
}
}
Class"AddCusomter"
package com.example.cmsolutions.zeiterfassung;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.EditText;
import java.util.LinkedList;
public class AddKunde extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_kunde2);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public void addKunde(View view) throws Exception {
try {
EditText strings = (EditText) findViewById(R.id.customerName);
String name = strings.getText().toString();
strings = (EditText) findViewById(R.id.addressField);
String address = strings.getText().toString();
Kunde customer = new Kunde(name,address);
ZeitErfassen.kunden.add(customer);
} catch (Exception e) {
throw new Exception("Fehler in addKunde!");
}
startActivity(new Intent(this,ZeitErfassen.class));
}
}
我刚刚意识到,也许是因为在方法 addKunde() 结束时我再次启动 MainActivity?
PS:我认为我还可以改进我的编码风格。如果您有任何关于更好编码的技巧(其他 class,.... 的方法),我也很高兴!谢谢!
您可以完成 activity 而不是开始 activity。
//startActivity(new Intent(this,ZeitErfassen.class));
finish();
检查共享首选项 XML 是否正在使用 ddms 存储值。
仅在需要时打开共享首选项
//OnCreate
app_preferences = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
Editor editor = pref.edit();
public void startTimer(View view) {
SharedPreferences.Editor editor = = app_preferences.edit();
if(running == false) {
startTime = getTime(); displayTime.setText("Zeitstoppung läuft");
editor.putString("zeitAnzeige",(String)displayTime.getText());
running = true;
editor.putBoolean("running",true); editor.putLong("startTimer", startTime);
startEndButton.setText("End Timer");
editor.putString("timerButton", (String)startEndButton.getText());
editor.commit();
} else {
endTime = getTime();
editor.putLong("endTime",endTime); totalTime = endTime - startTime;
editor.putLong("totalTime",totalTime);
int hours = (int) ((totalTime / (1000*60*60)) % 24); int minutes = (int) ((totalTime / (1000*60)) % 60);
int seconds = (int) (totalTime / 1000) % 60;
displayTime.setText(String.valueOf(hours)+ ":"+String.valueOf(minutes)+":"+ String.valueOf(seconds));
startEndButton.setText("Start Timer"); editor.putString("timerButton",(String)startEndButton.getText());
editor.commit();
running = false;
}
}
我对 Android 编程真的很陌生(昨天开始),我目前正在开发一个应用程序,它应该给我第一次单击按钮和第二次单击按钮之间的时间。
当我留在 Activity 时它工作正常。但是,如果我在时间为 "running" 时更改 activity,然后重新输入主 activity,它会给我一个奇怪的时间戳。
时间戳的工作原理:
我有一个 Start/Stop 按钮 单击开始时,它调用一个方法,我在其中获取以毫秒为单位的当前系统时间并将其保存到一个变量中。 单击停止时,它会执行相同的操作并减去 endTime-startTime。这就是我得到总时间的方式。 (工作正常)
但是当更改 activity(我有一个按钮,它变成了 activity,我可以在其中添加客户)并重新进入 main 并停止计时器时,它会将 totalTime 增加到某个值我无法理解.. 目前我的停止时间是 45 分钟。
也许我在保存我的价值观时做错了什么?
我只是 post 我的代码。也许有人可以帮助我并给我提示。谢谢,对不起我的英语不好!
Class "Timerecording"
package com.example.cmsolutions.zeiterfassung;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.view.View;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
public class ZeitErfassen extends AppCompatActivity {
public static LinkedList<Kunde> kunden = new LinkedList();
boolean running = false;
long startTime,endTime,totalTime;
public Date date = new Date();
private SharedPreferences app_preferences;
private SharedPreferences.Editor editor;
private static final int PREFERENCE_MODE_PRIVAT=0;
private TextView displayTime;
public Button startEndButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_zeit_erfassen);
//Einstellungen laden
app_preferences = getPreferences(PREFERENCE_MODE_PRIVAT);
displayTime = (TextView)findViewById(R.id.zeit_bei_Kunde);
startTime= app_preferences.getLong("startTime", 0);
endTime = app_preferences.getLong("endTime", 0);
running = app_preferences.getBoolean("running", false);
totalTime = app_preferences.getLong("totalTime", 0);
displayTime.setText((CharSequence) app_preferences.getString("zeitAnzeige", "Zeit bei Kunde"));
startEndButton = (Button)findViewById(R.id.start_Timer);
startEndButton.setText((CharSequence)app_preferences.getString("timerButton","Start Timer"));
editor = app_preferences.edit();
editor.commit();
createDropDown();
}
public void startTimer(View view) {
if(running == false) {
startTime = getTime();
displayTime.setText("Zeitstoppung läuft");
editor.putString("zeitAnzeige",(String)displayTime.getText());
running = true;
editor.putBoolean("running",true);
editor.putLong("startTimer", startTime);
startEndButton.setText("End Timer");
editor.putString("timerButton", (String)startEndButton.getText());
editor.commit();
} else {
endTime = getTime();
editor.putLong("endTime",endTime);
totalTime = endTime - startTime;
editor.putLong("totalTime",totalTime);
int hours = (int) ((totalTime / (1000*60*60)) % 24);
int minutes = (int) ((totalTime / (1000*60)) % 60);
int seconds = (int) (totalTime / 1000) % 60;
displayTime.setText(String.valueOf(hours)+ ":"+String.valueOf(minutes)+":"+ String.valueOf(seconds));
startEndButton.setText("Start Timer");
editor.putString("timerButton",(String)startEndButton.getText());
editor.commit();
running = false;
}
}
public void neuerKunde(View view) {
Intent intent = new Intent(this, AddKunde.class);
startActivity(intent);
}
public long getTime() {
long millis = System.currentTimeMillis();
return millis;
}
public void createDropDown() {
if(kunden.size() > 0) {
Spinner spinner = (Spinner) findViewById(R.id.chooseCustomer);
ArrayList<String> names = new ArrayList<>();
for(Kunde k:kunden) {
names.add(k.getName());
}
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, names);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
}
}
}
Class"AddCusomter"
package com.example.cmsolutions.zeiterfassung;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.EditText;
import java.util.LinkedList;
public class AddKunde extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_kunde2);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public void addKunde(View view) throws Exception {
try {
EditText strings = (EditText) findViewById(R.id.customerName);
String name = strings.getText().toString();
strings = (EditText) findViewById(R.id.addressField);
String address = strings.getText().toString();
Kunde customer = new Kunde(name,address);
ZeitErfassen.kunden.add(customer);
} catch (Exception e) {
throw new Exception("Fehler in addKunde!");
}
startActivity(new Intent(this,ZeitErfassen.class));
}
}
我刚刚意识到,也许是因为在方法 addKunde() 结束时我再次启动 MainActivity?
PS:我认为我还可以改进我的编码风格。如果您有任何关于更好编码的技巧(其他 class,.... 的方法),我也很高兴!谢谢!
您可以完成 activity 而不是开始 activity。
//startActivity(new Intent(this,ZeitErfassen.class));
finish();
检查共享首选项 XML 是否正在使用 ddms 存储值。
仅在需要时打开共享首选项
//OnCreate
app_preferences = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
Editor editor = pref.edit();
public void startTimer(View view) {
SharedPreferences.Editor editor = = app_preferences.edit();
if(running == false) {
startTime = getTime(); displayTime.setText("Zeitstoppung läuft");
editor.putString("zeitAnzeige",(String)displayTime.getText());
running = true;
editor.putBoolean("running",true); editor.putLong("startTimer", startTime);
startEndButton.setText("End Timer");
editor.putString("timerButton", (String)startEndButton.getText());
editor.commit();
} else {
endTime = getTime();
editor.putLong("endTime",endTime); totalTime = endTime - startTime;
editor.putLong("totalTime",totalTime);
int hours = (int) ((totalTime / (1000*60*60)) % 24); int minutes = (int) ((totalTime / (1000*60)) % 60);
int seconds = (int) (totalTime / 1000) % 60;
displayTime.setText(String.valueOf(hours)+ ":"+String.valueOf(minutes)+":"+ String.valueOf(seconds));
startEndButton.setText("Start Timer"); editor.putString("timerButton",(String)startEndButton.getText());
editor.commit();
running = false;
}
}