Android Pull-to-Refresh कैसे लागू करें


432

एंड्रॉइड एप्लिकेशन जैसे ट्विटर (आधिकारिक ऐप) में, जब आप एक सूची दृश्य का सामना करते हैं, तो आप सामग्री को ताज़ा करने के लिए इसे नीचे खींच सकते हैं (और जब यह वापस आएगा)।

मुझे आश्चर्य है कि आपकी राय में, इसे लागू करने का सबसे अच्छा तरीका क्या है?

कुछ संभावनाएं जो मैं सोच सकता था:

  1. ListView के शीर्ष पर एक आइटम - हालाँकि मुझे नहीं लगता कि ListView पर एनीमेशन के साथ आइटम स्थिति 1 (0-आधारित) पर वापस स्क्रॉल करना एक आसान काम है।
  2. ListView के बाहर एक और दृश्य - लेकिन जब इसे खींचा गया है तो मुझे ListView स्थिति को नीचे ले जाने का ध्यान रखना होगा, और मुझे यकीन नहीं है कि क्या हम यह पता लगा सकते हैं कि क्या ListView को ड्रैग-टच अभी भी वास्तव में ListView पर आइटम स्क्रॉल करता है या नहीं।

कोई सिफारिशें?

PS मुझे आश्चर्य है कि जब आधिकारिक ट्विटर ऐप स्रोत कोड जारी किया जाता है। यह उल्लेख किया गया है कि यह जारी किया जाएगा, लेकिन 6 महीने बीत चुके हैं और हमने तब से इसके बारे में नहीं सुना है।


क्या इस कार्यक्षमता को गतिशील रूप से बनाए गए TableLayout में लागू किया जा सकता है। कृपया मदद करें .....
अरुण बडोले 13

github.com/fruitranger/PulltorefreshListView मेरा एक और कार्यान्वयन है। चिकना और बहु-स्पर्श समर्थन।
चांगवेई याओ

6
संबंधित: "पुल-टू-रिफ्रेश": एंड्रॉइड पर एक एंटी यूआई पैटर्न एक लेख है जिसमें यह तर्क दिया गया है कि यह यूआई कुछ ऐसा नहीं है जिसे एंड्रॉइड पर उपयोग किया जाना चाहिए और इसकी उपयुक्तता के बारे में बहुत चर्चा की।
२०:५० पर blahdiblah

29
किसी को Google को बताना चाहिए क्योंकि Android के लिए Gmail का नवीनतम संस्करण इस "विरोधी पैटर्न" का उपयोग करता है।
निक

4
ताज़ा करने के लिए खींचो (और थोड़ी देर के लिए है) आईओएस और एंड्रॉइड में एक मानक अपनाया गया पैटर्न है और यह बहुत स्वाभाविक है, इसलिए यह पैटर्न विरोधी चर्चा पुरानी है। उपयोगकर्ता इसे देखने और इस तरह से व्यवहार करने की उम्मीद करेंगे।
मार्टिन मार्कोसिनी

जवाबों:


310

अंत में, Google ने पुल-टू-रिफ्रेश लाइब्रेरी का एक आधिकारिक संस्करण जारी किया!

यह कहा जाता है SwipeRefreshLayout, समर्थन पुस्तकालय के अंदर, और प्रलेखन यहाँ है :

  1. SwipeRefreshLayoutदृश्य के माता-पिता के रूप में जोड़ें, जिसे लेआउट को ताज़ा करने के लिए एक पुल के रूप में माना जाएगा। (मैंने ListViewएक उदाहरण के रूप में लिया , यह किसी भी Viewतरह हो सकता है LinearLayout, ScrollViewआदि)

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/pullToRefresh"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </android.support.v4.widget.SwipeRefreshLayout>
  2. अपनी कक्षा में एक श्रोता जोड़ें

    protected void onCreate(Bundle savedInstanceState) {
        final SwipeRefreshLayout pullToRefresh = findViewById(R.id.pullToRefresh);
        pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refreshData(); // your code
                pullToRefresh.setRefreshing(false);
            }
        });
    }

आप pullToRefresh.setRefreshing(true/false);अपनी आवश्यकता के अनुसार कॉल भी कर सकते हैं।

अपडेट करें

Android समर्थन पुस्तकालयों को हटा दिया गया है और उन्हें AndroidX द्वारा बदल दिया गया है। नई लाइब्रेरी का लिंक यहां पाया जा सकता है

इसके अलावा, आपको अपनी परियोजना में निम्नलिखित निर्भरता जोड़ने की आवश्यकता है:

implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'

या

आप Refactor पर जा सकते हैं >> AndroidX में माइग्रेट करें और Android Studio आपके लिए निर्भरता को संभाल लेगा।


3
क्या मैं SwipeRefreshLayout पर रंग योजना के बजाय एक ProgressBar का उपयोग कर सकता हूं?
पाब्लोकेडज़

54
अप्रैल 1 '14 - और वह मजाक नहीं था
एरैकोड

2
उदाहरण कोड गाइड.कोडपथ.com
android/

80

मैंने एक घटक को ताज़ा करने के लिए एक पुल को लागू करने का प्रयास किया है, यह पूरी तरह से दूर है लेकिन एक संभावित कार्यान्वयन को प्रदर्शित करता है, https://github.com/johannilsson/android-pulltorefresh

मुख्य तर्क का PullToRefreshListViewविस्तार इसमें लागू है ListViewआंतरिक रूप से यह smoothScrollBy(एपीआई स्तर 8) का उपयोग करके हेडर दृश्य की स्क्रॉलिंग को नियंत्रित करता है । विजेट अब 1.5 के लिए समर्थन के साथ अद्यतन किया गया है और बाद में, कृपया 1.5 समर्थन के लिए README पढ़ें।

अपने लेआउट में आप इसे इस तरह जोड़ते हैं।

<com.markupartist.android.widget.PullToRefreshListView
    android:id="@+id/android:list"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    />

3
हाय जोहान, मैंने आपका नमूना कोड डाउनलोड किया है। यह एंड्रॉइड 2.2 डिवाइस में काम किया जाता है लेकिन 2.1 डिवाइस में काम नहीं किया जाता है। मुझे लगता है क्योंकि यह smoothScrollBy विधि का उपयोग करता है जो केवल 2.2 या बाद में उपलब्ध है, सही है? और क्या आपके पास इस प्रभाव को 2.1 या पुराने संस्करण में लागू करने का कोई विचार है? धन्यवाद

हाँ यह सही है जैसा कि मैंने उत्तर में कहा है smoothScrollBy एपीआई स्तर 8 (2.2) में पेश किया गया था। मैंने अभी तक अन्य संस्करणों के लिए इसे लागू करने का एक उचित तरीका नहीं निकाला है, लेकिन यह अनुमान लगाता है कि इसे smoothScrollBy के कार्यान्वयन को पोर्ट करना संभव होना चाहिए लेकिन मुझे लगता है कि चर्चा को परियोजना स्थल पर रखा जाना चाहिए और स्टैक ओवरफ्लो पर नहीं?
जोहान बर्ग निल्सन

क्या यह इस उद्देश्य पर है कि आईडी @ + आईडी / एंड्रॉइड: सूची है या नहीं @android: आईडी / सूची, यह अजीब लगता है? परियोजना मेरी ओर से एक मुद्रास्फीति की दर फेंकता है, मैं वर्तमान में उस पर जाँच कर रहा हूँ ...
मैथियास कॉनरैड

12
यह मुझे मिल गया ताज़ा करने के लिए पुल के लिए सबसे अच्छा पुस्तकालय है .. github.com/chrisbanes/Android-PullToebefresh । यह ListViews, GridViews और वेबव्यू के साथ काम करता है। इसके अलावा कार्यान्वित पैटर्न को ताज़ा करने के लिए खींचो।
rOrlig

1
इंटेलीज आइडिया पर काम करते हुए मैं प्रोजेक्ट को लाइब्रेरी फ़ोल्डर में कैसे जोड़ूं? कोई भी मेरी मदद कर सकता हैं?
मुस्तफा गुवेन

55

मैंने एंड्रॉइड के लिए एक मजबूत, खुला स्रोत, उपयोग करने में आसान और उच्च अनुकूलन योग्य PullToRefresh लाइब्रेरी भी लागू की है। आप अपने ListView को PullToRefreshListView के साथ बदल सकते हैं जैसा कि परियोजना पृष्ठ पर प्रलेखन में वर्णित है।

https://github.com/erikwt/PullToRefresh-ListView


मैंने यहां पर लागू किए गए सभी कार्यान्वयनों की कोशिश की और आपके लिए सबसे अच्छा है, ताज़ा कार्यान्वयन के लिए एक सरल / शुद्ध / चिकनी पुल के रूप में और जोहान की तरह अजीबता को ताज़ा करने के लिए कोई नल नहीं है)। धन्यवाद!
गाधी

1
यह ListActivity, ListFragment और इतने पर के साथ काम करने के लिए एक मानक ListView को बदल सकता है?
davidcesarino 2

हां, बस PullToRefreshListView को सही आईडी दें। XML में: android: id = "@ android: id / list"
Erik

1
यह बिल्कुल भयानक है! Google ने मुझे यहां लाया, और उदाहरणों को देखते हुए, आपके लागू करने के लिए सबसे आसान लग रहा है। ब्रावो और धन्यवाद सर!
इवान आर।

बहुत समझदारी से डिज़ाइन किया गया घटक, अच्छा और सरल। यह निश्चित रूप से स्वीकृत उत्तर होना चाहिए।
एडम

42

सबसे आसान तरीका मुझे लगता है कि एंड्रॉइड सपोर्ट लाइब्रेरी द्वारा प्रदान किया गया है:

android.support.v4.widget.SwipeRefreshLayout;

एक बार आयात होने के बाद आप अपने लेआउट को निम्न प्रकार से परिभाषित कर सकते हैं:

  <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/refresh"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
    <android.support.v7.widget.RecyclerView
        xmlns:recycler_view="http://schemas.android.com/apk/res-auto"
        android:id="@android:id/list"
        android:theme="@style/Theme.AppCompat.Light"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/button_material_light"
        >

    </android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>

मुझे लगता है कि आप सूची के बजाय पुनर्नवीनीकरण दृश्य का उपयोग करते हैं। हालाँकि, सूची अभी भी काम करती है, इसलिए आपको केवल सूची के साथ recyclerview को बदलने और जावा कोड (फ़्रैग्मेंट) में संदर्भों को अपडेट करने की आवश्यकता है।

आपकी गतिविधि के टुकड़े में, आप पहले इंटरफ़ेस लागू करते हैं SwipeRefreshLayout.OnRefreshListener: i, e

public class MySwipeFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener{
private SwipeRefreshLayout swipeRefreshLayout;

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_item, container, false);
        swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh);
        swipeRefreshLayout.setOnRefreshListener(this);
}


 @Override
  public void onRefresh(){
     swipeRefreshLayout.setRefreshing(true);
     refreshList();
  }
  refreshList(){
    //do processing to get new data and set your listview's adapter, maybe  reinitialise the loaders you may be using or so
   //when your data has finished loading, cset the refresh state of the view to false
   swipeRefreshLayout.setRefreshing(false);

   }
}

आशा है कि इससे आम जनता को मदद मिलेगी


यह अच्छा काम करता है। हालांकि, के बारे में एक बात setRefreshingहै: "इस फोन न करें जब ताज़ा एक कड़ी चोट इशारा से शुरू हो रहा" में बताए अनुसार developer.android.com/reference/android/support/v4/widget/...
gabriel14

बहुत बढ़िया! धन्यवाद।
टेक्निक

22

इस लिंक में, आप उस प्रसिद्ध PullToRefreshदृश्य का एक कांटा पा सकते हैं जिसमें नई दिलचस्प कार्यान्वयन हैं जैसे कि PullTorRefreshWebViewया किसी सूची के निचले किनारे पर PullToRefreshGridViewजोड़ने की संभावना PullToRefresh

https://github.com/chrisbanes/Android-PullToRefresh

और यह सबसे अच्छा है कि एंड्रॉइड 4.1 में काम सही है (सामान्य PullToRefreshकाम नहीं करता है)


3
रीडमी के शीर्ष पर एक बड़ी टिप्पणी इंगित करती है: यह परियोजना किसी भी मुख्य आधार पर नहीं है। वैसे भी, यह दायित्व सबसे अच्छा है जिसे मैंने अब तक देखा है! अच्छा कार्य!
मिल्टन

3
सिर्फ इसलिए कि अब इसे बनाए नहीं रखा जा रहा है, इसका मतलब यह नहीं है कि यह अच्छा नहीं है। फिर भी इसे ताज़ा ज़रूरतों के लिए मेरे सभी पुल के लिए उपयोग करें :)
मग

18

मेरे पास ऐसा करने का बहुत आसान तरीका है लेकिन अब यह सुनिश्चित करना है कि यह मूर्खतापूर्ण तरीका है मेरा कोड PullDownListView.wava है

package com.myproject.widgets;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;

/**
 * @author Pushpan
 * @date Nov 27, 2012
 **/
public class PullDownListView extends ListView implements OnScrollListener {

    private ListViewTouchEventListener mTouchListener;
    private boolean pulledDown;

    public PullDownListView(Context context) {
        super(context);
        init();
    }

    public PullDownListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public PullDownListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        setOnScrollListener(this);
    }

    private float lastY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            lastY = ev.getRawY();
        } else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
            float newY = ev.getRawY();
            setPulledDown((newY - lastY) > 0);
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (isPulledDown()) {
                        if (mTouchListener != null) {
                            mTouchListener.onListViewPulledDown();
                            setPulledDown(false);
                        }
                    }
                }
            }, 400);
            lastY = newY;
        } else if (ev.getAction() == MotionEvent.ACTION_UP) {
            lastY = 0;
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        setPulledDown(false);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    public interface ListViewTouchEventListener {
        public void onListViewPulledDown();
    }

    public void setListViewTouchListener(
            ListViewTouchEventListener touchListener) {
        this.mTouchListener = touchListener;
    }

    public ListViewTouchEventListener getListViewTouchListener() {
        return mTouchListener;
    }

    public boolean isPulledDown() {
        return pulledDown;
    }

    public void setPulledDown(boolean pulledDown) {
        this.pulledDown = pulledDown;
    }
}

आपको अपनी गतिविधि पर ListViewTouchEventListener को लागू करने की आवश्यकता है जहां आप इस सूची दृश्य का उपयोग करना चाहते हैं और श्रोता को सेट कर सकते हैं

मैंने इसे PullDownListViewActivity में लागू किया है

package com.myproject.activities;

import android.app.Activity;
import android.os.Bundle;

/**
 * @author Pushpan
 *
 */
public class PullDownListViewActivity extends Activity implements ListViewTouchEventListener {

    private PullDownListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        listView = new PullDownListView(this);
        setContentView(listView);
        listView.setListViewTouchListener(this);

        //setItems in listview
    }

    public void onListViewPulledDown(){
        Log.("PullDownListViewActivity", "ListView pulled down");
    }
}

इससे मेरा काम बनता है :)


18

Android Pull-to-Refresh को लागू करने के लिए इस कोड के टुकड़े को आज़माएं,

<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/pullToRefresh"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

</android.support.v4.widget.SwipeRefreshLayout>

गतिविधि वर्ग:

ListView lv = (ListView) findViewById(R.id.lv);
SwipeRefreshLayout pullToRefresh = (SwipeRefreshLayout) findViewById(R.id.pullToRefresh);


lv.setAdapter(mAdapter);

pullToRefresh.setOnRefreshListener(new OnRefreshListener() {

        @Override
        public void onRefresh() {
            // TODO Auto-generated method stub

            refreshContent();

        }
    });



private void refreshContent(){ 

     new Handler().postDelayed(new Runnable() {
            @Override public void run() {
                pullToRefresh.setRefreshing(false);
            }
        }, 5000);

 }

1
धन्यवाद। यह वास्तव में मेरी मदद करता है
अर्पण शर्मा

9

किसी ने भी नए प्रकार के "पुल टू रिफ्रेश" का उल्लेख नहीं किया है जो Google नाओ या जीमेल एप्लीकेशन की तरह एक्शन बार में सबसे ऊपर दिखाई देता है।

एक पुस्तकालय ActionBar-PullToRefresh है जो ठीक उसी तरह काम करता है।


7

ध्यान दें कि एंड्रॉइड और डब्ल्यूपी पर लागू होने के साथ संघर्ष करने के लिए यूएक्स मुद्दे हैं।

"इस बात के लिए एक महान संकेतक कि डिजाइनर / देवों को आईओएस ऐप्स में शैली में पुल-टू-रिफ्रेश लागू नहीं करना चाहिए, यह है कि Google और उनकी टीमें कभी भी एंड्रॉइड पर पुल-टू-रिफ्रेश का उपयोग नहीं करती हैं, जबकि वे आईओएस में इसका उपयोग करते हैं।"

https://plus.google.com/109453683460749241197/posts/eqYxXR8L4eb


3
मुझे पता है कि यह एक साल से अधिक पुराना है लेकिन जीमेल ऐप पुल-टू-रिफ्रेश का उपयोग करता है। हालाँकि UI के संदर्भ में यह बिल्कुल समान नहीं है, सूची नीचे स्क्रॉल नहीं करती है, बल्कि स्क्रीन के शीर्ष पर एक नया दृश्य दिखाता है।
आशीषुध

4

यदि आप नहीं चाहते हैं कि आपका प्रोग्राम एक iPhone प्रोग्राम की तरह दिखे, जो एंड्रॉइड में फिट हो, तो अधिक देशी लुक और महसूस करें और जिंजरब्रेड के समान कुछ करें:

वैकल्पिक शब्द


2
@ रब: मेरा मतलब था कि जब आप ओवरपॉल करेंगे तो सूची के शीर्ष पर नारंगी छाया होने के बजाय, सूची को आईफोन की तरह उछाल दें। यह एक टिप्पणी (जवाब नहीं) के रूप में अभिप्रेत है, लेकिन टिप्पणियों में चित्र नहीं हो सकते।
रेयान

आह, माफ करना, महान विचार। मैंने अभी तक जिंजरब्रेड के साथ नहीं खेला है, इसलिए प्रभाव नहीं देखा था। अभी भी यह इंतज़ार कर रहा है कि गूगल इसे सांठगांठ के लिए रोल करे।
रोब

9
मेरे पास जिंजरब्रेड है और एक सूची स्थिर होने पर नारंगी चमक शानदार काम करती है। लेकिन डायनेमिक सूची को रीफ्रेश करने के लिए पुल-डाउन-रिफ्रेश एक बेहतरीन यूआई मैकैनिज्म है। हालाँकि यह आईओएस दुनिया में प्रचलित है, यह एक यूआई ट्रिक है जो एंड्रॉइड इकोसिस्टम में अजीब महसूस नहीं करता है। मैं दृढ़ता से सुझाव देता हूं कि आप इसे आधिकारिक ट्विटर ऐप में देखें। :)
थिएरी-दिमित्री रॉय

यहां मूल व्यवहार यह दर्शाता है कि आप किसी सूची के अंत तक पहुँच चुके हैं। इसे लेना, और एक ताज़ा प्रदर्शन करना गैर-देशी है क्योंकि आप वह नहीं कर रहे हैं जो मंच करता है। इसका मतलब है कि आप उपयोगकर्ता को आश्चर्यचकित कर सकते हैं। मैं निश्चित रूप से उम्मीद नहीं करूंगा और न ही एक रिफ्रेश चाहता हूं क्योंकि मुझे एक सूची का अंत मिला है। ताज़ा करने के लिए नीचे खींचो एक बहुत अधिक सहज और स्पष्ट है। और जैसा कि देशी ट्विटर ऐप इसका उपयोग करता है मुझे लगता है कि यह कहना उचित है कि यह एक यूआई अवधारणा है जिससे बड़ी संख्या में लोग परिचित हैं।
स्टेप्रोब

4

मैंने यहां रिफ्रेश कंपोनेंट के लिए एक पुल लिखा है: https://github.com/guillep/PullToRefresh यह काम करता है अगर सूची में आइटम नहीं हैं, और मैंने इसे> = 1.6 एंड्रॉइड फोन पर परीक्षण किया है।

किसी भी सुझाव या सुधार की सराहना की है :)



1

नवीनतम लॉलीपॉप पुल-टू रिफ्रेश पाने के लिए:

  1. नवीनतम लॉलीपॉप एसडीके और एक्स्ट्रा / एंड्रॉइड सपोर्ट लाइब्रेरी डाउनलोड करें
  2. एंड्रॉइड 5.0 पर प्रोजेक्ट का बिल्ड लक्ष्य सेट करें (अन्यथा समर्थन पैकेज में संसाधनों के साथ त्रुटियां हो सकती हैं)
  3. अपने libs / android-support-v4.jar को 21 वें संस्करण में अपडेट करें
  4. android.support.v4.widget.SwipeRefreshLayoutप्लस का उपयोग करेंandroid.support.v4.widget.SwipeRefreshLayout.OnRefreshListener

विस्तृत गाइड यहां पाया जा सकता है: http://antonioleiva.com/swiperefreshlayout/

प्लस के लिए सूची दृश्य मैं canChildScrollUp()टिप्पणियों में पढ़ने की सलाह देता हूं ;)


इसके अलावा एक सिर्फ canChildScrollUp () का उल्लेख करने के लिए। बहोत महत्वपूर्ण!
पेट्रो

1

यलंतिस द्वारा बहुत दिलचस्प पुल-टू-रिफ्रेश । IOS के लिए Gif, लेकिन आप इसे देख सकते हैं :)

<com.yalantis.pulltorefresh.library.PullToRefreshView
android:id="@+id/pull_to_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
    android:id="@+id/list_view"
    android:divider="@null"
    android:dividerHeight="0dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />


0

हमें पहले पता होना चाहिए कि एंड्रॉइड में लेआउट को रीफ्रेश करने के लिए पुल क्या है। हम पुल को एंड्रॉइड में स्वाइप-रिफ्रेश के रूप में रिफ्रेश करने के लिए कॉल कर सकते हैं। जब आप स्क्रीन को ऊपर से नीचे की ओर स्वाइप करते हैं तो यह setOnRefreshListener पर आधारित कुछ एक्शन करेगा।

यहाँ ट्यूटोरियल है कि कैसे ताज़ा करने के लिए Android पुल को लागू करने के बारे में प्रदर्शित करता है। आशा है कि ये आपकी मदद करेगा।

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