Виклик методу фрагмента від батьківської діяльності


124

Я бачу в посібнику Dev Android Fragments Dev, що "діяльність може викликати методи у фрагменті, отримуючи посилання на фрагмент від FragmentManager, використовуючи findFragmentById()або findFragmentByTag()".

Наступний приклад показує, як отримати посилання на фрагмент, а не як викликати конкретні методи у фрагменті.

Хтось може навести приклад, як це зробити? Я б хотів назвати конкретний метод у Фрагменті з батьківської діяльності. Дякую.

Відповіді:


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 є виклик для початкуTransaction (). Add (), але за моїм слідом він ніколи не викликається. Тут я чухаю голову. Я вдячний за будь-які пропозиції.
gcl1

34
як я можу отримати ідентифікатор фрагмента?
Нарендра Сінгх

8
Роблячи це, я опинився в нульовому посиланні на об'єкт!
Алок Раджасукумаран

3
@Fattie, що робити, якщо у мене немає тега фрагмента?
Вацлова Рекашіус-молодший

5
Я не декларував фрагмент у xml ... тож у мене немає ідентифікатора фрагмента, що я буду робити ??
акаш бс

76

Якщо ви використовуєте "імпорт 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 - це ім'я u, вказане коли ви зробили:

TabHost mTabHost.newTabSpec(“FragTagName”)

Якщо ви використовуєте "імпорт 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
У мене є CoordinatorLayout з id R.id.example_fragment, його поверненням null. Я використовую імпорт 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
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();
            }
        });
    }
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.