urtato questo problema me stesso e sono riuscito a farlo funzionare :)
ho usato il AsyncTask
per gestire lo sfondo attività/thread, ma l'idea dovrebbe essere la stessa di usare Runnable/Handler
(anche se AsyncTask
sembra più bello).
Quindi, questo è quello che ho fatto ... inserire setContentView(R.layout.my_screen);
nel metodo onPostExecute
! (. Vale a dire invece del metodo onCreate
)
modo che il codice simile a questa:
public class MyScreen extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.my_screen); !!! Don't setContentView here... (see bottom)
new MySpecialTask().execute();
}
private int somethingThatTakesALongTime() {
int result;
// blah blah blah
return result;
}
private void updateTheUiWithResult(int result) {
// Some code that changes the UI
// For exampe:
TextView myTextView = (TextView) findViewById(R.id.result_text);
myTextView.setText("Result is: " + result);
ProgressBar anyProgressBar = (ProgressBar) findViewById(R.id.custom_progressbar);
anyProgressBar.setProgressDrawable(res.getDrawable(R.drawable.progressbar_style));
anyProgressBar.setMax(100);
anyProgressBar.setProgress(result);
}
private class MySpecialTask extends AsyncTask<String, Void, Integer> {
ProgressDialog mProgressDialog;
@Override
protected void onPreExecute() {
mProgressDialog = ProgressDialog.show(MyScreen.this, "", "Calculating...\nPlease wait...", true);
}
@Override
protected Integer doInBackground(String... strings) {
return somethingThatTakesALongTime();
}
@Override
protected void onPostExecute(Integer result) {
mProgressDialog.dismiss();
setContentView(R.layout.my_screen); // setContent view here... then it works...
updateTheUiWithResult(result);
}
}
}
Per essere onesti, il motivo per cui è necessario chiamare in setContentView
onPostExecute
non ho idea ... ma così facendo significa che è possibile impostare stili personalizzati per le barre di avanzamento (e non scompaiono su di voi!)
Di solito, si modifica l'avanzamento tramite 'setProgress()'. Sostituire il mazzo "Drawable" è inusuale, ancora più strano farlo da un 'Handler' dopo che la barra è già stata renderizzata. Cosa stai cercando di ottenere qui? – CommonsWare
Voglio cambiare il colore della barra dei programmi quando il valore ha raggiunto un determinato valore. – Martin
Hai mai trovato la risposta? Attualmente ho lo stesso problema (oltre un anno dopo). Questo è solo un grosso insetto? – Peanut