Ich verwende eine benutzerdefinierte ProgressBar. Während eine Aufgabe ausgeführt wird, wird der Fortschrittsbalken angezeigt, der Benutzer kann jedoch weiterhin mit den Ansichten und Steuerelementen interagieren. Wie deaktiviere ich die Benutzerinteraktion in der gesamten Ansicht wie ein ProgressDialog, wenn er sichtbar ist?
Muss ich eine transparente Ansicht über der Hauptansicht verwenden und den Fortschrittsbalken in dieser Ansicht anzeigen und diese Ansicht ausblenden, sobald eine Aufgabe abgeschlossen ist?
Oder einfach die ID meiner Elternansicht abrufen und deaktivieren? Aber dann kann ich den Hintergrund nicht dimmen, genau wie wenn ein Dialogfeld in der Ansicht / Aktivität / Fragment angezeigt wird. Richtig?
Ich möchte nur wissen, wie der Benutzer von jeglicher Interaktion ausgeschlossen werden kann, während der Fortschrittsbalken sichtbar ist.
Vielen Dank
quelle
Antworten:
Um die Benutzerinteraktion zu deaktivieren, müssen Sie nur den folgenden Code hinzufügen
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
Um die Benutzerinteraktion wiederherzustellen, müssen Sie nur den folgenden Code hinzufügen
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
Fügen Sie Ihrer XML einen Fortschrittsbalken hinzu
<ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressBar" android:visibility="gone"/>
Wenn Sie in MainActivity eine Taste drücken, wird der Fortschrittsbalken angezeigt und die Benutzerinteraktion deaktiviert.
@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); } }); }
Und wenn der Benutzer zurückgedrückt wird, entfernen Sie den Fortschrittsbalken wieder und behalten die Benutzerinteraktion bei. So etwas
@Override public void onBackPressed() { super.onBackPressed(); mProgressBar.setVisibility(View.GONE); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); }
Wenn Sie eine Funktion zum Deaktivieren und Ausgrauen der Anzeige hinzufügen möchten, müssen Sie in Ihrer XML-Layoutdatei ein lineares Layout hinzufügen, das das übergeordnete Layout ausfüllt. Setzen Sie den Hintergrund auf # B0000000 und
visibilty
aufGONE
. Dann ist es programmatisch festgelegtvisibility
zuVISIBLE
.Ich hoffe das hilft!
quelle
Ich habe dieses Problem behoben, indem ich dem das Root-Layout hinzugefügt habe
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>
Das Root-Layout anklickbar gemacht
android:clickable="true"
HINWEIS: In meiner Hauptansicht hatte ich
RelativeLayout
als Root und habe den oben genannten Code im Root-Layout an der letzten Position (letztes Kind) hinzugefügt.Hoffe das hilft!!
quelle
FrameLayout
anstelle von aLinearLayout
, anders als das, diese Antwort perfekt ist und einfach funktioniert. Danke Nivareinfach einstellen:
android:clickable="true"
in Ihrer XML
Nur das macht Magie!
quelle
Verwenden Sie die Standardmethode für Dokumente progressbar.setCancelable (false).
quelle
Machen Sie einen Dialog mit transparentem Hintergrund. Das Problem dabei
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
ist, dass Benutzer, die in den Hintergrund treten und zurückkehren, mit UI-Komponenten interagieren können, was viel mehr Handhabung bedeutet. Erstellen Sie zum Blockieren der Benutzeroberfläche einen transparenten Dialog und legen Sie die Zeit für das Ausblenden / Anzeigen fest. Tun Sie dies in einem ausführbaren Thread. Die Lösung wird also seinpublic 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);
quelle
Erstellen Sie Ihr übergeordnetes Layout als relatives Layout und fügen Sie Folgendes hinzu:
<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>
Wenn Sie schwebende Schaltflächen in Ihrer Benutzeroberfläche haben, erfassen diese immer noch den gesamten Fokus und bleiben anklickbar, wenn der Fortschrittsbalken sichtbar ist. für diese Verwendung: (wenn Ihre Prog-Leiste sichtbar ist und aktivieren Sie sie wieder, wenn Sie Ihre Prog-Leiste unsichtbar machen / verschwinden lassen)
fb.setEnabled(false);
quelle
Erweiterung (Wortspiel beabsichtigt) auf die akzeptierte Antwort :
Wenn Sie Kotlin verwenden, können Sie Erweiterungsfunktionen verwenden. Auf diese Weise haben Sie eine schnelle und gut aussehende Methode zum Blockieren und Entsperren der Benutzeroberfläche.
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() }
Sie können die Sperr- und Entsperrfunktionen in Ihrer Aktivität verwenden. Sie können auch weitere Funktionen wie das Anzeigen eines Toasts oder ähnliches hinzufügen.
Wenn Sie es in einer benutzerdefinierten Ansicht oder einer anderen Ansicht verwenden, können Sie den Kontext einfach in Aktivität umwandeln und die Funktionen verwenden.
Verwenden Sie
blockInputForTask
diese Option , um einfache lineare Aufgaben zu umgebenblockInput
undunblockInput
wann sie in verschiedenen Bereichen benötigt werden.Sie können
blockInputForTask
wie folgt verwenden:blockInputForTask { // Your lines of code // Can be multiple lines }
quelle