স্টাফ লোড করার সময় একটি চিত্রভিউতে "অ্যানিমেটেড চেনাশোনা" ব্যবহার করা


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

আপনার ক্রিয়াকলাপের লেআউট ফাইলটিতে কেবল এক্সএমএলটির এই ব্লকটি রাখুন:

<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 বোতাম থেঁত
টিএসআর

এটি চিত্রবিউতে কোনও অ্যানিমেটেড চেনাশোনা দেখানোর সমস্যাটি কীভাবে সমাধান করে তা দেখতে পাচ্ছেন না।
গুস্তাভো

4
@ গুস্তাভো, "অনির্দিষ্ট প্রগতি অ্যানিমেশন" দেখানোর জন্য তিনি এটাই চান, তাই আমি মনে করি এটি সমস্যার সমাধান করে। ; -]
থ্যালিস ভিলেলা

143

আপনি নিম্নলিখিত এক্সএমএল ব্যবহার করে এটি করতে পারেন

<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>

এটি ব্যবহার করতে, আপনাকে অবশ্যই GIE এ দৃশ্যমানতার মানটি সেট করে আপনার UI উপাদানগুলি অবশ্যই আড়াল করতে হবে এবং যখনই ডেটা লোড হবে, setVisibility(View.VISIBLE)সেগুলি পুনরুদ্ধার করার জন্য আপনার সমস্ত দর্শনগুলিতে কল করুন। findViewById(R.id.loadingPanel).setVisiblity(View.GONE)লোডিং অ্যানিমেশনটি লুকানোর জন্য কল করতে ভুলবেন না ।

যদি আপনার কোনও লোডিং ইভেন্ট / ক্রিয়াকলাপ না থাকে তবে কেবল সেকেন্ডের পরে লোডিং প্যানেলটি অদৃশ্য হয়ে যেতে চান লুকানো / শোকে ট্রিগার করতে কোনও হ্যান্ডেল ব্যবহার করুন ।


4
দুর্দান্ত উত্তর। গুগল অনুসন্ধানের মাধ্যমে পাওয়া গেছে এবং আমার সমস্যাটিও সমাধান করেছে। ধন্যবাদ!
ডেভ

এই পদ্ধতিটি ব্যবহার করে, আমি findViewById(...).setVisibility(View.GONE)যখন স্ক্রিনটি ঘোরান তখন আমি লাইনে একটি নালপয়েন্টার এক্সসেপশন পাই। একমুখীকরণে কবজির মতো কাজ করে, তবে কোনও ধারণা কেন এটি ভেঙে যেতে পারে?
কালিনা

আমার একটা প্রশ্ন আছে. আমার রিলেটিভলআউটটি বোতামগুলির মধ্যে লিনিয়ার লেআউটের ভিতরে দুটি বোতামের মধ্যে। আমি এটি চালানোর সময় এটি পুরো পর্দা নেয়। দুটি বোতামের মধ্যে এই লোডিং বারটি রাখার কোনও পরামর্শ?
Alioo

ঠিক আছে, আমি findViewById(R.id.loadingPanel).setVisiblity(View.GONE)দ্বিতীয় ক্রিয়াকলাপে কোডটি কোথায় রাখব ? ২ য় খণ্ডের ক্রিয়াকলাপে viewকোনও setContnetView()পদ্ধতি নেই বলে এটি খুঁজে পাচ্ছে না। ধন্যবাদ!
অ্যালস্টন

10

এটিকে সাধারণত একটি নির্ধারিত অগ্রগতি বার বা নির্ধারিত অগ্রগতি সংলাপ হিসাবে উল্লেখ করা হয় ।

আপনি যা চান ঠিক তা পেতে এটি একটি থ্রেড এবং হ্যান্ডলারের সাথে একত্রিত করুন । গুগলের মাধ্যমে কীভাবে এটি করা যায় তার জন্য এখানে বেশ কয়েকটি উদাহরণ রয়েছে বা ঠিক এখানে এসও তে। আমি ক্লাসগুলির এই সংমিশ্রণটি কীভাবে এটির মতো কার্য সম্পাদন করতে পারি তা শিখতে সময় দেওয়ার জন্য আমি অত্যন্ত সুপারিশ করব। এটি বিভিন্ন ধরণের অ্যাপ্লিকেশনগুলিতে অবিশ্বাস্যরূপে দরকারী এবং থ্রেডস এবং হ্যান্ডলারগুলি কীভাবে একসাথে কাজ করতে পারে তা আপনাকে একটি দুর্দান্ত অন্তর্দৃষ্টি দেয়।

আমি কীভাবে এটি কাজ করে তা শুরু করব:

লোডিং ইভেন্টটি ডায়ালগটি শুরু করে:

//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
আপনার উত্তরটি সত্যিই দুর্দান্ত বলে মনে হচ্ছে তবে আমি আমার লেআউটের ভিতরে এটি সন্নিবেশ করতে চাই ... ভেঙ্কটেশের উত্তর আমার ব্যবহারের পক্ষে আরও উপযুক্ত বলে মনে হচ্ছে I আমি চেষ্টা করব এবং প্রতিক্রিয়া পাঠাব। আপনার সময় জন্য অনেক ধন্যবাদ!
ওয়াজা_বি

এটির জন্য ধন্যবাদ, এক্সএমএল এবং কাজগুলি করার পদ্ধতিগত পদ্ধতি উভয়ের জন্য সমাধান পাওয়া আসলে ভাল।
নিয়ন ওয়ার্জ

1

আপনি যদি কেবলমাত্র অগ্রগতি নির্দেশ করতে অন্য মতামতকে স্ফীত না করতে চান তবে নিম্নলিখিতগুলি করুন:

  1. তালিকা ভিউজের একই এক্সএমএল বিন্যাসে প্রগতিবার তৈরি করুন।
  2. এটি কেন্দ্রিক করুন
  3. এটি একটি আইডি দিন
  4. সেটএম্পটিভিউ কল করে এটি আপনার তালিকার দৃষ্টান্তের ভেরিয়েবলের সাথে সংযুক্ত করুন

অ্যান্ড্রয়েড অগ্রগতি বারের দৃশ্যমানতা যত্ন নেবে।

উদাহরণস্বরূপ, এতে 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) {

        }
    });


}

}


প্রগতিবারটি আপেক্ষিক
লেআউটের

1

আপনি এই কোডটি ফায়ারবেস গিথুব নমুনা থেকে ব্যবহার করতে পারেন ..

আপনার লেআউট ফাইলগুলিতে সম্পাদনা করার দরকার নেই ... কেবলমাত্র একটি নতুন শ্রেণি "বেসএকটিভিটি" করুন

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

কোটলিনে বিকাশকারীদের জন্য, আনকো লাইব্রেরি দ্বারা সরবরাহ করা একটি মিষ্টি পদ্ধতি রয়েছে যা 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.