0

我在用

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

3 回答 3

3

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

现在您可以使用单例模式或存储计时器的开始时间当前状态(暂停、运行、停止、重置)等SharedPreferences属性。每当您开始一项新活动时,都会获取计时器的状态并将其显示在您的计时器上。

例如,如果当前状态正在运行,那么您可能必须启动一个线程来更新计时器,或者如果计时器停止,只需从您或您的班级获取开始时间停止时间并将其显示在计时器上。SharedPreferenceSingleton

例如,考虑以下场景。为简单起见,让我们有 2 个活动,ActivityAActivityB

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

  1. 就绪(00:00 - 您的计时器已准备好运行)
  2. 正在运行(定时器正在运行)
  3. 暂停(定时器已暂停并可恢复)
  4. 已停止(您已停止计时器,它会显示经过的时间,下一个可能的状态是 1,即准备就绪。)

您将需要几个其他参数,例如,

  1. 计时器开始时间(System.currentTimeInMillis()减去这个时间让你过去)
  2. 定时器停止时间(用于计算定时器暂停和停止时间)

让我们考虑一下这个案例。您正在从ActivityA启动计时器并希望保留ActivityB上的状态。以下是您可能想要做的一系列事情。

当您通过任何事件启动计时器时(例如单击按钮),您必须将开始时间保存在SharedPreference.

现在您要导航到 ActivityB,然后您必须将计时器状态保存到您SharedPreferenceActivityAonStop()方法中。

现在开始后ActivityB,在onResume()方法中从 获取开始时间SharedPreferenceSystem.currentTimeInMillis()减去开始时间将为您提供经过的时间。接下来,您必须从SharedPreference.

如果状态是running,那么您必须启动一个线程来更新计时器。如果计时器已停止,那么在计时器上显示经过的时间就足够了。

这是解决方案的概要。SharedPreferences你可以从这里了解一下。

此外,您需要熟悉 Activity 生命周期,您可以从这里学习。

于 2012-10-23T05:49:11.430 回答
2

不,你不能。

活动在 Android 中有一个生命周期:它们被创建、启动、显示和执行操作、停止和销毁。并且里面的所有视图都服从这个生命周期。不要与它抗争,Android就是这样,它很棒,学习这个生命周期

活动的视图不存在于它之外。这没有任何意义。您应该阅读如何将信息从一项活动传递到另一项活动

另外,也许您的问题是:我的所有活动如何在其布局中具有相同的视图,每个活动都有自己的视图实例。在这种情况下,请使用include xml 关键字

于 2012-10-23T05:38:08.640 回答
2

是的,你可以做到这一点,但不能让它全球化。这有点棘手。

您要做的是: - 在每个活动中使用标记制作 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();
    }
}

每个活动 xml 中的 xml 声明是

<include
        android:id="@+id/header_layout"
        android:layout_width="fill_parent"
        android:layout_height="40dip"
        layout="@layout/layout_header" />
于 2012-10-23T05:56:42.933 回答