2013-08-02 8 views
22

Sto cercando di visualizzare una sovrapposizione sullo schermo che mostra un piccolo ticker di caricamento o forse anche del testo mentre la mia app tenta di accedere al server. La mia schermata di accesso si trova all'interno di un layout lineare verticale.Visualizzazione di una sovrapposizione di caricamento sullo schermo Android

L'effetto che sto cercando di realizzare è qualcosa di simile: http://docs.xamarin.com/recipes/ios/standard_controls/popovers/display_a_loading_message

+3

Siete alla ricerca di questo? destra ? http://stackoverflow.com/questions/2176922/how-to-create-transparent-activity-in-android –

+0

@ M-WaJeEh Come aggiungo testo e/o grafica a quell'attività? –

+0

come se si aggiungesse ad un normale 'Activity'. È solo una normale attività con un tema diverso. –

risposta

48

Forse troppo tardi, ma immagino che qualcuno potrebbe trovare utile.

attività:

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 per il codice effettivo – JcKelley

+0

Questo dovrebbe essere selezionato come risposta imo. La risposta selezionata suggerisce ProgressDialog che non è più comunemente usato e non fornisce codice. –

1

ho ProgressBar in Layout relativa e io nascondere o mostrare esso, rispettivamente. E sì, l'attività può essere trasparente.

+0

Utilizzando un layout relativo invece del layout standard, gli usi Android per gli accessi sono stati la soluzione al mio problema, che non sono stato in grado di centrare la barra di avanzamento. Grazie! – PeterPan

-2

È necessario eseguire un'operazione in background utilizzando il concetto di thread come AsyncTask. Usando questo puoi nascondere il lavoro reale dalla parte dell'interfaccia utente. AsyncTask non verrà assegnato dopo il completamento delle operazioni.

  • creare una sottoclasse di AsyncTask
  • Usa AsyncTask per fare il lavoro di fondo
  • chiamata OnPreExecute() per inizializzare compito
  • Utilizzare un progressbar con setIndeterminate (vero) per abilitare la modalità indeterminata
  • Chiama suProgressUpdate() per animare la barra di avanzamento per consentire all'utente di eseguire il lavoro
  • Utilizzare incrementProgressBy() per incrementare i programmi contenuti SBAR da un valore di specifica
  • chiamata doInBackground() e fare il lavoro di fondo qui
  • Cattura un oggetto InterruptedException per trovare fine sfondo funzionamento
  • chiamata OnPostExecute() per indicare la fine del funzionamento e mostrare il risultato

Android's indeterminate ProgressDialog tutorial

Splash screen while loading resources in android app

3

Uno spinner con un messaggio sull'applicazione può essere creato utilizzando una ProgressDialog. Anche se non raggiunge l'esatto effetto dell'immagine, è un buon modo per mostrare che l'app funziona.

35

Mi piace l'approccio di Kostya But's answer.

Basandosi su questo, ecco un paio di idee per rendere la stessa sovrapposizione facilmente riutilizzabile tutta la vostra applicazione:

valutare l'ipotesi di sovrapposizione FrameLayout in un file di layout separato, per esempiores/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> 

(Una cosa ho aggiunto nella sovrapposizione FrameLayout è android:clickable="true" Così, mentre è mostrata la sovrapposizione, impedisce scatti che passano attraverso di elementi dell'interfaccia utente sotto di esso, almeno nella mia casi tipici di utilizzo questo è quello che. vuole)

quindi includere dove necessario:.

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

E in codice:

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

Con codice di animazione estratta in un metodo util:

/** 
* @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); 
     } 
    }); 
} 

(qui utilizzando view.animate(), aggiunto nel API 12, invece di AlphaAnimation.)

+1

Uso un ConstraintLayout e ho dovuto utilizzare 'progressOverlay.bringToFront()' per impedire l'interazione con altri elementi dell'interfaccia utente. Altrimenti, risposta chiara Jonik e Kostya. – DJSquared