2012-11-08 2 views
0

나는 asyntask가 있고 진행 중입니다. 텍스트를 TextView로 설정했는데 정상적으로 작동하지만 텍스트 뷰를 재설정하고 ""(이것은 초기 값입니다), postupdate에서 새로운 findviewbyid (r.id.tvProgreso); textview를 업데이트하지만 텍스트는 동일합니다.Textview는 화면이 회전 한 후 asyntask에서 업데이트되지 않습니다.

이 내에서 onCreate 방법입니다 : 내가 디버깅 할 때, 내가 테 정확한 텍스트로 textviex.settext를 볼 수 있지만이 변경되지

@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

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

     } 

의 progressUpdate ..

답변

1

기본적으로 회전은 활동을 다시 만듭니다. 실제로는 새 Activity 객체를 만들고이를 화면에 표시합니다. asynctask는 여전히 더 이상 볼 수없는 이전 Activity를 참조하고, 그 안에있는 TextView를 업데이트합니다 ....

자신이 회전을 처리 할 수 ​​있으므로 Activity가 손상되지 않습니다 as described here, 또는 활동이 제한 될 수 있습니다 세로 모드에서만 사용 가능합니다 (액티비티 태그에 android : screenOrientation = "portrait"추가)

+0

"새"textView를 업데이트 할 수 있습니까? 갤러리가 작동하는 동시에 텍스트 뷰를 업데이트하는 경우 어댑터가있는 갤러리가 있습니까? 방향을 차단할 수 없으며 레이아웃을 변경했기 때문에 활동이 회전 될 때 회전해야합니다. – colymore

+0

신속하고 지저분한 해결책은 매니페스트에서의 활동을 위해'android : configChanges = "orientation | screenSize"'를 추가하는 것입니다. 주제에 대한 자세한 내용을 찾을 수 있습니다 [여기] (http://developer.android.com/guide/topics/resources/runtime-changes.html) –

+0

그래,하지만 할 수 없어 ..;), 감사 – colymore

1

시도의 설정 값이 텍스트 뷰에 속성을 다음

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

문서는 here에 있습니다. 또한 this 게시물을 읽으십시오.

+0

내가 이것을 넣으면, 화면을 회전시킬 때 텍스트를 볼 수 있지만이 변경되지 않습니다. onPreExecute에는 tvprogreso.settext ("text")가 있는데, 항상 텍스트를 볼 수 있습니다. 다른 생각? – colymore

0

방금 ​​Texview 필드가 으로 선언되었습니다. 그것은 역시 의미가 있습니다. 액티비티를 다시 만들면 이전 변수가 새 변수로 바뀝니다. 이전에는 화면 회전에 따라 텍스트보기에 대한 참조가 손실되었지만 정적 표기법으로 인해 하나의 인스턴스 만 유지되고 새로운 인스턴스를 사용하게됩니다.

내 경우 AsycTask 대신 컨테이너 활동에서 사용한 뷰를 업데이트하기 위해 업데이트 된 항목을 반환하는 대화 상자 Fragment에 리스너 패턴이 있습니다.

그런 식으로보기에서 세로보기로 차단할 필요없이 회전 처리기에서 빌드를 사용할 수 있습니다.

관련 문제