0

使ってます

<Chronometer android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/chrono"
        android:visibility="gone" />

私の1つのアクティビティで、私の質問は、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とそれのために個別のレイアウトを作成します。<include />

これで、シングルトンパターンを使用するか、タイマーの開始時刻現在の状態(一時停止、実行中、停止、リセット)SharedPreferencesなどの属性を保存できます。新しいアクティビティを開始するたびに、タイマーの状態を取得して、タイマーに表示します。

たとえば、現在の状態が実行されている場合は、タイマーを更新するためにスレッドをキックスタートする必要があります。タイマーが停止している場合は、クラスから開始時刻停止時刻を取得して、タイマーに表示します。SharedPreferenceSingleton

たとえば、次のシナリオについて考えてみます。簡単にするために、ActivityAActivityBの2つのアクティビティを用意します。

ここにあなたのタイマーのいくつかの状態があります、あなたの状態は異なるかもしれません。

  1. 準備完了(00:00-タイマーを実行する準備ができました)
  2. 実行中(タイマーが実行中)
  3. 一時停止(タイマーは一時停止され、再開できます)
  4. 停止(タイマーを停止すると、経過時間が表示され、次に可能な状態は1、つまり準備完了になります。)

次のような他のいくつかのパラメータが必要になります。

  1. タイマー開始時間(System.currentTimeInMillis()マイナスこの時間を経過すると経過します)
  2. タイマー停止時間(タイマーの一時停止時間と停止時間を計算するために使用されます)

この場合を考えてみましょう。ActivityAからタイマーを開始していて、ActivityBの状態を保持したいと考えています。これがあなたがしたいと思うかもしれないことのセットです。

タイマーを任意のイベントで開始する場合(ボタンをクリックするなど)、開始時間をに保存する必要がありますSharedPreference

次に、ActivityBに移動する必要があります。次に、 ActivityAのメソッドでタイマー状態をに保存する必要があります。SharedPreferenceonStop()

開始後ActivityBonResume()メソッドで、から開始時間を取得し、開始時間引いたものが経過時間を示します。次に、からタイマー状態を取得する必要があります。SharedPreferenceSystem.currentTimeInMillis()SharedPreference

状態が実行中の場合は、タイマーを更新するためにスレッドを開始する必要があります。タイマーが停止している場合は、タイマーの経過時間を表示するだけで十分です。

これがソリューションの概要です。ここSharedPreferencesから学ぶことができます。

また、ここから学ぶことができるアクティビティのライフサイクルに精通している必要があります。

于 2012-10-23T05:49:11.430 に答える
2

はい、これはできますが、グローバルにすることはできません。少し注意が必要です。

あなたがしなければならないことは次のとおりです:-各アクティビティでタグを使用してchoronometerxml宣言を作成します。-基本クラスでこのクロノメーターにアクセスします。

例のように、各アクティビティにヘッダーが必要でしたが、コーディングは1か所でのみ行いたいと考えていました。だから私がすることは:

/**
 * 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 に答える
2

いいえ、できません。

アクティビティにはAndroidのライフサイクルがあります。アクティビティは作成、開始、表示、実行され、停止され、破棄されます。そして、内部のすべてのビューは、このライフサイクルに従います。それと戦わないでください、それはAndroidのやり方であり、それはそのように素晴らしいです、このライフサイクルを学びましょう。

アクティビティのビューは、アクティビティの外部には存在しません。これには意味がありません。あるアクティビティから別のアクティビティに情報を渡す方法を読む必要があります。

また、おそらくあなたの質問は、私のすべてのアクティビティがレイアウト内で同じビューを持ち、それぞれが独自のビューのインスタンスを持つことができるかということです。その場合は、includexmlキーワードを使用してください。

于 2012-10-23T05:38:08.640 に答える