सामान लोड करते समय ImageView में "एनिमेटेड सर्कल" का उपयोग करना


219

मैं वर्तमान में अपने आवेदन में एक सूची का उपयोग कर रहा हूं जिसे प्रदर्शित करने के लिए शायद एक सेकंड की आवश्यकता है।

वर्तमान में मैं जो कुछ भी कर रहा हूं वह "लोडिंग" टेक्स्ट बनाने के लिए @ आईडी / एंड्रॉइड: सूची की खाली संपत्ति का उपयोग कर रहा है।

 <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
@ गुस्तावो, यही वह है, जो "अनिश्चित प्रगति एनीमेशन" को दिखाना चाहता है, इसलिए मुझे लगता है कि यह समस्या को हल करता है। ; -]
थैलिस विलेला

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>

इसका उपयोग करने के लिए, आपको जीओएन के लिए दृश्यता मान सेट करके अपने यूआई तत्वों को छिपाना होगा और जब भी डेटा लोड किया जाता है, तो setVisibility(View.VISIBLE)उन्हें पुनर्स्थापित करने के लिए अपने सभी विचारों पर कॉल करें। findViewById(R.id.loadingPanel).setVisiblity(View.GONE)लोडिंग एनीमेशन को छिपाने के लिए कॉल करना न भूलें ।

यदि आपके पास लोडिंग इवेंट / फंक्शन नहीं है, लेकिन बस चाहते हैं कि लोडिंग पैनल गायब हो जाए तो x सेकंड के बाद छिपने / दिखाने के लिए एक हैंडल का उपयोग करें ।


4
बहुत बढ़िया जवाब। Google खोज के माध्यम से मिला, और मेरी समस्या को भी हल किया। धन्यवाद!
डेव

इस विधि का उपयोग करते हुए, मुझे findViewById(...).setVisibility(View.GONE)स्क्रीन को घुमाने पर लाइन पर एक NullPointerException मिलती है । एक अभिविन्यास में एक आकर्षण की तरह काम करता है, लेकिन किसी भी विचार क्यों यह टूट सकता है?
कलिना

मेरा एक सवाल है। मेरा RelativeLayout एक रैखिक लेआउट के अंदर दो बटन के बीच भी बटन के बीच है। जब मैं इसे चलाता हूं तो यह पूरी स्क्रीन को उठा लेता है। दो बटन के बीच इस लोडिंग बार को रखने के बारे में कोई सुझाव?
एलियो

खैर, मुझे findViewById(R.id.loadingPanel).setVisiblity(View.GONE)दूसरी गतिविधि में कोड कहां रखना चाहिए ? यह नहीं मिल सकता है viewक्योंकि setContnetView()2 खंड गतिविधि में कोई विधि नहीं है । धन्यवाद!
Alston

10

इसे आम तौर पर एक Indeterminate Progress Bar के रूप में जाना जाता है या Indeterminate Progress Dialog के ।

इसे थ्रेड और हैंडलर के साथ मिलाएं जो आप चाहते हैं। 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
आपका उत्तर वास्तव में अच्छा लग रहा है, लेकिन मैं इसे अपने लेआउट के अंदर सम्मिलित करना चाहूंगा ... वेंकटेश का उत्तर मेरे उपयोग के लिए अधिक उपयुक्त लगता है। मैं कोशिश करूंगा और प्रतिक्रिया भेजूंगा। आपके समय के लिए बहुत बहुत धन्यवाद!
वाजा_नए

इस एक के लिए धन्यवाद, एक्सएमएल और प्रोग्राम करने के दोनों तरीके के समाधान के लिए वास्तव में अच्छा है।
नियॉन वारगे

1

यदि आप केवल प्रगति को इंगित करने के लिए एक और दृश्य नहीं बढ़ाना चाहते हैं तो निम्न कार्य करें:

  1. सूची दृश्य के समान XML लेआउट में ProgressBar बनाएँ।
  2. इसे केंद्रित बनाओ
  3. इसे एक आईडी दें
  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 के भीतर दूसरे स्थान पर होना चाहिए, अन्यथा यह दूसरे स्थान पर View (मेरे और आपके मामले में एक ListView) में पीछे मिल जाता है
डॉमिनिकस के।

1

आप इस कोड का उपयोग फायरबेस गीथब सैंपल से कर सकते हैं ।

आपको लेआउट फ़ाइलों में संपादित करने की आवश्यकता नहीं है ... बस एक नया वर्ग बनाएं "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

कोटलिन में विकसित होने वाले लोगों के लिए, Anko पुस्तकालय द्वारा प्रदान की जाने वाली एक मिठाई विधि है जो ProgressDialogएक हवा को प्रदर्शित करने की प्रक्रिया बनाती है !

उस लिंक के आधार पर:

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

यह एक प्रगति डायलॉग दिखाएगा जिसमें प्रगति% प्रदर्शित होगी (जिसके लिए आपको initप्रगति की गणना करने के लिए पैरामीटर भी पास करना होगा )।

वहाँ भी indeterminateProgressDialog()विधि है, जो बर्खास्तगी तक कताई सर्किल एनीमेशन प्रदान करता है:

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

इस ब्लॉग के लिए चिल्लाएँ जिसने मुझे इस समाधान के लिए प्रेरित किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.