5

मेरे पास एक मुख्य गतिविधि (FragmentActivity) है जिसमें एक FragmentTabHost है।FragmentTabHost & Fragments - मैं टैब के बीच डेटा कैसे पास करूं?

public class FragmentTabs extends FragmentActivity { 
    private FragmentTabHost mTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fragment_tabs); 
     mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

     mTabHost.addTab(mTabHost.newTabSpec("classA").setIndicator("Class A"), 
      ClassA.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("classB").setIndicator("Class B"), 
      ClassB.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("classC").setIndicator("Class C"), 
      ClassC.class, null); 
    } 
} 

ClassA, ClassB और ClassC सभी टुकड़े (android.support.v4.app.Fragment) कर रहे हैं।

मुझे टुकड़ों पर डेटा (और कॉल विधियों) को पास करने की आवश्यकता है। मैं टुकड़े में से प्रत्येक के लिए एक संदर्भ कैसे प्राप्त कर सकते हैं, इस तरह:।

ClassA mClassAFragment = ???; 

मैं getSupportFragmentManager का उपयोग कर की कोशिश की है() (findFragmentByTag) और मैं भी mTabHost की क्षमताओं की खोज की कोशिश की है। उन्हें कुछ भी नहीं मिल सकता है।

क्या आप ऐसा करने का कोई सुझाव सुझा सकते हैं या वैकल्पिक दृष्टिकोण सुझा सकते हैं?

उत्तर

11

ओपी यहां। इस समस्या को हल करने के लिए मैं अपने FragmentActivity में onAttachFragment विधि अतिभारित है

public class FragmentTabs extends FragmentActivity { 
    private FragmentTabHost mTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
    } 

    @Override 
    public void onAttachFragment(Fragment fragment) { 
    super.onAttachFragment(fragment); 

    if (fragment.getClass() == ClassA.class) { 
     ClassA mClassAFragment = (ClassA)fragment 
      ... 
     } 
    } 
} 
+0

बहुत बढ़िया सलाह। मुझे लगता है कि ऐसा करने के लिए यह एक बहुत अच्छा तरीका है। – Siggy

+1

मुझे लगता है कि आपको प्रत्यक्ष '==' तुलनित्र की बजाय खंड वर्गों के लिए '.equals() 'तुलना करना चाहिए। – alexgophermix

+2

या इरादा बेहतर होगा: 'कक्षा का खंड उदाहरण' – kgautron

3

आप इस तरह अपने टुकड़ा प्राप्त कर सकते हैं:

YourFragment frag = (YourFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.fragmentid)); 

एक टुकड़ा आप इस दृष्टिकोण का पालन कर सकते करने के लिए डेटा भेजने के लिए, एक नया लेनदेन बनाने और एक बंडल के माध्यम से डेटा भेजने।

Bundle arguments = new Bundle(); 
arguments.putString("some id string", "your data"); 
YourFragment fragment = new YourFragment(); 
fragment.setArguments(arguments); 
getSupportFragmentManager().beginTransaction().add(R.id.fragmentid, fragment).commit(); 
+8

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

1

यह android.support.v4.app.FragmentTabHost.addTab (TabSpec, क्लास, बंडल आर्ग के 3 तर्क के द्वारा पूरा किया जा सकता है), तो आर्ग android.support.v4.app.Fragment.getArguments()

public class Tab1Fragment extends BaseFragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // do something with the arguments 
    Log.i("DEBUG", "" + getArguments()); 
    // ... 
} 

}

के माध्यम से प्राप्त किया जा सकता है 210
+0

दुर्भाग्य से नहीं कहा जाता है। यह स्पष्ट रूप से मूल मंशा था लेकिन 'getArguments()' हमेशा वहां शून्य लौटाता है। एक शर्म की बात है, वास्तव में ... –