로드하는 동안 ImageView에서 "애니메이션 원"사용


219

현재 응용 프로그램에서 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..."/>

이제이 텍스트 대신로드 대화 상자에서 사용되는 애니메이션 원으로 대체하고 싶습니다. 내가 무슨 뜻인지 알 것입니다.

편집 : 대화를 원하지 않습니다. 내 레이아웃 안에 그것을 보여주고 싶습니다.

http://flexfwd.com/DesktopModules/ATI_Base/resources/images/loading_blue_circle.gif

도와 주셔서 감사합니다!

답변:


443

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

결과 (그리고 회전) :

여기에 이미지 설명을 입력하십시오


17
+1 버튼을 부
TSR

이것이 ImageView에 애니메이션 원을 표시하는 문제를 어떻게 해결하는지 알 수 없습니다.
구스타보

4
@ 구 스타 보, 이것이 "불확정 진행 애니메이션"을 보여주기 위해 그가 원하는 것이므로 문제가 해결된다고 생각합니다. ;-]
Thalis Vilela

143

다음 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 초 후에 로딩 패널이 사라지게하려면 핸들 을 사용 하여 숨기기 / 표시를 트리거하십시오.


4
좋은 대답입니다. Google 검색을 통해 발견되었으며 내 문제도 해결했습니다. 감사!
Dave

이 방법을 사용 findViewById(...).setVisibility(View.GONE)하면 화면을 회전 할 때 NullPointerException이 발생합니다 . 한 방향에서 매력처럼 작동하지만 이것이 왜 깨질 수 있는지 어떤 생각입니까?
Kalina

질문이 있습니다. 내 RelativeLayout은 선형 레이아웃 내부의 두 버튼 사이에 있으며 버튼 사이에도 있습니다. 이것을 실행하면 전체 화면을 차지합니다. 이 로딩 바를 두 버튼 사이에 두는 방법에 대한 팁이 있습니까?
Alioo

findViewById(R.id.loadingPanel).setVisiblity(View.GONE)두 번째 활동에서 코드 를 어디에 두어야 합니까? 두 번째 조각 활동에 방법 view이 없으므로 찾을 수 없습니다 setContnetView(). 감사!
Alston

10

이를 일반적으로 미정 진행률 표시 줄 또는 미정 진행률 대화 상자라고합니다.

이것을 ThreadHandler 와 결합하여 원하는 것을 정확하게 얻으십시오. Google을 통해 또는 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);
        }
    }
};

2
귀하의 답변은 정말 멋지지만 레이아웃에 삽입하고 싶습니다 ... Venkatesh의 답변이 내 용도에 더 적합 해 보입니다. 피드백을 보내려고합니다. 시간 내 주셔서 감사합니다!
Waza_Be

이것에 대해 감사합니다. 실제로 XML과 프로그래밍 방식으로 작업을 수행하는 것이 좋습니다.
Neon Warge

1

진행률을 나타 내기 위해 다른 뷰를 팽창시키지 않으려면 다음을 수행하십시오.

  1. 목록보기와 동일한 XML 레이아웃으로 ProgressBar를 작성하십시오.
  2. 그것을 중심으로 만드십시오
  3. ID를 줘
  4. setEmptyView를 호출하여 목록보기 인스턴스 변수에 첨부하십시오.

Android는 진행률 표시 줄의 가시성을 관리합니다.

예를 들면 다음과 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) {

        }
    });


}

}


ProgressBar는 RelativeLayout 내에서 두 번째 자리에 있어야합니다. 그렇지 않으면 두 번째 자리의 뷰 뒤에 렌더링됩니다 (귀하의 경우 ImageView 및 내 경우에는 ListView)
Dominikus K.

1

firebase github 샘플 에서이 코드를 사용할 수 있습니다 .

레이아웃 파일을 편집 할 필요가 없습니다. "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();
    }

}

활동에서 진행률 대화 상자를 사용하려는 경우 ..

public class MyActivity extends BaseActivity

시간이 걸리는 기능 전후

showProgressDialog();
.... my code that take some time
showProgressDialog();

0

Kotlin에서 개발하는 사람들에게는 Anko 라이브러리에서 제공 하는 달콤한 방법ProgressDialog있어 산들 바람 을 표시하는 과정을 만듭니다 !

해당 링크를 기반으로 :

val dialog = progressDialog(message = "Please wait a bit…", title = "Fetching data")
dialog.show()
//....
dialog.dismiss()

진행률이 표시된 진행률 대화 상자가 표시됩니다 ( init진행률을 계산하려면 매개 변수 를 전달해야 함 ).

indeterminateProgressDialog()회전 원 애니메이션을 해제 할 때까지 무기한으로 제공 하는 방법 도 있습니다 .

indeterminateProgressDialog("Loading...").show()

이 솔루션 으로이 블로그 를 외치십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.