0

私はasyntaskを持っていて、進行中の更新でテキストを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

次の属性をTextViewに設定してみてください。

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

ここでドキュメントを見つけることができます。また、この投稿を読んでみてください。

于 2012-11-08T13:31:53.530 に答える
1

デフォルトでは、ローテーションによってアクティビティが再作成されます。実際に新しいActivityオブジェクトを作成し、それを画面に表示します。asynctaskは、表示されなくなった古いアクティビティを引き続き参照し、その中のTextViewを更新します...。

回転を自分で処理して、ここで説明するようにアクティビティが破棄されないようにするか、アクティビティをポートレートモードでのみ使用できるように制限することができます(アクティビティタグにandroid:screenOrientation = "portrait"を追加してください)

于 2012-11-08T13:35:20.917 に答える
0

TexViewフィールドを静的であると宣言しました。それも理にかなっています。アクティビティを再作成すると、古い変数が新しい変数に置き換えられます。以前の画面回転では、テキストビューへの参照が失われましたが、静的な表記のため、1つのインスタンスのみが保持され、新しいインスタンスを使用するように強制されます。

私の場合、AsycTaskの代わりに、ビューを更新するためにコンテナーアクティビティで使用していた更新されたアイテムを返すダイアログフラグメントにリスナーパターンがありました。

そうすれば、組み込みの回転ハンドラーを使用できるだけでなく、ビューをポートレートビューにブロックする必要もありません。

于 2016-01-16T11:37:15.500 に答える