我正在使用
<Chronometer android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/chrono"
android:visibility="gone" />
在我的一项活动中,现在我的问题是,我是否可以将其设置为我的所有活动的全局,以便我可以向我的Android应用中的每个活动显示其价值?
如果是,那么如何做到这一点请举例,因为我是android的新手?
这是我的计时器代码
Chronometer stopWatch;
stopWatch.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener(){
@Override
public void onChronometerTick(Chronometer arg0) {
countUp = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
long min = countUp / 60;
long sec = countUp % 60;
String minStr = "";
String secStr="";
if(min < 10)
{
minStr = "0"+min;
}
else
{
minStr = ""+min;
}
if(sec<10)
{
secStr = "0"+sec;
}
else
{
secStr = ""+sec;
}
// String asText = (countUp / 60) + ":" + (countUp % 60);
String asText = minStr + ":" + secStr;
textGoesHere.setText(asText);
}
});
stopWatch.start();
答案 0 :(得分:3)
这是一个想法。在需要计时器的所有布局中为Chronometer
和<include />
创建单独的布局。
现在,您可以使用Singleton模式或SharedPreferences
来存储开始时间,当前状态等属性(已暂停,正在运行)你的计时器,停止,重置)。每当您开始新活动时,请获取计时器的状态并将其显示在您的计时器上。
例如,如果当前状态正在运行,那么您可能需要启动一个线程来更新计时器,或者如果计时器停止,只需获得开始时间和停止时间来自您的SharedPreference
或您的Singleton
课程,并在计时器上显示。
例如,请考虑以下方案。为简单起见,我们有两项活动, ActivityA 和 ActivityB 。
现在这里是你的计时器的一些状态,你的可能会有所不同。
您需要其他几个参数,例如
System.currentTimeInMillis()
减去这个时间会过去)让我们考虑一下这个案例。您正在从 ActivityA 启动计时器,并希望在 ActivityB 上保留该状态。以下是您可能想要做的事情。
当您通过任何事件启动计时器时 - 例如点击按钮,您必须在SharedPreference
中保存开始时间。
现在您要导航到ActivityB,然后您必须在 ActivityA SharedPreference方法中将计时器状态保存到onStop()
>
现在开始ActivityB
后,在onResume()
方法中,从SharedPreference
获取开始时间,System.currentTimeInMillis()
减去开始时间将为您提供已用时间。接下来,您必须从SharedPreference
获得计时器状态。
如果状态正在运行,则必须启动一个线程来更新计时器。如果计时器已停止,则足以显示计时器已经过的时间。
这是解决方案的概要。您可以从here了解SharedPreferences
。
此外,您需要熟悉活动生命周期,您可以从here学习。
答案 1 :(得分:2)
不,你不能。
Android中的活动有一个生命周期:它们是创建,启动,显示和播放的。做东西,停止并销毁。所有观点都遵循这个生命周期。 不要反对它,这就是Android的方式,它就像那样,学习this life cycle。
活动的观点不存在于其之外。这没有任何意义。你应该阅读how to pass information from one activity to another。
此外,也许您的问题是:我的所有活动如何在其布局中具有相同的视图,每个视图都有自己的视图实例。在这种情况下,请使用include xml keyword。
答案 2 :(得分:2)
是的,你可以做到这一点,但不是通过使其全球化。这有点棘手。
你要做的是: - 在每个Activity中使用标记制作choronometer xml声明。 - 在基础班中访问这个天文台。
就像一个例子:我在每个活动中都需要标题,但我只想在一个地方进行编码。所以我所做的是:
/**
* Method to init Header components sets header bar title and header bar
* buttons. This method sets onClickListener to
*/
private void initHeader() throws InvalidHeaderTitleException {
try {
View headerView = findViewById(R.id.header_layout);
if (headerView != null) {
headerTextView = (TextView) headerView
.findViewById(R.id.layout_header_textview_header);
nextHeaderButton = (Button) headerView
.findViewById(R.id.layout_header_button_next);
prevHeaderButton = (Button) headerView
.findViewById(R.id.layout_header_button_previous);
if (headerTextView != null) {
String title = getHeaderText();
if (isValidString(title)) {
if (title.length() > IDryIceUIConstants.LENGTH_HEADER_TEXT)
title = title.substring(0,
IDryIceUIConstants.LENGTH_HEADER_TEXT)
+ IDryIceUIConstants.SUFFIX_HEADER_TEXT;
headerTextView.setText(title);
} else {
throw new InvalidHeaderTitleException(title);
}
}
if (nextHeaderButton != null) {
nextHeaderButton.setVisibility(getVisibility());
nextHeaderButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
headerNextButtonClicked();
}
});
}
if (prevHeaderButton != null) {
prevHeaderButton.setVisibility(getVisibility());
prevHeaderButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
headerPrevButtonClicked();
}
});
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
每个Activity xml中的xml声明是
<include
android:id="@+id/header_layout"
android:layout_width="fill_parent"
android:layout_height="40dip"
layout="@layout/layout_header" />