2013-08-02 13 views
22

Ich möchte ein Overlay über dem Bildschirm anzeigen, das einen kleinen Ladeticker oder möglicherweise sogar einen Text zeigt, während meine App versucht, sich beim Server anzumelden. Mein Anmeldebildschirm befindet sich innerhalb eines vertikalen linearen Layouts.Anzeige eines Lade-Overlays auf dem Android-Bildschirm

Die Wirkung Ich versuche zu erreichen ist so etwas wie dieses: http://docs.xamarin.com/recipes/ios/standard_controls/popovers/display_a_loading_message

+3

Sie sind für diese suchen? Recht ? http://stackoverflow.com/questions/2176922/how-to-create-transparent-activity-in-android –

+0

@ M-WaJeEh Wie füge ich Text und/oder Grafiken zu dieser Aktivität hinzu? –

+0

wie du zu einer normalen 'Aktivität' hinzufügst. Es ist nur eine normale "Aktivität" mit einem anderen Thema. –

Antwort

48

Vielleicht zu spät, aber ich denke, jemand könnte es nützlich finden.

Aktivität:

public class MainActivity extends Activity implements View.OnClickListener { 

    String myLog = "myLog"; 

    AlphaAnimation inAnimation; 
    AlphaAnimation outAnimation; 

    FrameLayout progressBarHolder; 
    Button button; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     button = (Button) findViewById(R.id.button); 
     progressBarHolder = (FrameLayout) findViewById(R.id.progressBarHolder); 

     button.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.button: 
       new MyTask().execute(); 
       break; 
     } 

    } 

    private class MyTask extends AsyncTask <Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      button.setEnabled(false); 
      inAnimation = new AlphaAnimation(0f, 1f); 
      inAnimation.setDuration(200); 
      progressBarHolder.setAnimation(inAnimation); 
      progressBarHolder.setVisibility(View.VISIBLE); 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      outAnimation = new AlphaAnimation(1f, 0f); 
      outAnimation.setDuration(200); 
      progressBarHolder.setAnimation(outAnimation); 
      progressBarHolder.setVisibility(View.GONE); 
      button.setEnabled(true); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       for (int i = 0; i < 5; i++) { 
        Log.d(myLog, "Emulating some task.. Step " + i); 
        TimeUnit.SECONDS.sleep(1); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    } 

} 

Layout-xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Start doing stuff" 
     android:id="@+id/button" 
     android:layout_below="@+id/textView" 
     android:layout_centerHorizontal="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Do Some Stuff" 
     android:id="@+id/textView" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" /> 

    <FrameLayout 
     android:id="@+id/progressBarHolder" 
     android:animateLayoutChanges="true" 
     android:visibility="gone" 
     android:alpha="0.4" 
     android:background="#000000" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <ProgressBar 
      style="?android:attr/progressBarStyleLarge" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:indeterminate="true" 
      android:layout_gravity="center" /> 
    </FrameLayout> 
</RelativeLayout> 
+2

+1 für tatsächlichen Code – JcKelley

+0

Dies sollte als Antwort imo ausgewählt werden. Die ausgewählte Antwort weist auf ProgressDialog hin, der nicht mehr häufig verwendet wird und keinen Code bereitstellt. –

1

I ProgressBar in Relative-Layout haben, und ich verbergen oder es zeigen jeweils. Und ja, Aktivität kann transparent sein.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <LinearLayout 
     android:id="@+id/hsvBackgroundContainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
    </LinearLayout> 


    <ProgressBar 
     android:id="@+id/pbProgess" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" /> 

</RelativeLayout> 
+0

Die Verwendung eines relativen Layouts anstelle des Standardlayouts, das Android für Logins verwendet, war die Lösung für mein Problem, dass ich den Fortschrittsbalken nicht zentrieren konnte. Vielen Dank! – PeterPan

-2

Sie müssen eine Hintergrundoperation mit einem Thread-Konzept wie AsyncTask durchführen. Damit können Sie die eigentliche Arbeit aus dem UI-Teil ausblenden. Und AsyncTask wird nicht zugewiesen, nachdem Ihre Operationen abgeschlossen sind.

  • Erstellen einer Unterklasse von AsyncTask
  • Verwenden AsyncTask Hintergrund Arbeit
  • Anruf OnPreExecute() zu tun Aufgabe zu initialisieren
  • eine progressbar Verwendung mit setIndeterminate (true) zu ermöglichen, die unbestimmten Modus
  • Rufen Sie onProgressUpdate() auf, um Ihre Fortschrittsleiste zu animieren, damit der Benutzer weiß, dass etwas Arbeit getan wird
  • Verwenden Sie incrementProgressBy() für Inkrementprogres sbar Inhalt von einem bestimmten Wert
  • Anruf doInBackground() und tut, um die Hintergrundarbeit hier
  • Fang ein InterruptedException Objekt Ende Hintergrund Betrieb
  • Anruf OnPostExecute() zu finden, das Ende der Operation zu bezeichnen und zeigt die Ergebnis

Android's indeterminate ProgressDialog tutorial

Splash screen while loading resources in android app

3

Ein Spinner mit einer Nachricht über die Anwendung kann mit einem ProgressDialog erstellt werden. Während es nicht den genauen Effekt wie auf dem Bild erreicht, ist es ein guter Weg zu zeigen, dass die App funktioniert.

35

Ich mag den Ansatz in Kostya But's answer.

Aufbauend auf, dass hier ein paar Ideen, um die gleiche Overlay leicht wiederverwendbar über Ihre App zu machen:

Betrachten Sie das Overlay FrameLayout in einem separaten Layout-Datei setzen, z.B.res/layout/include_progress_overlay.

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/progress_overlay" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:alpha="0.4" 
    android:animateLayoutChanges="true" 
    android:background="@android:color/black" 
    android:clickable="true" 
    android:visibility="gone"> 

    <ProgressBar 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:indeterminate="true"/> 

</FrameLayout> 

(Eine Sache, die ich in der Overlay hinzugefügt FrameLayout android:clickable="true" ist Während also die Überlagerung angezeigt wird, verhindert, dass Klicks auf UI-Elemente darunter durchläuft zumindest in meinem typischen Anwendungsfall das ist, was ich. wollen)

Dann ist es enthalten, wo nötig.

<!-- Progress bar overlay; shown while login is in progress --> 
<include layout="@layout/include_progress_overlay"/> 

Und in Code:

View progressOverlay; 
[...] 

progressOverlay = findViewById(R.id.progress_overlay); 
[...] 

// Show progress overlay (with animation): 
AndroidUtils.animateView(progressOverlay, View.VISIBLE, 0.4f, 200); 
[...] 

// Hide it (with animation): 
AndroidUtils.animateView(progressOverlay, View.GONE, 0, 200); 

Mit Code-Animation in eine util Verfahren extrahiert:

/** 
* @param view   View to animate 
* @param toVisibility Visibility at the end of animation 
* @param toAlpha  Alpha at the end of animation 
* @param duration  Animation duration in ms 
*/ 
public static void animateView(final View view, final int toVisibility, float toAlpha, int duration) { 
    boolean show = toVisibility == View.VISIBLE; 
    if (show) { 
     view.setAlpha(0); 
    } 
    view.setVisibility(View.VISIBLE); 
    view.animate() 
      .setDuration(duration) 
      .alpha(show ? toAlpha : 0) 
      .setListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      view.setVisibility(toVisibility); 
     } 
    }); 
} 

(hier view.animate() verwenden, hinzugefügt in API 12, statt AlphaAnimation.)

+1

Ich verwende ein ConstraintLayout und musste 'progressOverlay.bringToFront()' verwenden, um die Interaktion mit anderen UI-Elementen zu verhindern. Ansonsten, ordentlich antworten Jonik und Kostya. – DJSquared

Verwandte Themen