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

이 답변을 android-discuss Google 그룹에 게시했습니다.

보기에 텍스트를 추가하여 "1 단계 : 달걀 날치기 2 단계 : 달걀 튀김"을 t.appendText("Step Two: fry egg"); 표시하는 경우t.setText("Step Two: fry egg");

TextView시작할 때 "1 단계 : 계란을 튀기십시오"라고 표시되고 나중에 "2 단계 : 계란 튀김"이라고 표시되도록 내용을 완전히 변경하려면 항상

실행 가능한 예제 sadboy가 준

행운을 빕니다


146

귀하의 onCreate()방법에는 몇 가지 큰 결함이 있습니다.

1) 활동을 onCreate 준비 합니다- 이 방법이 완료 될 때까지 여기에서 수행하는 작업 은 사용자에게 표시 되지 않습니다 ! 예를 들어 , 마지막 변경 사항 만 그려져 사용자에게 표시되므로 TextView여기서의 텍스트를 번 이상 변경할 수 없습니다!

2) Android 프로그램은 기본적으로 하나의 스레드에서만 실행 됩니다. 따라서 UI를 담당하는 주 스레드 Thread.sleep()또는 사용하지 마십시오 Thread.wait()! ( 자세한 내용은 "앱 반응 형 유지" 를 참조하십시오!)

무엇 당신의 초기화 하여 활동의가하는 것은 :

  • 이유없이 새 TextView개체 를 만듭니다 t!
  • 나중에 TextView변수에서 레이아웃을 선택합니다 t.
  • 당신은 텍스트를 설정합니다 t(하지만 명심하십시오 : 그것은 완료되고 응용 프로그램의 메인 이벤트 루프가 실행 된 후에 만 표시 onCreate()됩니다!)
  • 메서드 내 에서 10 초 동안 기다립니다. 모든 UI 활동을 중지하고 ANR을 강제로 강제 하므로 절대로 수행해서는 안됩니다 (응용 프로그램이 응답하지 않음, 위 링크 참조).onCreate
  • 그런 다음 다른 텍스트를 설정합니다.이 텍스트는 onCreate()메서드가 완료되고 다른 여러 활동 수명주기 메서드가 처리 되는 즉시 표시됩니다 !

해결책:

  1. 텍스트를 한 번만 설정하십시오 onCreate(). 표시되어야하는 첫 번째 텍스트 여야합니다.

  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. 이 실행 파일을 가능한 핸들러로 설치하십시오 onCreate()(하지만 아래 조언을 읽으십시오).

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

조언 : Activity의 수명주기 를 알고 있어야합니다 ! 당신이 그런 일을한다면 onCreate()이것은 당신 Activity처음 생성 되었을 때만 일어날 것 입니다 ! Android는 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

뿡 빵뀨

String 변수를 사용할 때 ""문자열을 접두사로 사용하거나 명시 적으로 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...");

3

귀하의 조언에 따라 "타이머"를 사용하여 TextView의 내용을 전환 / 변경하기 위해 핸들과 실행 파일을 사용하고 있습니다. 어떤 이유로 실행시 앱은 항상 두 번째 단계 ( '2 단계 : 계란 튀김')를 건너 뛰고 마지막 (세 번째) 단계 만 표시합니다 ( '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);      
    ...
}

1
이것은 작동하지 않습니다! 핸들러는 하나뿐입니다. 기존의 유일한 mWaitRunnable 실행자가 sText가 한 번 "2 단계"로 설정된 다음 "3 단계"로 설정되었음을 "알기"를 원하는 방법은 무엇입니까 !! ?? 처음 호출 될 때 (3 초 후)-sText의 값은 단순히 "Step three"입니다! Android 프로그래밍을 시도하기 전에 기본적인 Java 기술을 숙지해야합니다! :-)
Zordid 2010

이 2 인 경우가 1 인 경우 실제로 내가 마지막으로 실행 가능한 내부 카운터를 첨가하여 무엇을했는지, 텍스트이 될 것입니다, 텍스트 등이 될 것입니다
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

텍스트를 sam textview로 두 번 설정하면 처음 작성된 텍스트를 덮어 씁니다. 따라서 두 번째로 settext를 사용할 때 다음과 같이 새 문자열을 추가합니다.

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

0

@Zordid @Iambda 대답은 훌륭하지만

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

run () 메서드에서

mHandler.postDelayed(mUpdateUITimerTask, 0);

onCreate 메소드에서 계속 업데이트됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.