cara mengubah teks di Android TextView

92

Saya mencoba melakukan ini

@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");

tetapi untuk beberapa alasan, hanya teks kedua yang muncul saat saya menjalankannya. Saya pikir itu mungkin ada hubungannya dengan Thread.sleep()metode pemblokiran. Jadi, dapatkah seseorang menunjukkan kepada saya bagaimana menerapkan pengatur waktu "secara tidak sinkron"?

Terima kasih.

pengguna270811
sumber
2
Alasan mengapa ini hanya menampilkan baris kedua adalah karena .setText()mengganti seluruh "widget" dengan teks yang Anda perintahkan untuk disetel; TERMASUK teks yang sudah Anda taruh di sana.
georgiaboy82

Jawaban:

46

Saya baru saja memposting jawaban ini di grup google-diskusi android

Jika Anda hanya mencoba menambahkan teks ke tampilan sehingga tampilan menampilkan "Langkah Pertama: ledakan telur Langkah Kedua: goreng telur" Kemudian pertimbangkan untuk menggunakan t.appendText("Step Two: fry egg"); alih-aliht.setText("Step Two: fry egg");

Jika Anda ingin benar-benar mengubah apa yang ada di dalam TextViewsehingga tertulis "Langkah Pertama: ledakan telur" saat startup dan kemudian dikatakan "Langkah Kedua: goreng telur" di lain waktu Anda selalu dapat menggunakan

Contoh runnable yang diberikan sadboy

Semoga berhasil

snctln
sumber
146

onCreate()Metode Anda memiliki beberapa kekurangan besar:

1) onCreate mempersiapkan Aktivitas Anda - jadi apa pun yang Anda lakukan di sini tidak akan terlihat oleh pengguna sampai metode ini selesai! Misalnya - Anda tidak akan pernah bisa mengubah TextViewteks a di sini lebih dari SATU kali karena hanya perubahan terakhir yang akan dibuat dan terlihat oleh pengguna!

2) Perlu diingat bahwa program Android akan - secara default - hanya berjalan dalam SATU utas! Jadi: jangan pernah menggunakan Thread.sleep()atau Thread.wait()di utas utama Anda yang bertanggung jawab atas UI Anda! (baca "Menjaga Aplikasi Anda Tetap Responsif" untuk informasi lebih lanjut!)

Apa yang dilakukan inisialisasi Aktivitas Anda adalah:

  • tanpa alasan Anda membuat TextViewobjek baru t!
  • Anda memilih tata letak Anda TextViewdi variabel tnanti.
  • Anda menyetel teks t(namun perlu diingat: teks hanya akan ditampilkan setelah onCreate() selesai dan loop peristiwa utama aplikasi Anda berjalan!)
  • Anda menunggu selama 10 detik dalam onCreatemetode Anda - ini tidak boleh dilakukan karena menghentikan semua aktivitas UI dan pasti akan memaksa ANR (Aplikasi Tidak Merespons, lihat tautan di atas!)
  • lalu Anda menyetel teks lain - teks ini akan ditampilkan segera setelah onCreate()metode Anda selesai dan beberapa metode siklus hidup Aktivitas lainnya telah diproses!

Solusinya:

  1. Setel teks hanya sekali onCreate()- ini harus menjadi teks pertama yang harus terlihat.

  2. Buat Runnabledan aHandler

    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. instal runnable ini sebagai handler, mungkin di onCreate()(tapi baca saran saya di bawah):

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

Saran: pastikan Anda mengetahui Activitysiklus hidup! Jika Anda melakukan hal-hal seperti itu, onCreate()ini hanya akan terjadi saat Anda Activitydibuat pertama kali! Android mungkin akan membuat Anda tetap Activityhidup untuk jangka waktu yang lebih lama, meskipun tidak terlihat! Saat pengguna "memulai" lagi - dan teks tersebut masih ada - Anda tidak akan melihat teks pertama Anda lagi!


=> Selalu instal penangan onResume()dan nonaktifkan mereka onPause()! Jika tidak, Anda akan mendapatkan "pembaruan" saat Anda Activitytidak terlihat sama sekali! Dalam kasus Anda, jika Anda ingin melihat teks pertama Anda lagi ketika diaktifkan kembali, Anda harus mengaturnya onResume(), bukan onCreate()!

Zordid
sumber
14

Baris pertama tampilan teks baru tidak diperlukan

t=new TextView(this); 

kamu bisa melakukan ini

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

sejauh utas latar belakang yang tidur di sini adalah contoh, tetapi saya pikir ada pengatur waktu yang akan lebih baik untuk ini. berikut ini tautan ke contoh yang baik menggunakan pengatur waktu sebagai gantinya 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");
            }
        };
Patrick Kafka
sumber
6

@ pengguna264892

Saya menemukan bahwa ketika menggunakan variabel String saya perlu baik awalan dengan String "" atau secara eksplisit dilemparkan ke CharSequence.

Jadi, alih-alih:

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

mencoba:

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

atau:

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

atau, karena string Anda tidak dinamis, bahkan lebih baik:

txtStatus.setText("AskingServer...");
jwalton85
sumber
3

sesuai saran Anda, saya menggunakan pegangan dan runnables untuk beralih / mengubah konten TextView menggunakan "timer". karena alasan tertentu, saat berjalan, aplikasi selalu melewatkan langkah kedua ("Langkah Kedua: telur goreng"), dan hanya menampilkan langkah terakhir (ketiga) ("Langkah tiga: sajikan telur").

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);      
    ...
}
pengguna270811
sumber
1
Ini tidak bisa berhasil! Hanya ada SATU penangan - bagaimana Anda ingin satu-satunya pelari mWaitRunnable yang ada untuk "mengetahui" bahwa sText pernah disetel ke "Langkah Dua" dan kemudian ke "Langkah tiga" !! ?? Pada saat dipanggil pertama kali (setelah 3 detik) - nilai sText adalah "Langkah tiga"! Anda harus membiasakan diri dengan keterampilan Java dasar sebelum mencoba pemrograman Android! :-)
Zordid
sebenarnya apa yang akhirnya saya lakukan adalah menambahkan penghitung di dalam runnable, jika 1, teksnya akan menjadi ini, jika 2, teksnya akan menjadi ini, dll.
user270811
0

:) Anda menggunakan utas dengan cara yang salah. Lakukan saja berikut ini:

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

Itu dia.

jitain sharma
sumber
0

menyetel teks ke sam textview dua kali menimpa teks tertulis pertama. Jadi kedua kalinya saat kita menggunakan settext kita hanya menambahkan string baru seperti

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

@Zordid @Iambda Jawabannya bagus, tetapi saya menemukan itu jika saya menempatkannya

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

dalam metode run () dan

mHandler.postDelayed(mUpdateUITimerTask, 0);

dalam metode onCreate buat sesuatu terus diperbarui.

Kevin Zhao
sumber