6

Android Developersリファレンスには、利用可能な組み込みのViewリソースの中でR.id.progressがリストされています。

それでも、(私のアクティビティクラスで)ステートメントを発行すると、次のようになります。

View pv = getWindow().findViewById(android.R.id.progress);

nullを返します。

ProgressBarクラスと組み合わせて使用​​してもnullを返します。

ProgressBar pv = (ProgressBar) getWindow().findViewById(android.R.id.progress);

また、getWindow()がなくてもnullを返します。

ProgressBar pv = (ProgressBar) findViewById(android.R.id.progress);

なぜですか?

幻覚を起こさないようにするために、@ Geobitsのアドバイスに従い、以下の@ArunGeorgeが推奨するブログ投稿にリストされている正確なコードを含む新しいプロジェクトを最初から作成しました。

package com.droidworks;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ProgressBar;

public class ProgressBarExampleActivity extends Activity {
  private ProgressBar mProgress;
  private MyThread mBgThread;
  private final Handler mHandler = new Handler();

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mProgress = (ProgressBar) findViewById(android.R.id.progress);

    mBgThread = (MyThread) getLastNonConfigurationInstance();

    if (mBgThread == null) {
      mBgThread = new MyThread();
      mBgThread.start();
    }

    mHandler.post(mThreadWatcher);
  }

  @Override
  public Object onRetainNonConfigurationInstance() {
    return mBgThread;
  }

  @Override
  protected void onPause() {
    mHandler.removeCallbacks(mThreadWatcher);
    super.onPause();
  }

  private Runnable mThreadWatcher = new Runnable() {
      public void run() {
        int progress = mBgThread.getProgress();
        mProgress.setProgress(progress);

        if (progress != 100)
          mHandler.postDelayed(this, 50);
      }
    };

  static class MyThread extends Thread {

    private int _progress = 0;

    public void run() {
      for (; _progress < 100; _progress++) {
        try {
          Thread.sleep(100);
        }
        catch (InterruptedException ignored) {
        }
      }
    }

    private int getProgress() {
      return _progress;
    }
  }

}

案の定、このコードは:をスローしNullPointerExceptionます

at com.droidworks.ProgressBarExampleActivity$1.run(ProgressBarExampleActivity.java:44)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
4

4 に答える 4

0

編集済み

申し訳ありませんが、私はそれを間違って数えたに違いありません。それは私が貼り付けないことで得られるものです。ProgressBarいずれにせよ、のコンストラクターの1つだけを使用しない理由はありますか?これが私がバーを使用した最新のプロジェクトからの行です:

mProgress = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
于 2012-07-02T20:22:47.263 に答える
-1

android.R.id.progressと組み合わせて使用​​されProgressBarます。

このリンクを確認してください: http://foo.jasonhudgins.com/2010/03/simple-progressbar-tutorial.html

したがって、あなたの使い方は間違っています。

于 2012-07-02T19:20:02.970 に答える
-1

Eclipse から、[プロジェクト] > [クリーン...] をクリックしてプロジェクトのクリーンを実行し、プロジェクトの横にあるチェックボックスをクリックして、[OK] をクリックします。そして、プロジェクトをもう一度ビルドしてみてください。

于 2012-07-03T09:02:26.793 に答える