
En esta entrada se habla sobre un método para indicar el progreso de carga de una operación que puede sustituir al ProgressDialog llamado ProgressBar.
En esta entrada hablaremos sobre otro método de para indicar el progreso de carga de una operación que puede sustituir al ya desactualizado (deprecated) por las nuevas versiones de Android ProgressDialog
; lo que significa que en futuras versiones de Android dejaría de existir este componente de software.
El elemento de interfaz de usuario en cuestión luce de la siguiente forma:

Y se conoce como ProgressBar
; como puedes ver es una especie de barra lateral animada la cual ya ha estado presente en sitios web como YouTube o en la misma aplicación para Android de Youtube entre otras aplicaciones.
Formas de uso de la ProgressBar
Las ProgressBar
pueden ser empleadas para indicar el progreso de una tarea en porcentajes (0% a 100%) o de manera indeterminada como la mostrada en la anterior imagen.
Simplemente hay que indicar que se encuentre visible en tiempos de carga y ocultarla (invisible) cuando ya esté el contenido listo; como podemos darnos cuenta, este elemento de interfaz de usuario tiene el inconveniente que no permite bloquear toda la actividad o fragment que lo ejecute y de esta forma evitar que el usuario interactúe con la interfaz, pero como buena práctica dicho bloqueo debería ser realizado de manera manual ocultando o deshabilitando los elementos de la interfaz que consideremos .
Ahora veamos las opciones que tenemos para emplear la ProgressBar
:
1. ProgressBar determinada
Para mostrar el progreso de la ProgressBar
en forma de porcentajes podemos emplear el atributo android:progress
, también podemos variar los niveles de porcentajes para definir una cota mínima y máxima con los atributos android:min
y android:max
respectivamente:
<ProgressBar
android:id="@+id/determinateBar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:progress="25"/ >
El código anterior muestra cómo crear una ProgressBar
con progreso determinado con un valor establecido por defecto de 25% que por supuesto podemos variar de manera programática con el método setProgress(int)
.
Por supuesto, también existen método programáticos para definir la cuota mínima y máxima:
setMax(int max) setMin(int min)
2. ProgressBar indeterminada
Para la ProgressBar
simplemente debemos de emplear la misma sin los atributos vistos anteriormente; es decir, sin android:progress
, android:min
y android:max
; quedando el código de la siguiente manera:
<ProgressBar
android:id="@+id/indeterminateBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
Puedes consultar la documentación completa en el siguiente enlace: Android Developer ProgressBar.
Caso práctico
En cualquiera de los dos casos anteriores que explicamos, la idea es que al terminar el procesamiento, obtención o cualquier otro proceso que prescinde de mostrar un elemento de carga, ocultar la ProgressBar
; él sigue ejemplo práctico muestra un caso práctico empleando la librería de Retrofit que ya es tema de una entrada posterior; en general, mostramos la ProgressBar
cuando estamos obteniendo los datos del servidor y la ocultamos una vez que el servidor nos dé una respuesta:
public class FeeActivity extends AppCompatActivity {
private ActionBarDrawerToggle mDrawerToggle;
private static final String TAG = FeeActivity.class.getSimpleName();
private RecyclerView rvNotificaciones;
private RelativeLayout rlSinFees;
private ProgressBar progressBar;
private ArrayList<Fee> fees;
private int loanId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fee);
loanId = getIntent().getExtras().getInt("loan_id");
progressBar = (ProgressBar) findViewById(R.id.progressbar);
rvNotificaciones = (RecyclerView) findViewById(R.id.rv_fees);
rlSinFees = (RelativeLayout) findViewById(R.id.rl_sin_fees);
init();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
public void init() {
fees = new ArrayList<>();
generarGridLayout();
cargarCuota();
}
public void generarGridLayout() {
LinearLayoutManager llm = new LinearLayoutManager(this);
rvNotificaciones.setLayoutManager(llm);
rvNotificaciones.setNestedScrollingEnabled(false);
}
public void initAdapter(CuotaAdapter cuotaAdapter) {
rvNotificaciones.setAdapter(cuotaAdapter);
}
public void cargarCuota() {
RestApiAdapter restApiAdapter = new RestApiAdapter();
Gson gson = restApiAdapter.convierteGsonDesearilizadorCuotas();
EndpointsApi endpointsApi = restApiAdapter.establecerConexionRestApi(gson);
Call<FeeResponse> responseCall = endpointsApi.getCuotasDia(UserPreferences.getUsuarioId(FeeActivity.this));
responseCall.enqueue(new Callback<FeeResponse>() {
@Override
public void onResponse(Call<FeeResponse> call, Response<FeeResponse> response) {
FeeResponse feeResponse = response.body();
if (feeResponse != NULL) {
fees = feeResponse.getFees();
}
if (fees.size() == 0) {
rvNotificaciones.setVisibility(View.GONE);
rlSinFees.setVisibility(View.VISIBLE);
}
initAdapter(new CuotaAdapter(fees, FeeActivity.this));
progressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onFailure(Call<FeeResponse> call, Throwable t) {
Log.e("Error", t.toString());
Toast.makeText(FeeActivity.this, getResources().getString(R.string.error_login_local_titulo), Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.INVISIBLE);
}
});
}
}

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter