【问题标题】:Calling a Fragment method from a parent Activity从父 Activity 调用 Fragment 方法
【发布时间】:2012-06-05 18:47:52
【问题描述】:

我在Android Fragments Dev Guide 中看到“活动可以通过使用findFragmentById()findFragmentByTag() 从FragmentManager 获取对Fragment 的引用来调用片段中的方法。”

下面的例子展示了如何获取片段引用,而不是如何调用片段中的特定方法。

谁能举例说明如何做到这一点?我想从父 Activity 调用 Fragment 中的特定方法。谢谢。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    问题太简单了,不能完全理解:

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

    【讨论】:

    • 好的,这很容易,谢谢(我对 Fragment 很陌生)。现在最困难的部分是我似乎无法首先获得对片段的引用。它没有在 XML 布局中定义,所以我不能使用 findFragmentById()。从我遵循的代码(上面的参考)中我不清楚片段是如何/在哪里创建的。如果是,我可以添加一个标签并使用 findFragmentByTag()。该示例的 AccountListActivity 部分确实调用了 beginTransaction().add(),但根据我的跟踪,它从未被调用过。这是我挠头的地方。我感谢任何建议。
    • 如何获取片段ID?
    • 通过这样做,我最终得到了一个空对象引用!
    • @Fattie,如果我没有片段标签怎么办?
    • 我没有在 xml 中声明片段...所以我没有片段 ID,我该怎么办??
    【解决方案2】:

    如果你使用“import android.app.Fragment;” 然后使用:

    1)

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

    其中 R.id.example_fragment 很可能是您的 xml 布局中的 FrameLayout id。 或

    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(); 
    

    【讨论】:

    • 我有一个 ID 为 R.id.example_fragment 的 CoordinatorLayout,它返回 null。我正在使用 import android.support.v4.app.Fragment;怎么办?
    • 我建议您将此作为一个新问题发布并包含您的示例代码。不看实际代码很难判断问题的根源。
    【解决方案3】:

    如果您使用的是支持库,则需要执行以下操作:

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

    【讨论】:

      【解决方案4】:
      1. 如果您没有使用支持库 Fragment,请执行以下操作:

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


      2. 如果您使用的是支持库 Fragment,请执行以下操作:

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

      【讨论】:

        【解决方案5】:

        从片段到活动:

        ((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();
        

        如果您通过代码添加片段并在添加片段时使用了 tag 字符串,请改用 findFragmentByTag

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

        【讨论】:

          【解决方案6】:

          我认为最好是在调用片段中的方法之前检查是否添加了片段。做这样的事情来避免空异常。

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

          【讨论】:

            【解决方案7】:

            你也可以使用类似的接口调用片段方法

            首先你创建接口

            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();
                        }
                    });
                }
            }
            

            【讨论】:

              【解决方案8】:

              这个问题为时已晚,但这是获取片段实例并调用片段中的方法的简单方法;您必须获取片段的实例,然后调用您的公共方法:

              在您的片段中:

               private static yourFragment instance;
              

              然后在您的片段的onCreateView 中:

                @Override
                  public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                 Bundle savedInstanceState) {
              
                      instance= this;
              
                      View v = inflater.inflate(R.layout.fragment_tools, container, false);
                      binding = FragmentToolsBinding.inflate(inflater, container, false);
              
                      return v;
                  }
              

              而且在你的片段中,你必须有一个返回实例的静态方法:

              public static yourFragment GetInstance()
              {
                  return instance;
              }
              

              那么你的片段中有一个公共方法,你想像这样调用它:

              public  void  theMethod()
              {
                  Toast.makeText(getActivity(), "Test", Toast.LENGTH_SHORT).show();
              }
              

              然后您可以获取片段实例并像这样调用您的非静态公共方法:

                 yourFragment frag = yourFragment.GetInstance();
                 frag.theMethod();
                  
              

              【讨论】:

                【解决方案9】:

                首先你在fragment 中创建方法

                public void name()
                {
                
                
                }
                

                在你的activity你添加这个

                添加onCreate()方法

                myfragment fragment=new myfragment()
                

                最后调用你要调用的方法添加这个

                fragment.method_name();
                

                试试这个代码

                【讨论】:

                  【解决方案10】:
                  FragmentManager fm = getFragmentManager(); 
                  MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
                  frag.<specific_function_name>(); 
                  

                  【讨论】:

                    【解决方案11】:

                    我不知道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 你也可以这样做。

                    【讨论】:

                      【解决方案12】:
                      ((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
                      

                      【讨论】:

                      • 请随意解释为什么这比以前接受的答案更能解决问题。
                      【解决方案13】:

                      这个问题为时已晚,但无论如何我都会为仍然需要它的人发布我的答案。 我找到了一种更简单的方法来实现这一点,而无需使用片段 ID 或片段标记,因为这正是我所寻求的。

                      首先,我在 ParentActivity 类中声明了我的 Fragment:

                      MyFragment myFragment;
                      

                      像往常一样初始化我的 viewPager,我已经在上面的类中添加了片段。 然后,在 myFragment 中创建了一个名为 scrollToTop 的公共方法,该方法执行我想要从 ParentActivity 执行的操作,假设将我的 recyclerview 滚动到顶部。

                      public void scrollToTop(){
                          mMainRecyclerView.smoothScrollToPosition(0);
                      }
                      

                      现在,我在 ParentActivity 中调用了如下方法:

                      try{
                         myFragment.scrollToTop();
                      }catch (Exception e){
                         e.printStackTrace();
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2012-08-17
                        • 1970-01-01
                        • 2021-03-13
                        • 1970-01-01
                        • 2016-11-27
                        相关资源
                        最近更新 更多