[英]How to add points in textview using saved preferences and transfer these points to another textview after 24 hours?
我的问题似乎太笼统了,但让我试着简短一点。 我有两个textview如下:
TextView 1:包含今天获得的积分
<TextView
android:id="@+id/pointsToday"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Points: 00" />
TextView 2:包含昨天获得的积分
<TextView
android:id="@+id/pointsYesterday"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Points: 00" />
这些点是在单击按钮时获得的,在单击按钮的侦听器中,我有这段代码可以添加点
pointsValue = todayPoints + 1;
saveCoinss.edit().putFloat("$", (float) todayPoints).apply();
我用这种方法将积分保存在“保存的首选项”中
SharedPreferences saveCoinss = this.getSharedPreferences("mySaverCoins", Context.MODE_PRIVATE);
saveCoinss.edit().putFloat("$", (float) todayPoints).apply();
当我单击按钮时,我在TextView中显示的点是: android:id="@+id/pointsToday"
所以现在的问题是,我要在一天(24小时)后从显示在android:id="@+id/pointsToday"
显示转移这些点,并将它们转移到id为android:id="@+id/pointsYesterday"
。 这意味着,从一天的开始,id / pointsToday将为00,而id / pointsYesterday将获得id / pointsToday中的积分。 那么我该怎么做。
好。 这篇文章可以帮助您解决问题: https://stackoverflow.com/questions/21674716/on-date-change-listener?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
: https://stackoverflow.com/questions/21674716/on-date-change-listener?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
如果使用数据库,则可以更好地解决,例如可以使用Room 。
Point.java
import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
import org.threeten.bp.OffsetDateTime;
@Entity(tableName = "point")
public class Point {
@PrimaryKey(autoGenerate = true)
private long id;
@ColumnInfo(name = "value")
private int value;
@ColumnInfo(name = "point_date")
private OffsetDateTime pointDate;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public OffsetDateTime getPointDate() {
return pointDate;
}
public void setPointDate(OffsetDateTime pointDate) {
this.pointDate = pointDate;
}
}
PointDao.java
import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Delete;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;
import java.util.List;
@Dao
public interface PointDao {
@Query("SELECT * FROM point")
List<Point> getAll();
@Query("SELECT * FROM point WHERE id IN (:pointIds)")
List<Point> getAllByIds(int[] pointIds);
@Query("SELECT * FROM point WHERE point_date=date(:dateForSearch) LIMIT 1")
Point getByPointDate(String dateForSearch);
@Query("SELECT * FROM point ORDER BY point_date DESC LIMIT 1")
Point getLastInsertedPoint();
@Query("SELECT SUM(value) AS total_points FROM point")
int getPointsSum();
@Insert
void insert(Point point);
@Insert
void insertAll(Point... points);
@Insert
void insertAll(List<Point> points);
@Delete
void delete(Point point);
@Query("DELETE FROM point")
void deleteAll();
}
通过PointDao
类中的getPointsSum
方法,了解对所有值求和的PointDao
AppDatabase.java
import android.arch.persistence.room.Database;
import android.arch.persistence.room.Room;
import android.arch.persistence.room.RoomDatabase;
import android.arch.persistence.room.TypeConverters;
import android.content.Context;
@Database(entities = {Point.class}, version = 1)
@TypeConverters(OffsetDateTimeConverter.class)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE;
public abstract PointDao pointDao();
public static AppDatabase getAppDatabase(Context context) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(
context.getApplicationContext(),
AppDatabase.class,
"point-database"
)
// allow queries on the main thread.
// Don't do this on a real app! See PersistenceBasicSample for an example.
.allowMainThreadQueries()
.build();
}
return INSTANCE;
}
public static void destroyInstance() {
INSTANCE = null;
}
}
OffsetDateTimeConverter.java
import android.arch.persistence.room.TypeConverter;
import android.text.TextUtils;
import org.threeten.bp.OffsetDateTime;
import org.threeten.bp.format.DateTimeFormatter;
public class OffsetDateTimeConverter {
private static final DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
@TypeConverter
public static OffsetDateTime toOffsetDate(String value) {
if (!TextUtils.isEmpty(value)) {
return formatter.parse(value, OffsetDateTime::from);
}
return null;
}
@TypeConverter
public static String fromOffsetDate(OffsetDateTime date) {
if (date != null) {
return date.format(formatter);
}
return null;
}
}
OffsetDateTimeChecker.java
import org.threeten.bp.OffsetDateTime;
import org.threeten.bp.format.DateTimeFormatter;
import org.threeten.bp.temporal.ChronoUnit;
public class OffsetDateTimeChecker {
public static OffsetDateTime getYesterday() {
return OffsetDateTime.now().minus(1, ChronoUnit.DAYS);
}
public static boolean isYesterday(OffsetDateTime offsetDateTime) {
DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE;
String offsetDateTimeText = offsetDateTime.format(formatter);
String yesterdayText = getYesterday().format(formatter);
return yesterdayText.equals(offsetDateTimeText);
}
public static boolean isToday(OffsetDateTime offsetDateTime) {
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;
String offsetDateTimeText = offsetDateTime.format(formatter);
String todayText = OffsetDateTime.now().format(formatter);
return todayText.equals(offsetDateTimeText);
}
}
将以下依赖项添加到您的应用程序的build.gradle
def room_version = "1.1.0"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
testImplementation "android.arch.persistence.room:testing:$room_version"
implementation 'com.github.ThreeTen:threetenbp:v1.3.6'
我使用https://github.com/ThreeTen/threetenbp以获得更轻松,更快速的性能,并且可以支持jdk6和jdk7,但是如果您以android SDK26为目标并使用java8,则可以使用java8提供的默认值。 只需记住,存储在本地设备中的所有内容(无论是数据库还是共享首选项)都可以被设备所有者入侵。 因此,您必须为保存的数据实施安全机制。 您还需要处理时区差异,或者如果用户通过更改设备时间来作弊来作弊。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.