屏幕旋转后,Textview不会在asynctask中更新

时间:2012-11-08 13:25:14

标签: android rotation android-asynctask textview

我有一个asyntask,并且正在进行更新我设置文本TextView,这工作正常,但随后我旋转屏幕,textview重置并设置“”(这是初始值),在postupdate我有一个新的findviewbyid(r.id.tvProgreso);并且它会更新textview,但文本将是相同的。

这是我的onCreate方法:

  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_incio);

        if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.HONEYCOMB_MR2) {
            ActionBar actionBar = getActionBar();
            actionBar.hide();

        }
        contexto = getApplicationContext();
        datos = new ArrayList<Integer>();

        recojeDatosDeSesion(savedInstanceState);
        adaptador = new AdaptadorImagenes(contexto);

        if (getLastNonConfigurationInstance() != null) {
            adaptador = (AdaptadorImagenes) getLastNonConfigurationInstance();
        }

        // Layout
        etEmail = (EditText) findViewById(R.id.etEmail);
        etPassword = (EditText) findViewById(R.id.etPassword);
        tvProgreso = (TextView) findViewById(R.id.tvProgreso);
        listaHorizontalImagenes = (Gallery) findViewById(R.id.galeria);

        listaHorizontalImagenes.setGravity(Gravity.LEFT);
        listaHorizontalImagenes.setAdapter(adaptador);
        listaHorizontalImagenes.setSelection(0);

        btnDescargar = (Button) findViewById(R.id.btnDescargar);

        clickDescargar = new OnClickListener() {

            @Override
            public void onClick(View v) {

                if (!descargaActiva) {


                    email = etEmail.getText().toString();
                    password = etPassword.getText().toString();

                    if (validaDatos(email, password)) {

                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                        new DescargaFotos().execute();
                        descargaActiva = true;
                        Toast.makeText(contexto, "Comienza la descarga.", Toast.LENGTH_SHORT).show();
                        tvProgreso.setText("Descargando fotos..");

                    }

                } else {
                    Toast.makeText(contexto, "Descarga en proceso", Toast.LENGTH_LONG).show();
                }
            }
        };

        if (descargaActiva)
            btnDescargar.setOnClickListener(null);
        else
            btnDescargar.setOnClickListener(clickDescargar);

    }

和asyntask中的progressUpdate

@Override
        protected void onProgressUpdate(Integer... progreso) {

            // Actualizo el progreso
            progresoImagenes = progreso[0];             
            actualizaTexto(progreso[0]);
            adaptador.addItem(progreso[0]);

        }



private void actualizaTexto(Integer progreso) {

            tvProgreso = (TextView) findViewById(R.id.tvProgreso);
            tvProgreso.setText(progreso.toString() + " de " + numeroDeFotos + " fotos.");

        }

当我调试时,我看到带有正确文本的textviex.settext,但这不会改变..

3 个答案:

答案 0 :(得分:1)

尝试将以下属性设置为TextView:

<TextView 
 ... 
 android:freezesText="true" />

您可以在其上找到文档here。另请尝试阅读this帖子。

答案 1 :(得分:1)

默认情况下,轮播会重新创建您的活动。它实际上创建了一个新的Activity对象,并在屏幕上显示。 asynctask仍然引用了不再可见的旧Activity,并更新了TextView ....

您可以自己处理旋转,因此Activity不会被销毁as described here,或者您可以将您的活动限制为仅在纵向模式下可用(将android:screenOrientation =“portrait”添加到活动标记)

答案 2 :(得分:0)

我刚刚宣布TexView字段是静态。这也很有道理。重新创建活动时,旧变量将替换为新变量。在屏幕旋转之前,它失去了对textview的引用,但由于静态符号,只保留一个实例并强制它使用新实例。

在我的情况下,而不是AsycTask,我在对话框片段中有一个监听器模式片段返回我在容器活动中使用的更新项目以更新视图。

这样你就可以使用内置旋转处理程序,也不需要阻止视图到纵向视图。