Używanie "animowanego koła" w widoku ImageView podczas ładowania rzeczy
Obecnie używam w mojej aplikacji widoku listy, który potrzebuje może jednej sekundy, aby się wyświetlić.
Obecnie używam właściwości @id / android: empty listview, aby utworzyć tekst "ładujący".
<TextView android:id="@id/android:empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000"
android:text="Loading..."/>
Teraz chciałbym zastąpić to animowanym okręgiem, który jest używany w oknie ładowania zamiast tego tekstu, chyba wszyscy wiecie, co mam na myśli:
Edit: nie chcę okna dialogowego. Chcę to pokazać w moim układzie graficznym.
Dziękuję dużo za twoją pomoc!
6 answers
Po prostu umieść ten blok xml w pliku układu aktywności:
<RelativeLayout
android:id="@+id/loadingPanel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true" />
</RelativeLayout>
A kiedy skończysz wczytywać, wywołaj tę jedną linię:
findViewById(R.id.loadingPanel).setVisibility(View.GONE);
Wynik (i też się obraca):
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-21 17:42:18
Możesz to zrobić używając następującego xml
<RelativeLayout
style="@style/GenericProgressBackground"
android:id="@+id/loadingPanel"
>
<ProgressBar
style="@style/GenericProgressIndicator"/>
</RelativeLayout>
With this style
<style name="GenericProgressBackground" parent="android:Theme">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:background">#DD111111</item>
<item name="android:gravity">center</item>
</style>
<style name="GenericProgressIndicator" parent="@android:style/Widget.ProgressBar.Small">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:indeterminate">true</item>
</style>
Aby tego użyć, musisz ukryć elementy interfejsu użytkownika, ustawiając wartość widoczności na GONE I gdy dane są ładowane, wywołaj setVisibility(View.VISIBLE)
na wszystkich swoich widokach, aby je przywrócić. Nie zapomnij wywołać findViewById(R.id.loadingPanel).setVisiblity(View.GONE)
, aby ukryć animację ładowania.
Jeśli nie masz zdarzenia/funkcji ładowania, ale chcesz, aby panel ładowania zniknął po X sekundach, użyj uchwytu , aby uruchomić ukrywanie/Pokazywanie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-08 03:33:30
Jest to ogólnie określane jako nieokreślony pasek postępu lub nieokreślone okno dialogowe postępu.
Połącz to z Thread i Handler , aby uzyskać dokładnie to, czego chcesz. Istnieje wiele przykładów, jak to zrobić za pośrednictwem Google lub tutaj NA SO. Gorąco polecam poświęcić czas, aby dowiedzieć się, jak korzystać z tej kombinacji klas do wykonania zadania takiego jak to. Jest niezwykle przydatny w wielu rodzajach aplikacji i da ci świetny wgląd w to, jak wątki i manipulatory mogą ze sobą współpracować.
Zacznę od tego jak to działa:
Zdarzenie ładowania uruchamia okno dialogowe:
//maybe in onCreate
showDialog(MY_LOADING_DIALOG);
fooThread = new FooThread(handler);
fooThread.start();
Teraz wątek działa:
private class FooThread extends Thread {
Handler mHandler;
FooThread(Handler h) {
mHandler = h;
}
public void run() {
//Do all my work here....you might need a loop for this
Message msg = mHandler.obtainMessage();
Bundle b = new Bundle();
b.putInt("state", 1);
msg.setData(b);
mHandler.sendMessage(msg);
}
}
W końcu odzyskamy stan z wątku po jego zakończeniu:
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
int state = msg.getData().getInt("state");
if (state == 1){
dismissDialog(MY_LOADING_DIALOG);
removeDialog(MY_LOADING_DIALOG);
}
}
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-26 13:01:00
Jeśli chcesz nie nadmuchiwać innego widoku tylko po to, aby wskazać postęp, wykonaj następujące czynności:
- Utwórz pasek postępu w tym samym układzie XML widoku listy.
- Make it centered
- podaj identyfikator
- dołącz go do zmiennej instancji listview, wywołując setEmptyView
Android zadba o widoczność paska postępu.
Na przykład w activity_main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<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"
android:orientation="vertical"
tools:context="com.fcchyd.linkletandroid.MainActivity">
<ListView
android:id="@+id/list_view_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@color/colorDivider"
android:dividerHeight="1dp" />
<ProgressBar
android:id="@+id/loading_progress_xml"
style="?android:attr/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</RelativeLayout>
I w MainActivity.java
:
package com.fcchyd.linkletandroid;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
final String debugLogHeader = "Linklet Debug Message";
Call<Links> call;
List<Link> arraylistLink;
ListView linksListV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linksListV = (ListView) findViewById(R.id.list_view_xml);
linksListV.setEmptyView(findViewById(R.id.loading_progress_xml));
arraylistLink = new ArrayList<>();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.links.linklet.ml")
.addConverterFactory(GsonConverterFactory
.create())
.build();
HttpsInterface HttpsInterface = retrofit
.create(HttpsInterface.class);
call = HttpsInterface.httpGETpageNumber(1);
call.enqueue(new Callback<Links>() {
@Override
public void onResponse(Call<Links> call, Response<Links> response) {
try {
arraylistLink = response.body().getLinks();
String[] simpletTitlesArray = new String[arraylistLink.size()];
for (int i = 0; i < simpletTitlesArray.length; i++) {
simpletTitlesArray[i] = arraylistLink.get(i).getTitle();
}
ArrayAdapter<String> simpleAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, simpletTitlesArray);
linksListV.setAdapter(simpleAdapter);
} catch (Exception e) {
Log.e("erro", "" + e);
}
}
@Override
public void onFailure(Call<Links> call, Throwable t) {
}
});
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-28 14:53:20
Możesz użyć tego kodu z Firebase github samples ..
Nie musisz edytować w plikach układu ... po prostu utwórz nową klasę "BaseActivity"
package com.example;
import android.app.ProgressDialog;
import android.support.annotation.VisibleForTesting;
import android.support.v7.app.AppCompatActivity;
public class BaseActivity extends AppCompatActivity {
@VisibleForTesting
public ProgressDialog mProgressDialog;
public void showProgressDialog() {
if (mProgressDialog == null) {
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Loading ...");
mProgressDialog.setIndeterminate(true);
}
mProgressDialog.show();
}
public void hideProgressDialog() {
if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
}
@Override
public void onStop() {
super.onStop();
hideProgressDialog();
}
}
W Twojej aktywności, którą chcesz wykorzystać w oknie dialogowym postęp ..
public class MyActivity extends BaseActivity
Przed / Po funkcji, która zajmuje czas
showProgressDialog();
.... my code that take some time
showProgressDialog();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-03 12:17:06
Dla tych, które rozwijają się w Kotlinie, istnieje słodka metoda dostarczana przez Bibliotekę Anko, która sprawia, że proces wyświetlania ProgressDialog
jest bardzo prosty!
Na podstawie tego linku:
val dialog = progressDialog(message = "Please wait a bit…", title = "Fetching data")
dialog.show()
//....
dialog.dismiss()
Wyświetli się okno dialogowe postępu z wyświetlonym progress % (dla którego musisz podać parametr init
również, aby obliczyć postęp).
Istnieje również metoda indeterminateProgressDialog()
, która zapewnia animację wirującego koła w nieskończoność, aż do odrzucenia:
indeterminateProgressDialog("Loading...").show()
Shout out do tego bloga , który doprowadził mnie do takiego rozwiązania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 00:56:05