2012-09-06 16 views
14

UPDATED में viewpager और विचारों लागू करना सीखें: मैं निम्नलिखित लेआउट का उपयोग कर सकते Viewpager में 3 textviews लागू करने के लिए:एंड्रॉयड: एकल xml फ़ाइल

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

     <TextView 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="view 1"/> 
     <TextView 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="view 2"/> 
     <TextView 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="view 3"/> 

    </android.support.v4.view.ViewPager> 
</LinearLayout> 

मैं इन 3 विचारों के लिए ViewPager लागू करना चाहते हैं। और मैं सिंगल एक्सएमएल फ़ाइल में व्यूपेजर और उन 3 विचारों को देखना चाहता हूं। प्रत्येक पृष्ठ में प्रत्येक टेक्स्टव्यू होता है। मैंने कुछ उदाहरण देखे हैं लेकिन प्रत्येक पृष्ठ को अलग एक्सएमएल लेआउट फ़ाइल का उपयोग करके कार्यान्वित किया गया था।

मैं एक ही एक्सएमएल फ़ाइल में इन 3 विचारों के लिए व्यूपर को कैसे कार्यान्वित कर सकता हूं। यदि संभव हो तो कृपया मुझे एक नमूना कोड या उदाहरण प्रदान करें।

+0

क्या आप नमूना स्क्रीनशॉट जोड़ सकते हैं। – Sekar

उत्तर

1

पाया जा सकता है मैं एक ही xml फ़ाइल में इन 3 विचारों के लिए viewpager कैसे लागू कर सकते हैं पैदा करते हैं।

क्षमा करें, लेकिन यह संभव नहीं है।

+0

http://stackoverflow.com/questions/18710561/can-i-use-view-pager-with-views-not-with-fragments –

+0

यह काफी संभव है। यदि आप viewPager.setOffscreenPageLimit (N) सेट करते हैं; –

-2

सीधे शब्दों में: आपकी फ़ाइल में एक ViewPager जोड़ सकते हैं और अपने 3 TextView के अंदर डाल दिया ...

+0

मुझे आज़माएं। असल में मैंने अभी तक लागू नहीं किया है। मैंने अभी उदाहरणों को देखा है कि इसे कैसे कार्यान्वित किया जाए और देखा कि पृष्ठ कोड और व्यूपार्ज कोड (xml) अलग-अलग फ़ाइलों में लागू किए गए हैं। –

1

अपने XML लेआउट फाइल में इस ऐड

<android.support.v4.view.ViewPager 
    android:id="@+id/view_pager" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" /> 

बनाने 3 Fragment रों और हर टुकड़ा के लिए प्रत्येक TextView जोड़ने । फिर एक एडाप्टर कि PagerAdapter

subclassed एक अच्छा उदाहरण here

+1

इस उदाहरण में खंड और व्यूपार्जर अलग xml फ़ाइलों में बनाए रखा जाता है। मैं दोनों को एकल xml फ़ाइल –

+0

में बनाए रखना चाहता हूं जो आप पूरा करने की कोशिश कर रहे हैं? अपने प्रश्न को संपादित करने और कुछ जानकारी जोड़ने के बारे में जो हमें उपयोगी हो सकता है? – chip

+0

मैंने प्रश्न और कोड अपडेट किया था। –

46

आप बच्चों के विचारों को घोंसले वाले एक एक्सएमएल लेआउट का उपयोग कर सकते हैं।

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 
      android:id="@+id/page_one" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" > 
        <TextView 
        android:text="PAGE ONE IN" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:textColor="#fff" 
        android:textSize="24dp"/> 
     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/page_two" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" > 
        <TextView 
        android:text="PAGE TWO IN" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:textColor="#fff" 
        android:textSize="24dp"/> 
     </LinearLayout> 

    </android.support.v4.view.ViewPager> 

</LinearLayout> 

लेकिन ... आपको इसे एडाप्टर के साथ भी संभालने की आवश्यकता है। यहां हम किसी भी अन्य लेआउट को फुले बिना खोजी गई आईडी आईडी वापस कर देते हैं।

class WizardPagerAdapter extends PagerAdapter { 

     public Object instantiateItem(View collection, int position) { 

      int resId = 0; 
      switch (position) { 
      case 0: 
       resId = R.id.page_one; 
       break; 
      case 1: 
       resId = R.id.page_two; 
       break; 
      } 
      return findViewById(resId); 
     } 

     @Override 
     public int getCount() { 
      return 2; 
     } 

     @Override 
     public boolean isViewFromObject(View arg0, Object arg1) { 
      return arg0 == ((View) arg1); 
     } 
    } 



    // Set the ViewPager adapter 
    WizardPagerAdapter adapter = new WizardPagerAdapter(); 
    ViewPager pager = (ViewPager) findViewById(R.id.pager); 
    pager.setAdapter(adapter); 

मेरा प्रश्न है ... यहाँ कुछ गुरु मुझे सिखा सकते हैं, तो संभव है कि ViewPager एक्सएमएल और ऑटो से बच्चों को पढ़ने के लिए) के बिना instantiateItem का उपयोग करें (पृष्ठों का निर्माण?

+9

आप विधि destroyItem ओवरराइड करने के लिए की आवश्यकता होगी: @Override \t \t सार्वजनिक शून्य destroyItem (arg0 देखें, पूर्णांक ARG1, वस्तु ARG2) { \t \t} – Kowlown

+0

आप मेरा दिन बना दिया thnks बहुत !!!!!!!!!! बच्चे को ऑटो बनाने के लिए – vnshetty

+1

आप एडाप्टर में एक कन्स्ट्रक्टर जोड़ सकते हैं जो पेजर को पैरामीटर के रूप में लेता है। तत्काल आइटम के अंदर आप अब पेजर.getChildAt (स्थिति) वापस कर सकते हैं; जबकि getCount() में आप पेजर लौट सकते हैं .getChildCount() –

2

असंभव thats है.आप यह इन

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.view.ViewPager 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/pager" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 

तो बनाने के अलग xml फ़ाइल की तरह करते हैं और this.for जैसे जैसे यह कर सकते हैं: मैं xml फ़ाइल नाम का उपयोग करने वाले कर रहा हूँ ios_frag.xml है:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:gravity="center" 
android:orientation="vertical" > 
<TextView 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="50sp"/> 
</LinearLayout> 
1

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

package com.packagename; 

import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.View; 
import android.view.ViewGroup; 

import java.util.ArrayList; 
import java.util.List; 

public class ViewGroupPagerAdapter extends PagerAdapter { 
    public ViewGroupPagerAdapter(ViewGroup viewGroup) { 
     while (viewGroup.getChildCount() > 0) { 
      views.add(viewGroup.getChildAt(0)); 
      viewGroup.removeViewAt(0); 
     } 
    } 

    private List<View> views = new ArrayList<View>(); 

    @Override 
    public Object instantiateItem(ViewGroup parent, int position) { 
     View view = views.get(position); 
     ViewPager.LayoutParams lp = new ViewPager.LayoutParams(); 
     lp.width = ViewPager.LayoutParams.FILL_PARENT; 
     lp.height = ViewPager.LayoutParams.FILL_PARENT; 
     view.setLayoutParams(lp); 
     parent.addView(view); 
     return view; 
    } 

    @Override 
    public void destroyItem(ViewGroup parent, int position, Object object) { 
     View view = (View) object; 
     parent.removeView(view); 
    } 

    @Override 
    public int getCount() { 
     return views.size(); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == object; 
    } 
} 

उपयोग:

ViewPager viewPager=findViewById(...); // Retrieve the view pager 
viewPager.setAdapter(new ViewGroupPagerAdapter(findViewById(R.id.id_of_your_view_group_where_you_store_the_pages))); 
+0

और आप अपनी मुख्य सक्रियता में वर्तमान दृश्य कैसे प्राप्त करेंगे? – Denny

1

आप ViewPager उपवर्ग और onInflate ओवरराइड कर सकते हैं।
इसके अलावा, आपको लेआउट संपादक में पहले व्यू पेजर पेज का पूर्वावलोकन मिलेगा।
सभी विचार स्मृति में रखे गए हैं ताकि प्रदर्शन कारणों से आपको केवल कुछ ही पृष्ठों के साथ इसका उपयोग करना चाहिए।

@Override protected void onFinishInflate() { 
    int childCount = getChildCount(); 
    final List<View> pages = new ArrayList<>(childCount); 
    for (int i = 0; i < childCount; i++) { 
     View child = getChildAt(i); 
     Class<?> clazz = child.getClass(); 
     if (clazz.getAnnotation(DecorView.class) == null) { 
      pages.add(child); 
     } 
    } 
    for (View page : pages) { 
     removeView(page); 
    } 
    setAdapter(new PagerAdapter() { 
     @Override public int getCount() { 
      return pages.size(); 
     } 

     @Override public Object instantiateItem(ViewGroup container, int position) { 
      container.addView(pages.get(position)); 
      return position; 
     } 

     @Override public void destroyItem(ViewGroup container, int position, Object object) { 
      container.removeView(pages.get((Integer)object)); 
     } 

     @Override public boolean isViewFromObject(View view, Object object) { 
      return pages.get((Integer)object) == view; 
     } 
    }); 
    super.onFinishInflate(); 
} 
0
viewPager = (ViewPager) rootView.findViewById(R.id.viewpager); 
    viewPager.setAdapter(new MyPagerAdapter(rootView)); 
    viewPager.setOffscreenPageLimit(3); //or whatever you like 

यह कैश और पूरी तरह से पता चलता है।

संबंधित मुद्दे