繁体   English   中英

我们可以在android中将元素设为全局吗

[英]Can we make element global in android

我在用

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

这是一个主意。 为您的Chronometer创建一个单独的布局,并在所有需要计时器的布局中<include />

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

例如,如果当前状态正在运行,则您可能必须启动一个线程来更新计时器,或者如果计时器已停止,则只需从SharedPreferenceSingleton类中获取开始时间停止时间 ,然后在计时器上显示它即可。

例如,请考虑以下情形。 为了简单起见,我们有2个活动, ActivityAActivityB

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

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

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

  1. 计时器开始时间( System.currentTimeInMillis()减去此时间可让您过去)
  2. 计时器停止时间(用于计算计时器的暂停和停止时间)

让我们考虑这种情况。 您正在从ActivityA启动计时器,并希望保留ActivityB上的状态。 这是您可能想要做的事情。

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

现在你要导航到ActivityB,那么你必须定时器状态保存到SharedPreferenceonStop()ActivityA的方法。

现在,在启动ActivityB ,在onResume()方法中,从SharedPreference获取起始时间System.currentTimeInMillis()减去起始时间将为您提供经过的时间。 接下来,您必须从SharedPreference获取计时器状态

如果状态运行 ,那么你必须启动一个线程来更新计时器。 如果计时器已停止 ,则足以显示计时器所经过的时间。

这是解决方案的概述。 您可以从此处了解SharedPreferences

另外,您需要熟悉“活动”生命周期,您可以从此处学习。

不,你不能。

活动在Android中有一个生命周期:创建,开始,显示和执行任务,停止并销毁它们。 并且内部的所有观点都遵循这个生命周期。 不要与之抗争,这就是Android的方式,如此好,学习生命周期

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

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

是的,您可以做到这一点,但不能使其全球化。 这有点棘手。

您需要做的是:-在每个Activity中使用标记对Chronometer 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" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM