5

से एक टुकड़े की विधि तक पहुंचें मेरे पास एक विधि setName() के साथ एक टुकड़ा है जो setText फ़ंक्शन के माध्यम से एक संपादन टेक्स्ट टेक्स्ट को बदलता है।ViewPager गतिविधि

उस विधि को उस गतिविधि से कॉल करने का सबसे अच्छा तरीका क्या है जो व्यूपार्जर के माध्यम से उस खंड को होस्ट करता है?

दूसरे शब्दों में, मैं एक पेजगेज के माध्यम से उस खंड को होस्ट करने वाली गतिविधि से फ्रैगमेंट के तरीकों (उदाहरण के लिए उस खंड का लेआउट कैसे बदल सकता हूं) को कैसे एक्सेस कर सकता हूं?

मैं यह पूछ रहा हूं क्योंकि मैंने कई तरीकों से प्रयास किया है, लेकिन हमेशा त्रुटियों के साथ।

+0

आप टुकड़ा का एक उदाहरण चर बनाने के लिए कोशिश कर सकते हैं के साथ आपकी गतिविधि कक्षा में etName() 'विधि। जब आप इसे तुरंत चालू करते हैं तो चर को फ्रेगमेंट में असाइन करें। फिर आप अपनी गतिविधि से 'fragment.setName() 'को कॉल कर सकते हैं – Scott

+0

मुझे यह समस्या है, लेकिन इसे संग्रहीत संदर्भ के माध्यम से fragment.setName() को कॉल करना समस्या नहीं है। समस्या यह है कि टुकड़े से, getActivity() शून्य वापस आती है ताकि विचारों तक पहुंचा जा सके। मैं गतिविधि से विचारों तक पहुंच सकता हूं, और, टुकड़ा विन्यास पर खंड से संबंधित विचारों में जानकारी डाल सकता है। लेकिन बाद में, getActivity() शून्य वापस आती है और क्या यह दृष्टिकोण के साथ कुछ हो सकता है जो संदर्भ के नियंत्रण ले रहा है ताकि प्राप्त हो सके वास्तव में वैधता वैध नहीं है? तो किसी को व्यूपर से दृश्य का अनुरोध करने की आवश्यकता होगी? मैं पूछ रहा हूँ। – carl

उत्तर

3

आप अपने ViewPager द्वारा आयोजित टुकड़ों के भीतर सार्वजनिक विधियों तक पहुंच सकते हैं। जब आप इसे बनाते हैं तो आपको Fragment के संदर्भ को स्टोर करने की आवश्यकता होती है और इसे उस सूची में जोड़ना जो आपके पेजर एडाप्टर को वापस लाएगा या (2) आपको पेजर एडाप्टर से खंड के संदर्भ में जाना होगा। उदाहरण के लिए:

Fragment fragmentA = null; //instance variable 

fragmenA = new Fragment(); //whereever you instantiate your fragment 

यदि आपका विधि

public void setName(String args){ 
    //do something 
} 

सब आप क्या करेंगे टुकड़ा अपने ViewPager

fragmentA.setName(args); 

द्वारा आयोजित आप जो कुछ भी तर्क पारित करने के लिए संदर्भ से है कि विधि कॉल है आपको एक नियमित विधि को कॉल करने की आवश्यकता है। ध्यान दें कि यह केवल तभी काम करता है यदि आप ViewPager या FragmentActivity से किसी खंड में किसी विधि को कॉल कर रहे हैं। यदि आप रिवर्स, गतिविधि के टुकड़े करना चाहते हैं, तो आपको एक इनरफेस का उपयोग करने की आवश्यकता है।

+0

हां, मुझे यह पहले से ही पता है। लेकिन क्या होगा यदि मैं इसे Frag1 खंड = (Frag1) mAppSectionsAdapter.getItem (0) जैसे कुछ का उपयोग करके इसे तुरंत चालू करने का प्रयास कर रहा हूं ;? कैसे मैं शून्य सूचक अपवाद के बिना विधि का उपयोग करने के लिए माना जाता है? – JZweige

+0

यह खंड की तरह है .getView() हमेशा शून्य है! – JZweige

+0

आप अपने एडाप्टर से संदर्भ प्राप्त करना चाहते हैं? मैं अपने कंप्यूटर पर नहीं हूं लेकिन अगर यह मुद्दा है तो मैं बाद में कोड पोस्ट कर सकता हूं। – Rarw

8

मुझे पता है कि यह थोड़ा देर हो चुकी है, लेकिन मैं एक ही समस्या में भाग गया और शायद अगर आप इसे हल कर चुके हैं तो यह दूसरों की मदद करेगा।

व्यूपेजर के साथ पहली समस्या यह है कि एक टुकड़े का संदर्भ प्राप्त करना लगभग असंभव है। टुकड़े getItem() में गतिशील रूप से बनाए जाते हैं और इसलिए आप एक आईडी सेट नहीं कर सकते हैं और वे स्वचालित रूप से swicher द्वारा फिर से व्यवस्थित होते हैं, इसलिए आप इसे टैग द्वारा नहीं ढूंढ सकते हैं। ऐसा करने के कुछ तरीके हैं, लेकिन वे सभी कामकाज हैं। (Update data in ListFragment as part of ViewPager)

जिस तरह से मैंने इसे हल किया, वह अनिवार्य रूप से एक डबल कॉलबैक का उपयोग कर रहा था। फ्रैगमेंट ए में मुख्य गतिविधि द्वारा कार्यान्वित एक इंटरफेस है, मुख्य गतिविधि में फ्रैगमेंट बी द्वारा कार्यान्वित एक इंटरफ़ेस है। उदा। फ्रैगमेंट में एक बटन क्लिंक ए मुख्य गतिविधि में कॉलबैक फ़ंक्शन को कॉल किया जाता है, जो बदले में फ्रैगमेंट बी में कॉलबैक को कॉल करता है। नीचे दिए गए कोड को देखें। मुझे उम्मीद है कि मैंने सबकुछ पोस्ट किया है और इससे मदद मिलेगी। बीटीडब्ल्यू, मैंने केवल एक ViewPager के साथ यह कोशिश की है, लेकिन मुझे लगता है कि यह किसी भी प्रकार के फ्रैगमेंट संचार के साथ काम करेगा।

मुख्य Avtivity जावा:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 

public class MainActivity extends FragmentActivity implements FragmentA.Caller { 

    SectionsPagerAdapter mSectionsPagerAdapter; 
    ViewPager mViewPager; 
    PassCallToB passOnToB = null; 
    FragmentManager myManager = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 
    } 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
      MyManager = fm; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      Fragment fragment = null; 
      if(position == 0) { 
       fragment = new FragmentA(); 
      } else if (position == 1) { 
       fragment = new FragmentB(); 
       passOnToB = (PassCallToB)fragment; 
      } 
      return fragment; 
     } 

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
      case 0: 
       return "Frag A"; 
      case 1: 
       return "Frag B"; 
      } 
      return null; 
     } 

     public void setCallback() { 
      List<Fragment> frags = myManager.getFragments(); 
      for(Fragment fragment : frags) { 
       if(fragment instanceof FragmentB){ 
        passOnToB = (PassCallToB)fragment; 
       } 
      } 
     } 
    } 

    public interface PassCallToB { 
     public void passItOn(); 
    } 

    @Override 
    public void CallB() { 
     if(passOnToB instanceof Fragment) 
      passOnToB.passItOn(); 
     else { 
      mSectionsPagerAdapter.setCallback(); 
      passOnToB.passItOn(); 
     } 
    } 
} 

मुख्य गतिविधि xml:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 

    <android.support.v4.view.PagerTitleStrip 
     android:id="@+id/pager_title_strip" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="top" 
     android:background="#33b5e5" 
     android:paddingBottom="4dp" 
     android:paddingTop="4dp" 
     android:textColor="#fff" /> 

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

टुकड़ा एक जावा:

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 

public class FragmentA extends Fragment { 

    Button btnCallB = null; 

    Caller listener = null; 

    public FragmentA() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle inState) { 
     View rootView = inflater.inflate(R.layout.fragment_a, container, false); 

     btnCallB = (Button)rootView.findViewById(R.id.btnCallB); 
     btnCallB.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       listener.CallB(); 
      } 

     }); 

     return rootView; 
    } 

    public interface Caller { 
     public void CallB(); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     if (activity instanceof FragmentActivity) { 
      listener = (Caller) activity; 
     } else { 
      throw new ClassCastException(activity.toString() + " must implemenet listener"); 
     } 
    } 

    @Override 
     public void onDetach() { 
     super.onDetach(); 
     listener = null; 
     } 
} 

टुकड़ा एक xml:

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


    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="This is Fragment A" /> 

    <Button 
     android:id="@+id/btnCallB" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/textView1" 
     android:text="Call Fragment B" /> 

</RelativeLayout> 

टुकड़ा बी जावा:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

public class FragmentB extends Fragment implements MainActivity.PassCallToB { 

    public FragmentB() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle inState) { 
     View rootView = inflater.inflate(R.layout.fragment_b, container, false); 
     return rootView; 
    } 

    @Override 
    public void passItOn() { 
     Toast.makeText(getActivity(), "Hello from B", Toast.LENGTH_SHORT).show(); 

    } 
} 

टुकड़ा बी xml:

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

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="This is Fragment B" /> 

</RelativeLayout> 
+0

पर वर्चुअल विधि 'java.lang.Object android.content.Context.getSystemService (java.lang.String)' का आह्वान करने का प्रयास यह घुमाए जाने पर यह काम नहीं करता है। क्योंकि जब आप गतिविधि को घुमाते हैं और टुकड़े फिर से बनाए जाते हैं जो आपके सेक्शन पेजर एडाप्टर को भी पुन: प्रयास करते हैं, लेकिन यह कभी भी इटिम (एंड्रॉइड को बिना इटिम कॉल किए बगैर टुकड़े को दोबारा शुरू करता है) का अर्थ है। PassOnToB शून्य रहता है। – rve

+0

मैंने अपना कोड संपादित किया ताकि यह स्क्रीन रोटेशन के बाद काम करेगा। चाल न केवल getItem() में कॉलबैक सेट करना है, लेकिन पेजर एडाप्टर में एक कस्टम विधि भी शामिल है जो टुकड़ों को गले में खोजेगी और सही खंड मिलने पर कॉलबैक मैन्युअल रूप से सेट करेगा। अब आपको केवल यह जांचना है कि क्या कॉलबैक सेट है और पासऑन विधि में नहीं है तो इसे सेट करें। मुझे उम्मीद है कि यह कुछ हद तक स्पष्ट है। – ckn

+0

मेरे साथ कोई विचार? http://stackoverflow.com/questions/39907625/why-is-accessing-textview-of-a-fragment-inside-activity-throwing-an-error – Si8

1

टुकड़ा

private static FragmentName instance; 

public static synchronized FragmentName getInstance() 
{ 
    return instance; 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
instance=this; 
.... 
} 

public void methodName() 
{...} 

गतिविधि

FragmentName.getInstance().methodName();