Вызов метода фрагмента из родительского действия

124

В руководстве по разработке фрагментов Android я вижу, что «действие может вызывать методы во фрагменте, получая ссылку на фрагмент из FragmentManager с помощью findFragmentById()или findFragmentByTag()».

В следующем примере показано, как получить ссылку на фрагмент, но не показано, как вызывать определенные методы во фрагменте.

Кто-нибудь может привести пример, как это сделать? Я хотел бы вызвать определенный метод во фрагменте из родительского Activity. Спасибо.

gcl1
источник

Ответы:

210

не уясните вопрос, поскольку он слишком прост:

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

Обновление: для тех, кто использует Kotlin

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()
Диреш Сингх
источник
10
Хорошо, это было легко, спасибо (я новичок в фрагментах). Теперь самое сложное в том, что я вообще не могу получить ссылку на фрагмент. Он не определен в макете XML, поэтому я не могу использовать findFragmentById (). И из кода, за которым я следую (см. Выше), мне не ясно, как / где вообще создается фрагмент. Если бы это было так, я мог бы просто добавить тег и использовать findFragmentByTag (). В части AccountListActivity в примере действительно есть вызов beginTransaction (). Add (), но по моей трассировке он никогда не вызывался. Вот где я чешу затылок. Я ценю любые предложения.
gcl1 05
34
как я могу получить идентификатор фрагмента?
Нарендра Сингх
9
Сделав это, я оказался в ссылке на нулевой объект!
Алок Раджасукумаран 05
3
@Fattie, что делать, если у меня нет тега фрагмента?
Vaclovas Rekašius Jr.
5
Я не объявил фрагмент в xml ... поэтому у меня нет идентификатора фрагмента, что мне делать?
akash bs
76

Если вы используете «import android.app.Fragment;» Затем используйте либо:

1)

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

Где R.id.example_fragment - это, скорее всего, идентификатор FrameLayout внутри вашего xml-макета. ИЛИ

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(); 
Ген
источник
2
У меня есть CoordinatorLayout с идентификатором R.id.example_fragment, возвращающий значение null. Я использую import android.support.v4.app.Fragment; что делать?
Кишор,
Я предлагаю вам опубликовать это как новый вопрос и включить свой образец кода. Трудно определить источник проблемы, не видя фактического кода.
Gene
9

Если вы используете библиотеку поддержки, вам нужно сделать что-то вроде этого:

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();
JDJ
источник
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
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_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();
            }
        });
    }
}
mXaln
источник
0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
eagerprince
источник