0

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

这是我的 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 带有正确的文本,但这不会改变..

4

3 回答 3

1

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

您可以自己处理旋转,因此 Activity 不会被销毁,如此处所述,或者您可以限制您的活动仅在纵向模式下可用(将 android:screenOrientation="portrait" 添加到活动标签)

于 2012-11-08T13:35:20.917 回答
1

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

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

您可以在此处找到有关它的文档。也尝试阅读这篇文章。

于 2012-11-08T13:31:53.530 回答
0

我刚刚将 TexView 字段声明为static。这也很有意义。当它重新创建活动时,旧变量被新变量替换。在屏幕旋转的早些时候,它失去了对 textview 的引用,但由于静态表示法,只保留了一个实例并强制它使用新的实例。

在我的例子中,我在对话框片段中有一个侦听器模式,而不是 AsycTask,它返回一个更新的项目,我在容器活动中使用它来更新视图。

这样您就可以使用内置旋转处理程序,而无需将视图阻止为纵向视图。

于 2016-01-16T11:37:15.500 回答