我们可以在android中创建元素全局

时间:2012-10-23 05:33:05

标签: java android timer

我正在使用

<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();

3 个答案:

答案 0 :(得分:3)

这是一个想法。在需要计时器的所有布局中为Chronometer<include />创建单独的布局。

现在,您可以使用Singleton模式或SharedPreferences来存储开始时间当前状态等属性(已暂停,正在运行)你的计时器,停止,重置)。每当您开始新活动时,请获取计时器的状态并将其显示在您的计时器上。

例如,如果当前状态正在运行,那么您可能需要启动一个线程来更新计时器,或者如果计时器停止,只需获得开始时间停止时间来自您的SharedPreference或您的Singleton课程,并在计时器上显示。

例如,请考虑以下方案。为简单起见,我们有两项活动, ActivityA ActivityB

现在这里是你的计时器的一些状态,你的可能会有所不同。

  1. 准备就绪(00:00 - 您的计时器已准备好运行)
  2. 正在运行(计时器正在运行)
  3. 已暂停(计时器已暂停且可以恢复)
  4. 已停止(您已停止计时器并显示已用时间,下一个可能的状态为1,即准备就绪。)
  5. 您需要其他几个参数,例如

    1. 计时器开始时间(System.currentTimeInMillis()减去这个时间会过去)
    2. 定时器停止时间(用于计算定时器暂停和停止时间)
    3. 让我们考虑一下这个案例。您正在从 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" />