Android TextView में टेक्स्ट कैसे बदलें


91

मैंने ऐसा करने की कोशिश की

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

लेकिन किसी कारण से, जब मैं इसे चलाता हूं तो केवल दूसरा पाठ दिखाई देता है। मुझे लगता है कि यह Thread.sleep()विधि अवरुद्ध करने के साथ कुछ करना हो सकता है । तो क्या कोई मुझे दिखा सकता है कि "असिंक्रोनसली" टाइमर को कैसे लागू किया जाए?

धन्यवाद।


2
कारण यह केवल दूसरी पंक्ति दिखाता है क्योंकि .setText()पूरे "विजेट" को उस पाठ के साथ बदल देता है जिसे आप इसे सेट करने के लिए कहते हैं; उस पाठ को शामिल करना जो आपने पहले ही वहां रखा है।
georgiaboy82

जवाबों:


45

मैंने अभी इस उत्तर को एंड्रॉइड-चर्चा Google समूह में पोस्ट किया है

यदि आप केवल दृश्य में पाठ जोड़ने का प्रयास कर रहे हैं ताकि यह "स्टेप वन: ब्लास्ट एग स्टेप टू: फ्राई एग" प्रदर्शित करे तो t.appendText("Step Two: fry egg"); इसके बजाय इसका उपयोग करेंt.setText("Step Two: fry egg");

यदि आप पूरी तरह से बदलना चाहते हैं TextViewतो ऐसा क्या है कि यह स्टार्टअप पर "स्टेप वन: ब्लास्ट एग" कहता है और फिर यह कहता है कि "स्टेप टू: फ्राई एग" एक समय में आप हमेशा उपयोग कर सकते हैं

रननेबल उदाहरण सैडबॉय ने दिया

सौभाग्य


146

आपकी onCreate()विधि में कई भारी दोष हैं:

1) onCreate तैयार करता है तो कुछ भी नहीं है कि आप यहाँ कर बनाया जाएगा - अपने गतिविधि दिखाई दे जब तक इस पद्धति खत्म उपयोगकर्ता के लिए! उदाहरण के लिए - तुम कभी नहीं एक परिवर्तन करने के लिए सक्षम हो जाएगा TextViewके पाठ यहाँ की तुलना में अधिक एक ही अंतिम परिवर्तन के रूप में समय तैयार किया जाएगा और इस प्रकार उपयोगकर्ता को दिखाई!

2) ध्यान रखें कि एक एंड्रॉइड प्रोग्राम डिफ़ॉल्ट रूप से - केवल एक धागे में चलेगा ! इस प्रकार: कभी भी Thread.sleep()या Thread.wait()अपने मुख्य धागे में उपयोग न करें जो आपके यूआई के लिए जिम्मेदार है! ( आगे की जानकारी के लिए "अपने ऐप को उत्तरदायी रखें" पढ़ें !)

आपकी गतिविधि का आपका आरंभ क्या है:

  • बिना किसी कारण के आप एक नई TextViewवस्तु बनाते हैं t!
  • आप बाद TextViewमें चर में अपने लेआउट को चुनें t
  • आप का पाठ सेट करते हैं t(लेकिन ध्यान रखें: यह केवल फिनिश के बाद ही प्रदर्शित होगा onCreate()और आपके एप्लिकेशन का मुख्य ईवेंट लूप!)
  • आप अपनी विधि के भीतर 10 सेकंड के लिए प्रतीक्षा करें onCreate- यह कभी भी नहीं किया जाना चाहिए क्योंकि यह सभी UI गतिविधि को रोकता है और निश्चित रूप से एक ANR को लागू करेगा (आवेदन प्रतिक्रिया नहीं, ऊपर लिंक देखें!)
  • फिर आप एक और पाठ सेट करते हैं - जैसे ही आपकी onCreate()विधि समाप्त होती है यह प्रदर्शित हो जाएगा और कई अन्य गतिविधि जीवनचक्र विधियों को संसाधित किया गया है!

समाधान:

  1. केवल एक बार पाठ सेट करें onCreate()- यह पहला पाठ होना चाहिए जो दिखाई दे।

  2. A Runnableऔर a बनाएँHandler

    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. संभव के रूप में इस चल को स्थापित करें, onCreate()( संभव है, लेकिन नीचे मेरी सलाह पढ़ें):

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

सलाह: सुनिश्चित करें कि आप एक Activityजीवन चक्र जानते हैं ! यदि आप onCreate()इस तरह से सामान बनाते हैं तो यह केवल तभी होगा जब आपका पहली बार Activityबनाया गया हो ! एंड्रॉइड संभवतः लंबे समय तक आपके जीवन को जीवित रखेगा , भले ही वह दिखाई न दे! जब कोई उपयोगकर्ता इसे फिर से शुरू करता है - और यह अभी भी मौजूद है - तो आप अपना पहला पाठ नहीं देखेंगे!Activity


=> हमेशा हैंडलर स्थापित करें onResume()और उन्हें अक्षम करें onPause()! अन्यथा आप "अपडेट" प्राप्त करेंगे जब आपका Activityबिल्कुल भी दिखाई नहीं दे रहा है! आपके मामले में, यदि आप अपना पहला पाठ फिर से सक्रिय होने पर देखना चाहते हैं, तो आपको इसे सेट करना होगा onResume(), नहीं onCreate()!


14

नए पाठ दृश्य की पहली पंक्ति अनावश्यक है

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

6

@ user264892

मैंने पाया कि स्ट्रिंग स्ट्रिंग का उपयोग करते समय मुझे या तो "" के स्ट्रिंग के साथ उपसर्ग की आवश्यकता होती है या स्पष्ट रूप से चारसेंसेंस के लिए डाली जाती है।

इसलिए इसके बजाय:

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

3

आपकी सलाह के अनुसार, मैं "टाइमर" का उपयोग करके TextView की सामग्री को बदलने / बदलने के लिए हैंडल और रनवेबल्स का उपयोग कर रहा हूं। किसी कारण से, जब चालू होता है, तो ऐप हमेशा दूसरे चरण ("स्टेप टू: फ्राई एग") को छोड़ देता है, और केवल अंतिम (तीसरा) स्टेप ("स्टेप थ्री: सर्व एग") दिखाता है।

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

1
यह काम नहीं कर सकता! केवल एक हैंडलर है - आप अपने एकमात्र मौजूदा mWaitRunnable रनर को "जानना" कैसे चाहते हैं कि sText एक बार "स्टेप टू" और फिर "स्टेप थ्री" सेट किया गया था !! तब तक इसे पहली बार (3 सेकंड के बाद) कहा जाता है - sText का मूल्य "चरण तीन" है! एंड्रॉइड प्रोग्रामिंग की कोशिश करने से पहले आपको बुनियादी जावा कौशल से खुद को परिचित करना चाहिए! :-)
जोर्डिड

वास्तव में मैंने जो किया था वह रननीय के अंदर एक काउंटर जोड़ा गया था, यदि यह 1 है, तो पाठ यह होगा, यदि यह 2 है, पाठ यह होगा, आदि
user270811

0

:) गलत तरीके से धागे का उपयोग करना। बस निम्नलिखित करें:

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

टेक्स्ट को सैम टेक्स्टव्यू पर दो बार सेट करने से पहला लिखित टेक्स्ट ओवरराइट हो रहा है। इसलिए दूसरी बार जब हम सेटटेक्स्ट का उपयोग करते हैं तो हम जैसे नए स्ट्रिंग को जोड़ते हैं

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

0

@Zordid @Iambda का उत्तर बहुत अच्छा है, लेकिन मैंने पाया कि अगर मैं डालूं

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

रन में () विधि और

mHandler.postDelayed(mUpdateUITimerTask, 0);

onCreate मेथड में बात को अपडेट करते रहें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.