web-dev-qa-db-ja.com

Android TextViewでテキストを変更する方法

これをやろうとした

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    t=new TextView(this); 

    t=(TextView)findViewById(R.id.TextView01); 
    t.setText("Step One: blast Egg");

    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    t.setText("Step Two: fry Egg");

しかし、何らかの理由で、実行すると2番目のテキストのみが表示されます。 Thread.sleep()メソッドのブロックと関係があると思います。だから誰かが「非同期に」タイマーを実装する方法を教えてもらえますか?

ありがとう。

91
user270811

この回答をAndroid-discuss Googleグループに投稿しました

ビューにテキストを追加して「ステップ1:卵を爆破ステップ2:卵を揚げる」と表示する場合は、t.appendText("Step Two: fry Egg");の代わりに_t.setText("Step Two: fry Egg");を使用することを検討してください。

TextViewの内容を完全に変更して、起動時に「ステップ1:卵を吹き飛ばす」と表示し、後で「ステップ2:卵を揚げる」と表示したい場合は、いつでも使用できます。

Sadboyが実行した実行可能な例

がんばろう

45
snctln

onCreate()メソッドにはいくつかの大きな欠陥があります。

1)onCreatepreparesアクティビティ-ここで行うことは何も行われませんvisibleこのメソッドが終了するまでユーザーに!たとえば、ここでTextViewのテキストをONE回以上変更することはできません。最後の変更のみが描画されるため、ユーザー!

2)Androidプログラムは-デフォルトでは-ONEスレッドでのみ実行されることに注意してください!したがって、UIを担当するメインスレッドでThread.sleep()またはThread.wait()を使用しないでください! (詳細については 「アプリの応答を維持する」 をお読みください!)

アクティビティの初期化は次のとおりです。

  • 理由もなく、新しいTextViewオブジェクトtを作成します!
  • 後で変数TextViewでレイアウトのtを選択します。
  • tのテキストを設定します(ただし、覚えておいてください:表示されるのはafteronCreate()が終了し、アプリケーションのメインイベントループが実行されます!)
  • onCreateメソッド内で10秒待機します-この実行しないでくださいすべてのUIアクティビティを停止し、間違いなくANRを強制します(アプリケーションが応答しません。上記のリンクを参照してください!)
  • その後、別のテキストを設定します。これはonCreate()メソッドが終了し、他のいくつかの Activity lifecycle メソッドが処理されるとすぐに表示されます!

ソリューション:

  1. onCreate()にテキストを1回だけ設定します-これは表示される最初のテキストでなければなりません。

  2. RunnableHandlerを作成します

    private final Runnable mUpdateUITimerTask = new Runnable() {
        public void run() {
            // do whatever you want to change here, like:
            t.setText("Second text to display!");
        }
    };
    private final Handler mHandler = new Handler();
    
  3. このrunnableをonCreate()で可能なハンドラーとしてインストールします(ただし、以下のアドバイスをお読みください):

    // run the mUpdateUITimerTask's run() method in 10 seconds from now
    mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
    

アドバイス:Activityのライフサイクルを必ず確認してください! onCreate()でそのようなことをすると、Activityfirstの時間に作成されたときにのみ発生します! Androidは、Activityが表示されていなくても、より長い期間生き続ける可能性があります!ユーザーが再び「開始」するとき-そしてそれがまだ存在している-あなたの最初のテキストはもう表示されません!


=>常にハンドラをonResume()にインストールし、onPause()で無効にします!そうでない場合は、Activityがまったく表示されないときに「更新」を取得します!あなたの場合、最初のテキストが再びアクティブになったときに再び表示したい場合は、onResume()ではなくonCreate()に設定する必要があります!

147
Zordid

新しいテキストビューの最初の行は不要です

t=new TextView(this); 

あなたはこれを行うことができます

TextView t = (TextView)findViewById(R.id.TextView01);

ここでスリープするバックグラウンドスレッドは一例ですが、これにはもっと良いタイマーがあると思います。代わりにタイマーを使用した良い例へのリンクがあります http://Android-developers.blogspot.com/2007/11/stitch-in-time.html

    Thread thr = new Thread(mTask);
    thr.start();
}

Runnable mTask = new Runnable() {
    public void run() {
        // just sleep for 30 seconds.
                    try {
                        Thread.sleep(3000);
                        runOnUiThread(done);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
        }
    };

    Runnable done = new Runnable() {
        public void run() {
                   // t.setText("done");
            }
        };
14
Patrick Kafka

@ user264892

文字列変数を使用する場合、 ""の文字列をプレフィックスするか、明示的にCharSequenceにキャストする必要があることがわかりました。

代わりに:

String Status = "Asking Server...";
txtStatus.setText(Status);

試してください:

String Status = "Asking Server...";
txtStatus.setText((CharSequence) Status);

または:

String Status = "Asking Server...";    
txtStatus.setText("" + Status);

または、あなたの文字列は動的ではないので、さらに良い:

txtStatus.setText("AskingServer...");
6
jwalton85

あなたのアドバイスに従って、私はハンドルとランナブルを使用して、「タイマー」を使用してTextViewのコンテンツを切り替え/変更しています。何らかの理由で、実行中、アプリは常に2番目のステップ(「ステップ2:卵を揚げる」)をスキップし、最後(3番目)のステップのみを表示します(「ステップ3:卵を提供する」)。

TextView t; 
private String sText;

private Handler mHandler = new Handler();

private Runnable mWaitRunnable = new Runnable() {
    public void run() {
        t.setText(sText);
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    mMonster = BitmapFactory.decodeResource(getResources(),
            R.drawable.monster1);

    t=new TextView(this); 
    t=(TextView)findViewById(R.id.TextView01); 

    sText = "Step One: unpack Egg";
    t.setText(sText);

    sText = "Step Two: fry Egg";        
    mHandler.postDelayed(mWaitRunnable, 3000);

    sText = "Step three: serve Egg";
    mHandler.postDelayed(mWaitRunnable, 4000);      
    ...
}
3
user270811

@Zordid @Iambdaの答えは素晴らしいですが、

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

run()メソッドで

mHandler.postDelayed(mUpdateUITimerTask, 0);

onCreateメソッドで、更新を続けます。

0
Kevin Zhao

テキストをsam textviewに2回設定すると、最初に書かれたテキストが上書きされます。したがって、settextを使用する2回目は、次のように新しい文字列を追加するだけです。

textview.append("Step Two: fry Egg");
0
Disha

:)間違った方法でスレッドを使用しています。以下を実行してください。

private void runthread()
{

splashTread = new Thread() {
            @Override
            public void run() {
                try {
                    synchronized(this){

                        //wait 5 sec
                        wait(_splashTime);
                    }

                } catch(InterruptedException e) {}
                finally {
                    //call the handler to set the text
                }
            }
        };

        splashTread.start(); 
}

それでおしまい。

0
jitain sharma