Bir üst Activity'den Fragment yöntemini çağırma


124

Android Fragments Geliştirici Kılavuzunda bir "etkinlik, findFragmentById()veya kullanarak FragmentManager'dan Fragment'e bir referans alarak bir parçadaki yöntemleri çağırabilir" görüyorum findFragmentByTag().

Aşağıdaki örnek, bir parça başvurusunun nasıl alınacağını gösterir, ancak parçadaki belirli yöntemlerin nasıl çağrılacağını göstermez.

Bunun nasıl yapılacağına dair bir örnek verebilir misiniz? Ana Aktiviteden bir Parça içinde belirli bir yöntemi çağırmak istiyorum. Teşekkürler.

Yanıtlar:


210

soruyu tam olarak çok basit olduğu için anlamamak:

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

Güncelleme: Kotlin kullananlar için

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

10
Tamam, bu kolaydı, teşekkürler (Parçalarda yeniyim). Şimdi işin zor kısmı, ilk etapta parçaya bir gönderme yapamıyorum. XML düzeninde tanımlı değil, bu yüzden findFragmentById () kullanamıyorum. Ve takip ettiğim koddan (yukarıdaki ref) parçanın nasıl / nerede oluşturulduğu bile bana açık değil. Öyle olsaydı, sadece bir etiket ekleyebilir ve findFragmentByTag () kullanabilirdim. Örneğin AccountListActivity bölümünde beginTransaction () için bir çağrı var. Add (), ancak izim başına asla çağrılmıyor. Burası başımı kaşıdığım yer. Herhangi bir öneriyi takdir ediyorum.
gcl1

34
parça kimliğini nasıl alabilirim?
Narendra Singh

9
Bunu yaparak boş bir nesne referansına ulaştım!
Alok Rajasukumaran

3
@Fattie, ya parça etiketim yoksa?
Vaclovas Rekašius Jr.

5
Xml'de parça bildirmedim ... bu yüzden parça kimliğim yok, ne yapacağım?
akash bs

76

"Android.app.Fragment'ı içe aktar" kullanıyorsanız; Ardından şunlardan birini kullanın:

1)

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

R.id.example_fragment, xml düzeninizin içindeki FrameLayout kimliğidir. VEYA

2)

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

FragTagName, yaptığınız zaman belirttiğiniz addır:

TabHost mTabHost.newTabSpec(“FragTagName”)

“Android.support.v4.app.Fragment'ı içe aktar” kullanıyorsanız Ardından şunlardan birini kullanın:

1)

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

VEYA

2)

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

2
R.id.example_fragment kimliğine sahip bir CoordinatorLayout'um var, null döndürüyor. İmport android.support.v4.app.Fragment kullanıyorum; ne yapalım?
Kishore

Bunu yeni bir soru olarak göndermenizi ve örnek kodunuzu eklemenizi öneririm. Gerçek kodu görmeden sorunun kaynağını söylemek zor.
Gene

9

Bir destek kitaplığı kullanıyorsanız, bunun gibi bir şey yapmak isteyeceksiniz:

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

4
  1. Bir destek kitaplığı Parçası kullanmıyorsanız, aşağıdakileri yapın:

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


2. Bir destek kitaplığı Parçası kullanıyorsanız, aşağıdakileri yapın:

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


3

Bence en iyisi, yöntemi parçada çağırmadan önce parçanın eklenip eklenmediğini kontrol etmektir. Boş istisnadan kaçınmak için böyle bir şey yapın.

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

2

Parçadan aktiviteye:

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

Aktiviteden parçalara:

FragmentManager fm = getSupportFragmentManager ();

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

Parça eklediyseniz ve parçanızı eklerken bir etiket dizesi kullandıysanız bunun yerine findFragmentByTag'i kullanın:

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

1

Önce beğeninize göre yöntem fragmentyaratırsınız

public void name()
{


}

Gözlerinde farklı activitybunu eklemek

onCreate()yöntem ekle

myfragment fragment=new myfragment()

son olarak çağırmak istediğiniz yöntemi çağırın bunu ekleyin

fragment.method_name();

bu kodu dene


1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 

1

Bilmiyorum Java, ancak C#(Xamarin.Android) 'de, yöntemi her çağırmanız gerektiğinde parçayı aramanıza gerek yok, aşağıya bakın:

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()
    {
        // ...
    }   
}

Bence Javasen de aynısını yapabilirsin.


1

Ayrıca, şu arabirimi kullanarak parça yöntemini çağırırsınız:

ilk önce arayüz yaratırsın

public interface InterfaceName {
    void methodName();
}

arayüz oluşturduktan sonra, parçanıza arayüz uygularsınız

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

    }
}

ve aktivitenizde arayüz referansını oluşturursunuz

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.