studio progressbar programacion móviles desarrollo curso aplicaciones android user-interface progress-bar

programacion - ¿Cómo deshabilitar la interacción del usuario mientras que ProgressBar es visible en Android?



progressbar android (6)

Estoy usando una barra de progreso personalizada. Ahora, mientras se realiza una tarea, muestro la barra de progreso, pero el usuario aún puede interactuar con las vistas y los controles. ¿Cómo deshabilito la interacción del usuario en vista completa como lo hace un ProgressDialog, cuando está visible?

¿Debo usar una vista transparente en la parte superior de la vista principal y mostrar la barra de progreso en esa vista y ocultar esa vista una vez que se complete una tarea?

¿O simplemente obtener el ID de mi parentView y configurarlo deshabilitado? Pero entonces no podré atenuar el fondo, tal como ocurre cuando aparece un diálogo en la vista / Actividad / Fragmento. ¿Derecha?

Solo quiero saber la forma de no permitir al usuario cualquier interacción mientras la barra de progreso esté visible.

Gracias


Su pregunta: ¿Cómo deshabilitar la interacción del usuario mientras ProgressBar es visible en Android?

Para deshabilitar la interacción del usuario solo necesita agregar el siguiente código

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

Para recuperar la interacción del usuario, solo necesita agregar el siguiente código

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

Aquí hay un ejemplo: Nota: Le estoy dando solo un ejemplo para mostrar cómo deshabilitar o retener la interacción del usuario

Agrega una barra de progreso en tu xml. Algo como esto

<ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressBar" android:visibility="gone"/>

En MainActivity, cuando se presiona un botón, se muestra la barra de progreso y se desactiva la interacción del usuario.

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImageView = (ImageView) findViewById(R.id.imageView); mProgressBar = (ProgressBar) findViewById(R.id.progressBar); mImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mProgressBar.setVisibility(View.VISIBLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); } }); }

Y cuando el usuario ha vuelto a presionar, se quita la barra de progreso y se retiene la interacción del usuario. Algo así

@Override public void onBackPressed() { super.onBackPressed(); mProgressBar.setVisibility(View.GONE); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); }

Si desea agregar una función de visualización deshabilitada y en gris, debe agregar en su archivo de diseño XML un diseño lineal que llene al padre. Establezca su fondo en # B0000000 y su visibilidad en Gone. Que programáticamente establezca su visibilidad a Visible.

¡Espero que esto ayude!


Hacer un diálogo con fondo transparente. El problema con getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); es cuando la aplicación entrará en segundo plano y volverá el usuario podrá interactuar con los componentes de la interfaz de usuario, mucho más manejo. Entonces, para bloquear la interfaz de usuario, haga un diálogo transparente y si desea establecer el tiempo para ocultar / mostrar. Haga esto en un hilo ejecutable. Así que la solución será

public class TransparentDialogHelper { private Dialog overlayDialog; @Inject public TransparentDialogHelper() { } public void showDialog(Context context) { if (AcmaUtility.isContextFinishing(context)) { return; } if (overlayDialog == null) { overlayDialog = new Dialog(context, android.R.style.Theme_Panel); overlayDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED); } overlayDialog.show(); } public void hideDialog() { if (overlayDialog == null || AcmaUtility.isContextFinishing(overlayDialog.getContext())) { return; } overlayDialog.cancel(); } } -------- Timer Handler handler = new Handler(); handler.postDelayed( () -> { view.hideProgress(); }, 2000);


Haga su diseño principal como Diseño relativo y agregue esto:

<RelativeLayout ... > <other layout elements over which prog bar will appear> <RelativeLayout android:id="@+id/rl_progress_bar" android:layout_width="match_parent" android:clickable="true" android:layout_height="match_parent" > <ProgressBar android:id="@+id/pb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:indeterminateOnly="true" style="@android:style/Widget.DeviceDefault.ProgressBar" android:theme="@style/AppTheme.MyProgressBar" /> </RelativeLayout>

Si tiene botones flotantes en su interfaz de usuario, aún así capturan todo el enfoque y siguen haciendo clic cuando la barra de progreso está visible. para este uso: (cuando su barra de progreso esté visible y vuelva a habilitarlos cuando haga que su barra de progreso sea invisible / desaparezca)

fb.setEnabled(false);


He solucionado este problema agregando diseño de raíz a la ProgressBar .

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:clickable="true" android:gravity="center" android:visibility="gone" android:id="@+id/progress"> <ProgressBar style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:indeterminate="true" android:indeterminateTintMode="src_atop" android:indeterminateTint="@color/primary"/> </LinearLayout>

Hecho el diseño de la raíz pulsable

android:clickable="true"

NOTA: En mi vista principal, tenía RelativeLayout como root y he agregado el código mencionado anteriormente dentro del diseño de root en la última posición (último hijo).

¡¡Espero que esto ayude!!


Utilice el método por defecto de documento progressbar.setCancelable (falso)


acaba de establecer:

android:clickable="true"

en tu xml

<ProgressBar...

¡Solo esto hace magia!