2012-11-08 47 views
0

我有一個asyntask,並在進行更新我設置文本一個TextView,這工作正常,但隨後我旋轉屏幕,textview重置並設置「」(這是初始值),在postupdate我有一個新的findviewbyid(r.id.tvProgreso);並更新textview,但文本將相同。Textview在屏幕旋轉後不更新asposeask

這是我的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); 

    } 

和progressUpdate在asyntask

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

     } 

當我調試,我看到TE正確的文本的textviex.settext,但是這不會改變..

回答

1

默認情況下旋轉重新創建您的活動。它實際上創建了一個新的Activity對象,並將其顯示在屏幕上。該asynctask仍然指的是不再可見的舊活動,並更新TextView ...

你可以自己處理旋轉,因此活動不會被銷燬as described here,或者你可以限制你的活動是僅在肖像模式下可用(將android:screenOrientation =「肖像」添加到活動標記中)

+0

我可以更新我的「新」textView?我有一個畫廊,有一個適配器,如果我更新textview同時該畫廊將工作?我不能阻止方向,我需要旋轉活動時被破壞,因爲我改變了佈局。 – colymore

+0

快速和骯髒的解決方案是在清單中爲您的活動添加'android:configChanges =「orientation | screenSize」'。更多的話題可以在這裏找到[http://developer.android.com/guide/topics/resources/runtime-changes.html] –

+0

是的,但我不能這樣做;;),謝謝 – colymore

1

嘗試將以下屬性設置爲TextView:

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

你可以找到它的文檔here。也請嘗試閱讀this後。

+0

如果我把這個,當我旋轉屏幕,我可以看到文本,但這不改變。在onPreExecute我有一個tvprogreso.settext(「文本」),我總是看到文本。任何其他想法? – colymore

0

我剛宣佈TexView字段爲static。它也是有意義的。當它重新創建活動時,舊的變量被替換爲新的變量。在屏幕旋轉早期,它失去了它對textview的引用,但是由於靜態符號只保留了一個實例並強制它使用新的實例。

在我的情況下,而不是一個AsycTask,我有一個偵聽器模式在對話框片段返回一個更新的項目,我在容器活動中使用更新視圖。

這樣您就可以使用循環處理程序中的構建以及不需要將視圖阻止到縱向視圖。