2016-04-28 7 views
13

Ich verwende eine benutzerdefinierte ProgressBar. Jetzt, während eine Aufgabe ausgeführt wird, zeige ich den Fortschrittsbalken an, aber der Benutzer kann weiterhin mit den Ansichten und Steuerelementen interagieren. Wie deaktiviere ich die Benutzerinteraktion in der gesamten Ansicht genau wie ein ProgressDialog, wenn es sichtbar ist.Wie kann die Benutzerinteraktion deaktiviert werden, während ProgressBar in Android sichtbar ist?

Muss ich eine transparente Ansicht oben auf der Hauptansicht verwenden und den Fortschrittsbalken in dieser Ansicht anzeigen und diese Ansicht ausblenden, sobald eine Aufgabe abgeschlossen ist.

Oder einfach die ID meiner ParentView und deaktivieren Sie es? Aber dann kann ich den Hintergrund nicht mehr abblenden, so wie es passiert, wenn ein Dialog in der Ansicht/Aktivität/Fragment erscheint. Recht?

Ich möchte nur den Weg, um den Benutzer von jeder Interaktion zu verbieten, während die Fortschrittsleiste sichtbar ist.

Dank

+0

Mögliche Duplikat [Custom Drawable für ProgressBar/ProgressDialog] (http: // Stackoverflow. com/questions/2819778/custom-drawable-for-progressbar-progressdialog) –

+2

@ txteclipse Ich möchte nicht Fortschrittsbalken anpassen, das habe ich bereits getan. Also, meine Frage ist nicht doppelt. Ich möchte nur Benutzerinteraktion deaktivieren, während der Fortschrittsbalken sichtbar ist. Auf die gleiche Weise, wenn ein ProgressDialog sichtbar ist, kann der Benutzer nicht mit anderen UI-Steuerelementen interagieren, ohne den Fortschrittsdialog zu verwerfen. Nun, wie ist meine Frage ein Duplikat dieser Frage. Meine Frage bezieht sich nicht einmal im entferntesten auf die Anpassung. –

+0

Wenn Sie alle Funktionen eines Dialogs wünschen, sollten Sie einen Dialog verwenden. Modalität ist nicht trivial zu implementieren: Die akzeptierte Antwort blockiert beispielsweise die Interaktion mit der Tastatur nicht. Die zweite Antwort in der verknüpften Frage veranschaulicht, wie benutzerdefinierte ProgressBar-Ressourcen mit einem ProgressDialog verwandt werden. Wenn dies Ihren Anforderungen nicht entspricht, können Sie ein [benutzerdefiniertes Layout] (http://developer.android.com/guide/topics/ui/dialogs.html#CustomLayout) mit Ihrer ProgressBar verwenden. –

Antwort

38

Ihre Frage: Wie wird die Interaktion mit dem Benutzer deaktivieren, während ProgressBar sichtbar in Android ist?

die Interaktion mit dem Benutzer deaktivieren Sie müssen nur

den folgenden Code hinzufügen
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 

Sie nur Interaktion mit dem Benutzer zurück müssen

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

Hier den folgenden Code hinzufügen ist ein Beispiel: Hinweis: Ich gebe Ihnen nur ein Beispiel zu sho w, wie Benutzer-Interaktion

einen Fortschrittsbalken in Ihrem xml.Something hinzufügen wie diese

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

In MainActivity wenn eine Taste gedrückt Sie die progressbar zeigen und deaktivieren Sie die Interaktion mit dem Benutzer sperren oder behalten. interaction.Something wie diese

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

@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 Benutzer backPressed Sie die progressbar wieder entfernen den Benutzer beibehalten Wenn Sie eine Funktion der Sperrung hinzufügen möchten, und Display abgeblendet, müssen Sie in hinzufügen Ihre XML-Layout-Datei ein lineares Layout, das den übergeordneten füllt. Setzen Sie den Hintergrund auf # B0000000 und seine Sichtbarkeit auf gegangen. Dann programmiere die Sichtbarkeit sichtbar auf Sichtbar.

Hoffe diese Hilfe!

-1

Sie eine ProgressDialog wie diese verwenden könnte;

ProgressDialog progressBar = new ProgressDialog(MainActivity.this); 
progressBar.setMessage("YourMessageHere"); 
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
progressBar.setCancelable(false); 
progressBar.show(); 
+0

Das weiß ich schon. Aber meine Frage ist nur für ProgressBar. Ich möchte ProgressDialog nicht verwenden. Ich verwende eine benutzerdefinierte ProgressBar mit meiner eigenen Animation. –

+2

ProgressDialog es ist veraltet – Raskayu

+0

@Raskayu, das ist, weil ich es am 28. April 2016 gepostet habe, glaube ich nicht, dass es dann veraltet war –

0

Verwenden Dokument Standardmethode progressbar.setCancelable (false)

+0

Aber was für einen Effekt wird es auf Benutzerinteraktion haben? Ich kann EditText immer noch berühren oder eintippen, während die ProgressBar sichtbar ist und auf Abbrechen gesetzt werden kann. –

+0

und seit wann ein Fortschrittsbalken die Eigenschaft Cancelable (false) gesetzt hat? –

+0

U haben Sie Option, wenn Ihr Task setenabled false als Ihre übergeordnete Ansicht und nach Aufgabe ausgeführt setenabled als wahr ausgeführt – R2R

0

gerade gesetzt:

android:clickable="true" 

in Ihrem xml

<ProgressBar... 

diese Magie macht nur!

1

Ich habe dieses Problem behoben, indem ich das Root-Layout zum ProgressBar hinzugefügt habe.

<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 Layout Wurzel klickbare

android:clickable="true" 

HINWEIS: In meiner Hauptansicht, hatte ich RelativeLayout als root und habe oben genannten Code innerhalb des Root-Layouts an der letzten Position (zuletzt hinzugefügt Kind).

Hoffe das hilft !!

0

Erstellen Sie einen Dialog mit transparentem Hintergrund. Das Problem mit getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); ist, dass, wenn die App im Hintergrund läuft und zurückkommt, der Benutzer in der Lage sein wird, mit UI-Komponenten zu interagieren, viel mehr Handhabung. Also zum Sperren der Benutzeroberfläche machen Sie einen transparenten Dialog und wenn Sie Zeit für ausblenden/zeigen wollen. Tun Sie dies in einem ausführbaren Thread. So wird die Lösung sein

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); 
0

Machen Sie Ihre Eltern Layout als Relative-Layout & hinzufügen:

<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 Schaltflächen in Ihrem UI schweben, sie immer noch im Mittelpunkt all greifen & klickbare bleiben, wenn die Fortschrittsbalken ist sichtbar. für diesen Einsatz: (wenn der Prog Leiste sichtbar ist & wieder aktivieren, wenn Sie Ihre Prog Bar unsichtbar/weg machen)

fb.setEnabled(false);