ImageView(이미지 보기)에서 "애니메이션 서클"을 사용하여 작업 로드
현재 애플리케이션에서 목록 보기를 사용하고 있는데, 이 보기는 1초 정도만 표시해야 합니다.
현재 제가 하는 일은 목록 보기의 @id/android:empty 속성을 사용하여 "로딩" 텍스트를 만드는 것입니다.
<TextView android:id="@id/android:empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000"
android:text="Loading..."/>
이제 이 텍스트 대신 로딩 대화상자에서 사용되는 애니메이션 원으로 대체하고자 합니다. 여러분 모두 무슨 뜻인지 알고 계실 것 같습니다.
편집: 대화 상자를 원하지 않습니다.저는 제 레이아웃 안에 그것을 보여주고 싶습니다.
도와주셔서 정말 감사합니다!
활동 레이아웃 파일에 이 xml 블록을 넣기만 하면 됩니다.
<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>
그리고 로딩이 끝나면 다음 한 줄로 전화를 걸어 주십시오.
findViewById(R.id.loadingPanel).setVisibility(View.GONE);
결과(그리고 회전도 가능):
다음 xml을 사용하여 이 작업을 수행할 수 있습니다.
<RelativeLayout
style="@style/GenericProgressBackground"
android:id="@+id/loadingPanel"
>
<ProgressBar
style="@style/GenericProgressIndicator"/>
</RelativeLayout>
이런 스타일로
<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>
이를 사용하려면 가시성 값을 GONE으로 설정하여 UI 요소를 숨기고 데이터가 로드될 때마다 호출해야 합니다.setVisibility(View.VISIBLE)
당신의 모든 견해를 복원할 수 있습니다.잊지말고 전화해요.findViewById(R.id.loadingPanel).setVisiblity(View.GONE)
로딩 애니메이션을 숨길 수 있습니다.
로딩 이벤트/기능이 없지만 x초 후에 로딩 패널이 사라지기를 원하는 경우 Handle을 사용하여 Hidden/Showing을 트리거합니다.
이를 일반적으로 "불확정 진행률 막대" 또는 "불확정 진행률 대화상자"라고 합니다.
이것을 스레드 및 핸들러와 결합하면 원하는 것을 정확하게 얻을 수 있습니다.구글이나 SO를 통해 이 작업을 수행하는 방법에 대한 많은 예가 있습니다.저는 이런 과제를 수행하기 위해 이 조합의 수업을 활용하는 방법을 배우는 데 시간을 할애하는 것을 적극 추천합니다.여러 종류의 응용 프로그램에서 매우 유용하며 쓰레드와 핸들러가 함께 작동하는 방법에 대한 통찰력을 얻을 수 있습니다.
이것이 어떻게 작동하는지에 대해 말씀드리겠습니다.
로딩 이벤트가 대화상자를 시작합니다.
//maybe in onCreate
showDialog(MY_LOADING_DIALOG);
fooThread = new FooThread(handler);
fooThread.start();
이제 실이 작동합니다.
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);
}
}
완료되면 최종적으로 스레드에서 상태를 가져옵니다.
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);
}
}
};
firebase github 샘플에서 이 코드를 사용할 수 있습니다.
레이아웃 파일에서 편집할 필요가 없습니다...새 클래스 "Base Activity" 만들기
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();
}
}
진행률 대화 상자를 사용할 Activity(활동)에서..
public class MyActivity extends BaseActivity
시간이 소요되는 기능 전후
showProgressDialog();
.... my code that take some time
showProgressDialog();
진행 상황을 나타내기 위해 다른 보기를 부풀리지 않으려면 다음을 수행합니다.
- 목록 보기의 동일한 XML 레이아웃에 ProgressBar를 만듭니다.
- 중심으로 만들기
- 도움을 주세요.
- setEmptyView를 호출하여 목록 보기 인스턴스 변수에 연결합니다.
안드로이드는 진행 표시줄의 가시성을 관리할 것입니다.
예를 들어, 인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>
그리고 인.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) {
}
});
}
}
Kotlin에서 발전하는 것들을 위해, Anko 도서관에서 제공하는 달콤한 방법이 있습니다. 그것은 전시하는 과정을 만듭니다.ProgressDialog
미풍!
해당 링크를 기준으로:
val dialog = progressDialog(message = "Please wait a bit…", title = "Fetching data")
dialog.show()
//....
dialog.dismiss()
진행률 %가 표시되는 진행률 대화 상자가 표시됩니다(이 대화 상자를 통과해야 함).init
진행률을 계산하기 위한 매개변수도 포함).
또한 있습니다.indeterminateProgressDialog()
method는 Spinning Circle 애니메이션을 종료할 때까지 무한히 제공합니다.
indeterminateProgressDialog("Loading...").show()
제가 이 해결책을 찾게 된 이 블로그에 큰 소리쳐 보세요.
언급URL : https://stackoverflow.com/questions/5442183/using-the-animated-circle-in-an-imageview-while-loading-stuff
'programing' 카테고리의 다른 글
mysql_fix_privilege_ 동안 mysql_업그레이드가 실패함 (0) | 2023.10.19 |
---|---|
부트스트랩 3의 입력 폭 (0) | 2023.10.19 |
avg 및 그룹을 사용한 SQL 쿼리 (0) | 2023.10.19 |
MariaDB 시퀀스가 음수를 생성하는 이유는 무엇입니까? (0) | 2023.10.19 |
AJAX post에서 Flask에 데이터를 가져오는 방법 (0) | 2023.10.19 |