ProgressBar unter Action Bar

Frage Zusammenfassung: Wie kann ich eine ProgressBar in die ActionBar , wie auf der Chrome App?

Details: Schau dir diesen Screenshot von Chrome an:

  • OnClick Listener zu einem ListView Image - Android
  • Android SDK erkennt kein Debug-fähiges Gerät
  • Wie man die gleiche asynthetische mehr als einmal ausführen?
  • ProgressBar in ActionBar auf Android L Vorschau
  • Können wir in unserer Android-App Chrom-Browser-Geschichte / Lesezeichen bekommen
  • Verwenden von Google Analytics, um Fragmente zu verfolgen
  • Chrome für Android-Screenshot

    Ich möchte so eine Aktionsleiste erstellen. Gerade unter der Action Bar gibt es eine ProgressBar, die nach Seitenladung füllt. Ich habe dieses Beispiel aus vielen Apps gesehen, wie Feedly, aber ich habe nicht in der Lage, meine eigene Implementierung zu erstellen. Ich habe versucht, Android eigenen APIs zu erstellen:

     @Override protected void onCreate(Bundle savedInstanceState) { //Request Permission to display the Progress Bar... this.requestWindowFeature(Window.FEATURE_PROGRESS); this.setWindowContentView(R.layout.activity_main) super.onCreate(savedInstanceState); this.setProgressBarIndeterminate(true); } 

    Aber dieser Code bewirkt nur, dass die ProgressBar über die Aktionsleiste angezeigt wird:

    Mein App Screenshot

    Also, wie kann ich meine ProgressBar unter der Action Bar erscheinen lassen, wie auf der Chrome App?

  • Android: alternatives Layout xml für den Landschaftsmodus
  • Sind IOS & Android Apps mit Webview nur als Hybrid oder Web Apps betrachtet?
  • Zugriff auf Ressourcendateien in Android
  • AudioRecord-Objekt nicht initialisiert
  • Wie behalte ich meine Cordova App Vollbildschirm beim Öffnen der Android-Tastatur?
  • Wie kann ich den Cursor von einem CursorLoader auffrischen?
  • 6 Solutions collect form web for “ProgressBar unter Action Bar”

    Dies ist jetzt ein natives Verhalten, das mit SwipeRefreshLayout erhalten werden kann .

    Sie können Ihre scrollbare Ansicht mit einem SwipeRefreshLayout und dann müssen Sie nur aufRefresh- Events hören:

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container); swipeLayout.setOnRefreshListener(this); swipeLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); } @Override public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { swipeLayout.setRefreshing(false); } }, 5000); } 

    Ein schönes und einfaches Tutorial finden Sie in diesem Blog .

    Ich war nicht voll mit der akzeptierten Antwort oben zufrieden, also habe ich selbst extra Forschung gemacht.

    Der Trick, den ich glaube, dass sie verwendet haben, ist, dass sie die Draufsicht in der DecorView namens DecorView abgerufen DecorView und die Fortschrittsleiste dort DecorView haben. Auf diese Weise zeigt sich der Fortschrittsbalken sowohl über die Aktionsleiste als auch über den Inhaltsbereich. Beachten Sie, dass die Antwort des SD die Fortschrittsleiste in den Inhaltsbereich stellt und den Raum aus dem aktuellen Inhalt stiehlt, was zu unerwarteten Ergebnissen führen kann.

    Beispiel- Screenshots dieser Implementierung:

    Fortschrittsanzeige

    ProgressBarInbestimmen

    Code

    onCreate einfach diesen Code in onCreate Methode von etwas Aktivität und es sollte funktionieren:

     // create new ProgressBar and style it final ProgressBar progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24)); progressBar.setProgress(65); // retrieve the top view of our application final FrameLayout decorView = (FrameLayout) getWindow().getDecorView(); decorView.addView(progressBar); // Here we try to position the ProgressBar to the correct position by looking // at the position where content area starts. But during creating time, sizes // of the components are not set yet, so we have to wait until the components // has been laid out // Also note that doing progressBar.setY(136) will not work, because of different // screen densities and different sizes of actionBar ViewTreeObserver observer = progressBar.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { View contentView = decorView.findViewById(android.R.id.content); progressBar.setY(contentView.getY() - 10); ViewTreeObserver observer = progressBar.getViewTreeObserver(); observer.removeGlobalOnLayoutListener(this); } }); 

    Sie können mit LayoutParams 'Höhenargument spielen, um die progressBar breiter oder schmaler einzustellen, aber Sie müssen den -10 Offset anpassen müssen.

    Styling

    Leider können Sie den hässlichen grauen Hintergrund der Fortschrittsleiste sehen. Um es zu entfernen, sucht einfach nach dem Hintergrund von id und versucht, es zu verstecken funktioniert nicht. Um den Hintergrund zu entfernen, musste ich identisches Zeichen der Systemversion erstellen und das Hintergrundelement entfernen.

    TL; DR: Erstellen Sie die Datei progress_horizontal_holo_no_background_light.xml und fügen Sie diese Zeichen hinzu:

     <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/secondaryProgress"> <scale android:scaleWidth="100%" android:drawable="@drawable/progress_secondary_holo_light" /> </item> <item android:id="@android:id/progress"> <scale android:scaleWidth="100%" android:drawable="@drawable/progress_primary_holo_light" /> </item> </layer-list> 

    Kopiere passende .png-Zeichenkörbe von sdk/platforms/android-xx/data/res/drawable-xxx/ zu deinem Projekt und dann in den Code, den du hinzufügen kannst:

     progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light)); 

    Extra: Unbestimmte Fortschrittsleiste

    Pre-KitKat-Versionen von unbestimmten Fortschrittsbalken sind ziemlich hässlich und hängend. Sie können neue glatte progressBar namens ButteryProgressBar . Ich suche nur noch auf Google, ich kann hier keine weiteren Links veröffentlichen, denn ich bin neu hier: [), füge die Klasse deinem Projekt hinzu und kannst einfach die vorherige ProgressBar mit diesem Code ersetzen und knackig unbestimmte Fortschrittsbalken haben:

     final ButteryProgressBar progressBar = new ButteryProgressBar(this); progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24)); 

    Möglicherweise müssen Sie auch diesen Code vereinfachen:

     final TypedArray ta = c.obtainStyledAttributes(attrs, R.styleable.ButteryProgressBar); try { mBarColor = ta.getColor(R.styleable.ButteryProgressBar_barColor, c.getResources().getColor(android.R.color.holo_blue_light)); mSolidBarHeight = ta.getDimensionPixelSize( R.styleable.ButteryProgressBar_barHeight, Math.round(DEFAULT_BAR_HEIGHT_DP * mDensity)); mSolidBarDetentWidth = ta.getDimensionPixelSize( R.styleable.ButteryProgressBar_detentWidth, Math.round(DEFAULT_DETENT_WIDTH_DP * mDensity)); } finally { ta.recycle(); } 

    Zu diesem Code:

     mBarColor = c.getResources().getColor(android.R.color.holo_blue_light); mSolidBarHeight = Math.round(DEFAULT_BAR_HEIGHT_DP * mDensity); mSolidBarDetentWidth = Math.round(DEFAULT_DETENT_WIDTH_DP * mDensity); 

    Hoffe ich habe geholfen 🙂

    Erweitern Sie Aktivitäten von der folgenden Klasse, um eine ProgressBar an der Spitze (unter ActionBar) von jedem und eine getProgressBar() Methode zu haben:

    Übergeordnete Klasse:

     public abstract class ProgressActivity extends Activity { private ProgressBar mProgressBar; @Override public void setContentView(View view) { init().addView(view); } @Override public void setContentView(int layoutResID) { getLayoutInflater().inflate(layoutResID,init(),true); } @Override public void setContentView(View view, ViewGroup.LayoutParams params) { init().addView(view,params); } private ViewGroup init(){ super.setContentView(R.layout.progress); mProgressBar = (ProgressBar) findViewById(R.id.activity_bar); return (ViewGroup) findViewById(R.id.activity_frame); } protected ProgressBar getProgressBar(){ return mProgressBar; } } 

    Layout (progress.xml):

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ProgressBar android:id="@+id/activity_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="-8dp" style="@android:style/Widget.DeviceDefault.ProgressBar.Horizontal" /> <FrameLayout android:id="@+id/activity_frame" android:layout_width="match_parent" android:layout_height="fill_parent" /> </LinearLayout> 

    Ich habe Code aus diesem Thread sowie andere Threads auf StackOverflow kompiliert und ein Projekt erstellt, das verwendet werden kann, um ButteryProgessbar zu implementieren sowie "Pull down to Refresh". https://github.com/pauldmps/Gmail-like-Pull-Down-to-Refresh

    Fühlen Sie sich frei, den Code in Ihrer Anwendung zu verwenden.

    Vielen Dank an euch.

    Bitte verwenden Sie unten Code. Verwenden Sie einfach einen Standard-Stil in progress bar als style="?android:attr/progressBarStyleHorizontal"

     <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" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" android:indeterminate="true" /> </RelativeLayout> 

    Nun, ich habe etwas Ähnliches für eine meiner Haustier-Apps gemacht und bin mir nicht sicher, ob das der einzige Weg ist oder der beste Weg, es zu tun, aber es funktioniert definitiv.

    Verwenden Sie zunächst eine Overlay-Aktionsleiste und legen Sie dann den Hintergrund auf "null", so dass die Overlay-Aktionsleiste transparent ist.

    Jetzt in dir Aktivitätslayout, setze den oberen Rand für deine Root-Ansicht auf "actionbar height" Du kannst es so machen.

     <RelativeLayout ... android:layout_marginTop="?android:attr/actionBarSize" /> 

    Jetzt ist die Aktion nicht zu verbergen jede Ihrer Tätigkeit Inhalt.

    Das nächste, was Sie jetzt tun müssen, ist – fügen Sie eine Kopfzeile über die Wurzelansicht mit der Höhe wie die Aktionsleiste hinzu. Legen Sie eine Hintergrundfarbe darauf. Dies wäre nun die Farbe deiner Aktionsleiste, und da die Aktionsleiste perfekt auf die obere Seite dieser Kopfzeile ausgerichtet ist.

    Jetzt können Sie ganz einfach einen Fortschrittsbalken in die Kopfzeile einfügen und ihn an die Unterseite der Kopfzeile ausrichten. Für den Benutzer würde das so aussehen, als wäre der Fortschrittsbalken auf der Aktionsleiste selbst, genau wie Chrom.

    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.