cómo cambiar el texto en Android TextView


91

Traté de hacer esto

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

pero por alguna razón, solo aparece el segundo texto cuando lo ejecuto. Creo que podría tener algo que ver con el Thread.sleep()método de bloqueo. Entonces, ¿alguien puede mostrarme cómo implementar un temporizador "asincrónicamente"?

Gracias.


2
La razón por la que solo muestra la segunda línea es porque .setText()reemplaza todo el "widget" con el texto que le indica que configure; INCLUYENDO texto que ya ha puesto allí.
georgiaboy82

Respuestas:


45

Acabo de publicar esta respuesta en el grupo de google de discusión de android

Si solo está tratando de agregar texto a la vista para que muestre "Paso uno: romper el huevo Paso dos: freír el huevo", considere usar en t.appendText("Step Two: fry egg"); lugar det.setText("Step Two: fry egg");

Si desea cambiar completamente lo que está en el TextViewpara que diga "Paso uno: huevo explosivo" en el inicio y luego diga "Paso dos: huevo frito" en un momento posterior, siempre puede usar un

Ejemplo ejecutable que dio el chico triste

Buena suerte


146

Tu onCreate()método tiene varios defectos enormes:

1) onCreate prepara su actividad, de modo que nada de lo que haga aquí será visible para el usuario hasta que finalice este método. Por ejemplo, nunca podrá modificar TextViewel texto de a aquí más de UNA vez, ya que solo se dibujará el último cambio y, por lo tanto, será visible para el usuario.

2) Tenga en cuenta que un programa de Android se ejecutará, de forma predeterminada, en UN solo hilo. Por lo tanto: ¡nunca use Thread.sleep()o Thread.wait()en su hilo principal que es responsable de su interfaz de usuario! (lea "Mantenga su aplicación receptiva" para obtener más información).

Lo que hace la inicialización de su actividad es:

  • ¡por ningún motivo creas un nuevo TextViewobjeto t!
  • eliges tu diseño TextViewen la variable tmás tarde.
  • establece el texto de t(pero tenga en cuenta: ¡se mostrará solo después de que onCreate() finalice y se ejecute el ciclo de eventos principal de su aplicación!)
  • espera 10 segundos dentro de su onCreatemétodo; esto nunca debe hacerse ya que detiene toda la actividad de la interfaz de usuario y definitivamente forzará un ANR (la aplicación no responde, consulte el enlace de arriba).
  • luego, establece otro texto: este se mostrará tan pronto como onCreate()finalice su método y se hayan procesado varios otros métodos del ciclo de vida de la actividad .

La solución:

  1. Establecer texto solo una vez en onCreate(): este debe ser el primer texto que debe estar visible.

  2. Crea un Runnabley unHandler

    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. instale este ejecutable como un controlador, posible en onCreate()(pero lea mis consejos a continuación):

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

Consejo: ¡asegúrese de conocer Activityel ciclo de vida de un! Si haces cosas así, ¡ onCreate()esto solo sucederá cuando Activityse cree tu primera vez! Es posible que Android te mantenga Activityvivo durante un período de tiempo más largo, ¡incluso si no es visible! Cuando un usuario lo "inicia" de nuevo, y todavía existe, ¡ya no verá su primer texto!


=> ¡Instale siempre los controladores onResume()y desactívelos onPause()! De lo contrario, obtendrá "actualizaciones" cuando Activityno esté visible en absoluto. En su caso, si desea volver a ver su primer texto cuando se reactive, debe configurarlo onResume(), onCreate()¡ no !


14

La primera línea de la nueva vista de texto no es necesaria

t=new TextView(this); 

puedes hacer esto

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

en cuanto a un hilo de fondo que duerme aquí es un ejemplo, pero creo que hay un temporizador que sería mejor para esto. aquí hay un enlace a un buen ejemplo usando un temporizador en su lugar 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

@ usuario264892

Descubrí que cuando usaba una variable String necesitaba prefijar una String de "" o lanzarla explícitamente a CharSequence.

Entonces en lugar de:

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

tratar:

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

o:

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

o, dado que su cadena no es dinámica, aún mejor:

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

3

según su consejo, estoy usando handle y runnables para cambiar / cambiar el contenido de TextView usando un "temporizador". por alguna razón, cuando se ejecuta, la aplicación siempre omite el segundo paso ("Paso dos: freír huevo") y solo muestra el último (tercer) paso ("Paso tres: servir huevo").

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
¡Esto no puede funcionar! Solo hay UN controlador: ¿cómo quieres que tu único corredor mWaitRunnable existente "sepa" que sText se configuró una vez en el "Paso dos" y luego en el "Paso tres"? En el momento en que se llama por primera vez (después de 3 segundos), el valor de sText es simplemente "Paso tres". ¡Debe familiarizarse con las habilidades básicas de Java antes de probar la programación de Android! :-)
Zordid

en realidad lo que finalmente hice fue añadido un contador dentro del ejecutable, si es 1, el texto será esto, si es 2, el texto estará presente, etc
user270811

0

:) Estás usando el hilo de forma incorrecta. Simplemente haz lo siguiente:

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

Eso es.


0

configurar el texto en sam textview dos veces es sobrescribir el primer texto escrito. Entonces, la segunda vez que usamos settext, simplemente agregamos la nueva cadena como

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

0

@Zordid @Iambda la respuesta es genial, pero encontré que si pongo

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

en el método run () y

mHandler.postDelayed(mUpdateUITimerTask, 0);

en el método onCreate haz que la cosa siga actualizándose.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.