Estoy usando una barra de progreso personalizada. Ahora, mientras se realiza una tarea, estoy mostrando la barra de progreso, pero el usuario aún puede interactuar con las vistas y los controles. ¿Cómo desactivo la interacción del usuario en la vista completa tal como lo hace un ProgressDialog, cuando está visible?
¿Necesito 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 la identificación de mi parentView y desactivarla? Pero entonces no podré atenuar el fondo, como sucede cuando aparece un cuadro de diálogo en la vista / Actividad / Fragmento. ¿Correcto?
Solo quiero saber la forma de no permitir que el usuario interactúe mientras la barra de progreso está visible.
Gracias
fuente
Respuestas:
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);
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, muestra la barra de progreso y deshabilita 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 retrocede, eliminas la barra de progreso y retienes la interacción del usuario.
@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 desactivada y atenuada, debe agregar en su archivo de diseño xml un diseño lineal que llene el primario. Establezca su fondo en # B0000000 y su
visibilty
aGONE
. Luego, establezca programáticamente suvisibility
enVISIBLE
.¡Espero que esto ayude!
fuente
He solucionado este problema agregando un diseño raíz al archivo
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>
Hizo clic en el diseño raíz
android:clickable="true"
NOTA: En mi vista principal, tenía
RelativeLayout
como raíz y agregué el código mencionado anteriormente dentro del diseño raíz en la última posición (último hijo).¡¡Espero que esto ayude!!
fuente
FrameLayout
lugar de unoLinearLayout
, aparte de eso, esta respuesta es perfecta y simplemente funciona. Gracias Nivaracaba de configurar:
android:clickable="true"
en tu xml
¡Solo esto hace magia!
fuente
Utilice el método predeterminado del documento progressbar.setCancelable (false)
fuente
Haz un diálogo con fondo transparente. El problema
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
es que cuando la aplicación pasa a segundo plano y regresa, 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 cuadro de diálogo transparente y si desea establecer un tiempo para ocultar / mostrar. Haga esto en un hilo ejecutable. Entonces 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);
fuente
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 capturan todo el enfoque y se pueden hacer 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);
fuente
Para extender (juego de palabras intencionado) en la Respuesta aceptada :
Cuando usa kotlin, puede usar funciones de extensión. De esa manera, tiene un método rápido y atractivo para bloquear y desbloquear la interfaz de usuario.
fun AppCompatActivity.blockInput() { window.setFlags( WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) } fun AppCompatActivity.unblockInput() { window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) } fun AppCompatActivity.blockInputForTask(task: () -> Unit) { blockInput() task.invoke() unblockInput() }
Puede utilizar las funciones de bloqueo y desbloqueo en su actividad. Además, puede agregar más funciones, como mostrar un brindis o algo.
Cuando lo usa en una vista personalizada o en cualquier otra vista, simplemente puede convertir el contexto a la actividad y usar las funciones.
Úselo
blockInputForTask
para rodear tareas lineales simplesblockInput
yunblockInput
cuando se necesiten en diferentes ámbitos.Puedes usar
blockInputForTask
así:blockInputForTask { // Your lines of code // Can be multiple lines }
fuente