पैरेंट एक्टिविटी से फ्रैगमेंट मेथड को कॉल करना


124

मैं एंड्रॉइड फ्रैगमेंट्स देव गाइड में देखता हूं कि "फ्रैगमेंट मैनजर के फ्रैगमेंट के संदर्भ का उपयोग करके findFragmentById()या findFragmentByTag()" का उपयोग करके " एक अंश में गतिविधि कॉल कर सकती है ।"

इसके बाद का उदाहरण दिखाता है कि कैसे एक टुकड़ा संदर्भ प्राप्त करना है, लेकिन टुकड़े में विशिष्ट तरीकों को कैसे कॉल करना है।

क्या कोई ऐसा करने का उदाहरण दे सकता है? मैं पैरेंट एक्टिविटी के फ्रैगमेंट में एक विशिष्ट विधि को कॉल करना चाहूंगा। धन्यवाद।

जवाबों:


210

प्रश्न बिल्कुल ठीक नहीं है क्योंकि यह बहुत सरल है:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.<specific_function_name>(); 

अद्यतन: जो कोटलिन का उपयोग कर रहे हैं

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()

10
ठीक है कि आसान था, धन्यवाद (मैं टुकड़े करने के लिए नया हूँ)। अब मुश्किल हिस्सा यह है कि मुझे पहली बार में टुकड़े का संदर्भ नहीं मिल रहा है। यह XML लेआउट में परिभाषित नहीं है, इसलिए मैं findFragmentById () का उपयोग नहीं कर सकता। और यह मेरे लिए स्पष्ट नहीं है कि मैं जिस कोड का अनुसरण कर रहा हूं (ऊपर देखें) कैसे / जहां टुकड़ा भी बनाया गया है। अगर ऐसा होता तो मैं सिर्फ एक टैग जोड़ सकता था और findFragmentByTag () का उपयोग कर सकता था। उदाहरण के AccountListActivity वाले हिस्से में startTransaction () add। यहीं मैं अपना सिर खुजला रहा हूं। मैं किसी भी सुझाव की सराहना करता हूं।
gcl1

34
मैं खंडित आईडी कैसे प्राप्त कर सकता हूं?
नरेंद्र सिंह

8
ऐसा करने से मैं एक अशक्त वस्तु संदर्भ में समाप्त हो गया!
आलोक राजसुकुमारन

3
@ फैटी, क्या होगा अगर मेरे पास टुकड़ा टैग नहीं है?
वेकलोव्स रेकासियस जूनियर

5
मैंने xml में टुकड़े की घोषणा नहीं की ... इसलिए मेरे पास खंड आईडी नहीं है, मैं क्या करूँगा ??
akash bs

76

यदि आप "android.app आयात कर रहे हैं।" तो या तो उपयोग करें:

1)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

जहां R.id.example_fragment सबसे अधिक संभावना है कि आपके Xml लेआउट के अंदर FrameLayout आईडी है। या

2)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

जहां FragTagName यू नाम दिया गया है

TabHost mTabHost.newTabSpec(“FragTagName”)

अगर आप "import android.support.v4.app.Fragment;" का उपयोग कर रहे हैं तो या तो उपयोग करें:

1)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

या

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

1
मेरे पास आईडी R.id.example_fragment के साथ एक CoordinatorLayout है, इसकी वापसी शून्य है। मैं आयात कर रहा हूं android.support.v4.app.Fragment; क्या करें?
किशोर

मेरा सुझाव है कि आप इसे एक नए प्रश्न के रूप में पोस्ट करें और अपना नमूना कोड शामिल करें। वास्तविक कोड देखे बिना समस्या का स्रोत बताना कठिन है।
जीन

9

यदि आप एक समर्थन पुस्तकालय का उपयोग कर रहे हैं, तो आप ऐसा कुछ करना चाहेंगे:

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();

4
  1. यदि आप समर्थन लाइब्रेरी फ़्रैगमेंट का उपयोग नहीं कर रहे हैं, तो निम्न कार्य करें:

((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


2. यदि आप एक समर्थन लाइब्रेरी फ़्रैगमेंट का उपयोग कर रहे हैं, तो निम्न कार्य करें:

((FragmentName) getSupportFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


3

मुझे लगता है कि सबसे अच्छा यह जांचने के लिए है कि टुकड़े को विधि में कॉल करने से पहले जोड़ा जाता है या नहीं। अशक्त अपवाद से बचने के लिए ऐसा कुछ करें।

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
if(fragment.isAdded()){
  fragment.<specific_function_name>(); 
}

2

अंश से लेकर सक्रियता:

((YourActivityClassName)getActivity()).yourPublicMethod();

गतिविधि से लेकर टुकड़े तक:

FragmentManager fm = getSupportFragmentManager ();

//if you added fragment via layout xml
YourFragmentClass fragment = 
(YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();

यदि आपने कोड के माध्यम से टुकड़ा जोड़ा और जब आपने अपना टुकड़ा जोड़ा, तो टैग स्ट्रिंग का उपयोग किया, इसके बजाय findFragmentByTag का उपयोग करें :

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");

1

पहले आप अपनी fragmentतरह से विधि बनाएं

public void name()
{


}

अपने में activity आप में यह जोड़ें

onCreate()विधि जोड़ें

myfragment fragment=new myfragment()

अंत में उस विधि को कॉल करें जहां आप इसे जोड़ना चाहते हैं

fragment.method_name();

इस कोड को आज़माएं



1

मुझे इसके बारे में पता नहीं है Java, लेकिन C#(Xamarin.Android) में हर उस टुकड़े को देखने की जरूरत नहीं है जिसे आपको विधि को कॉल करने की आवश्यकता है, नीचे देखें:

public class BrandActivity : Activity
{
    MyFragment myFragment;

    protected override void OnCreate(Bundle bundle)
    {       
        // ...
        myFragment = new MyFragment();      
        // ...
    }

    void someMethod()
    {
        myFragment.MyPublicMethod();
    }
}

public class MyFragment : Android.Support.V4.App.Fragment
{
    public override void OnCreate(Bundle bundle)
    {
        // ...
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
    {
        // ...
    }

    public void MyPublicMethod()
    {
        // ...
    }   
}

मुझे लगता है कि Javaआप भी ऐसा कर सकते हैं।


1

आप भी इंटरफेस की तरह टुकड़ा विधि कहते हैं

पहले आप इंटरफ़ेस बनाएँ

public interface InterfaceName {
    void methodName();
}

इंटरफ़ेस बनाने के बाद आप अपने टुकड़े में इंटरफ़ेस लागू करते हैं

MyFragment extends Fragment implements InterfaceName {
    @overide
    void methodName() {

    }
}

और आप अपनी गतिविधि में इंटरफ़ेस का संदर्भ बनाते हैं

class Activityname extends AppCompatActivity {
    Button click;
    MyFragment fragment;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);

        click = findViewById(R.id.button);

        fragment = new MyFragment();

        click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               fragment.methodName();
            }
        });
    }
}

0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.