কীভাবে অ্যান্ড্রয়েড টেক্সটভিউতে পাঠ্য পরিবর্তন করতে হয়


92

আমি এটি করার চেষ্টা করেছি

@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()পদ্ধতিটি অবরুদ্ধ করার সাথে এর কিছু থাকতে পারে । সুতরাং কেউ কীভাবে টাইমারকে "অবিচ্ছিন্নভাবে" প্রয়োগ করতে পারেন তা আমাকে দেখাতে পারে?

ধন্যবাদ


4
এটি কেবল দ্বিতীয় লাইনটি দেখানোর কারণ হ'ল .setText()এটি আপনি যে পাঠ্যটিকে সেট করতে বলছেন তার সাথে পুরো "উইজেট" প্রতিস্থাপন করে; আপনি ইতিমধ্যে সেখানে রেখেছেন এমন পাঠ্য অন্তর্ভুক্ত।
georgiaboy82

উত্তর:


46

আমি এই উত্তরটি স্রেফ অ্যান্ড্রয়েড-আলোচনা গুগল গ্রুপে পোস্ট করেছি

আপনি যদি কেবলমাত্র ভিউটিতে পাঠ্য যুক্ত করার চেষ্টা করছেন তবে এটি "ধাপ এক: বিস্ফোরণ ডিম ধাপ দুই: ডিম ভাজা" প্রদর্শন করে 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- এটি কখনই করা উচিত নয় কারণ এটি সমস্ত ইউআই ক্রিয়াকলাপ বন্ধ করে দেয় এবং অবশ্যই একটি এএনআরকে বাধ্য করবে (অ্যাপ্লিকেশন সাড়া দিচ্ছে না, উপরের লিঙ্কটি দেখুন!)
  • তারপরে আপনি অন্য পাঠ্যটি সেট করলেন - আপনার onCreate()পদ্ধতিটি শেষ হওয়ার সাথে সাথে এটি প্রদর্শিত হবে এবং অন্যান্য বেশ কয়েকটি ক্রিয়াকলাপের জীবনচক্রের পদ্ধতিগুলি প্রক্রিয়া করা হবে!

সমাধান:

  1. কেবল একবার পাঠ্য সেট করুন onCreate()- এটি অবশ্যই প্রথম পাঠ্য যা দৃশ্যমান হওয়া উচিত।

  2. একটি Runnableএবং একটি তৈরি করুন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

@ ব্যবহারকারী264892

আমি দেখতে পেয়েছি যে স্ট্রিং ভেরিয়েবলটি ব্যবহার করার সময় আমাকে স্ট্রিংয়ের স্ট্রিং দিয়ে উপসর্গ করা বা স্পষ্টভাবে চরসেকেন্সে কাস্ট করা প্রয়োজন।

এর পরিবর্তে:

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

4
এটি কাজ করতে পারে না! এখানে কেবলমাত্র একজন হ্যান্ডলার রয়েছে - আপনি কীভাবে চান যে আপনার একমাত্র বিদ্যমান এমওয়াইটআরনেবল রানার "জানতে" জানতে পারেন যে এসটেক্সটটি একবার "দ্বিতীয় ধাপ" এবং তারপরে "তিন ধাপ" তে সেট করা হয়েছিল !! ?? সময় হিসাবে এটি প্রথমবার বলা হয় (3 সেকেন্ড পরে) - sText এর মান কেবল "তিন ধাপ"! অ্যান্ড্রয়েড প্রোগ্রামিংয়ের চেষ্টা করার আগে আপনার নিজের জাভা বুনিয়াদের সাথে পরিচিত হওয়া উচিত! :-)
জোর্ডিড

আসলে আমি যা করলাম তা শেষ পর্যন্ত রানওয়েবলের অভ্যন্তরে একটি কাউন্টার যুক্ত করা হয়েছিল, যদি এটি 1 হয় তবে পাঠ্যটি এটি হবে, যদি এটি 2 হয় তবে লেখাটি এটি হবে,
ব্যবহারকারী 270811

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

@ জোর্ডিড @ ইম্বদা উত্তরটি দুর্দান্ত, তবে আমি যদি খুঁজে পাই তবে তা পেয়েছি

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

রান () পদ্ধতিতে এবং

mHandler.postDelayed(mUpdateUITimerTask, 0);

অনক্রিয়েট পদ্ধতিতে জিনিসটিকে আপডেট রাখতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.