如何从活动调用片段方法

问题描述:

我正在填充tablayout中的片段。我在我的片段中有一个方法,我想从一个活动中调用它。但是,当我试图通过这样做Fragment myFragment = (Fragment) getSupportFragmentManager().findFragmentById(R.id.my_fragment)myFragment为null的参考片段。我是Android新手。 (对不起英文不好)如何从活动调用片段方法

我的代码到目前为止。

public class DashboardActivity extends AppCompatActivity { 

    private ViewPager pager; 
    private TabLayout tabLayout; 
    private Toolbar dashboardToolbar; 

    public static int position; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_dashboard_activity); 

     HomeFragment myFragment = new HomeFragment(); 
     if(getSupportFragmentManager().findFragmentById(R.id.homeFragment) == null) { 
         getSupportFragmentManager().beginTransaction() 
        .add(R.id.homeFragment, myFragment).commit(); 

     } 


     pager = (ViewPager) findViewById(R.id.view_pager); 
     setupViewPager(pager); 

     tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
     tabLayout.setupWithViewPager(pager); 

     pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 

     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       // Toast.makeText(DashboardActivity.this, "tabSelected: " + tab.getText()+" "+ tab.getPosition(), Toast.LENGTH_SHORT).show(); 
       // no where in the code it is defined what will happen when tab is tapped/selected by the user 
       // this is why the following line is necessary 
       // we need to manually set the correct fragment when a tab is selected/tapped 
       // and this is the problem in your code 
       pager.setCurrentItem(tab.getPosition()); 
       position = tab.getPosition(); 

      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 
       // Toast.makeText(DashboardActivity.this, "tabReSelected: " + tab.getText(), Toast.LENGTH_SHORT).show(); 

       position = tab.getPosition(); 

       // Reload your recyclerView here 
      } 
     }); 


    } 

    private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     adapter.addFragment(new HomeFragment(), "FOR YOU"); 
     adapter.addFragment(new NotificationFragment(), "NOTIF"); 
     adapter.addFragment(new ChatFragment(), "CHAT"); 
     adapter.addFragment(new ProfileFragment(), "PROFILE"); 
     viewPager.setAdapter(adapter); 
    } 

} 

片段

public class HomeFragment extends Fragment { 
     // Objects Declaration 


     public HomeFragment() { 
      // Required empty public constructor 
     } 


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.homeFragment, container, false); 
     } 

public void myMethod(){ //method to be called 
//do something 
} 
    } 

活动

public class MyActivity extends AppCompatActivity { 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_activity_filter); 


       HomeFragment myFragment= (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.homeFragment); 

        if(myFragment!= null) { 
         Toast.makeText(ActivityFilter.this, "Not null.", Toast.LENGTH_SHORT).show(); 
home.myMethod(); // this line is not accessed since myFragment is null 

        }else{ 
         Toast.makeText(ActivityFilter.this, "Null fragment.", Toast.LENGTH_SHORT).show(); 
        } 

    } 

} 
+0

也考虑使用'EventBus' – WenChao

+0

你能解释一些关于MyActivity的信息吗?它什么时候被触发? –

+0

发布viewpageradapter代码 –

您应该使用一个回调。

在你的片段中创建一个公共接口。

public interface iCommunicateListener{ 
    void communicate(String msg); 
} 

您还必须使活动成为听众。 (你可以有很多的听众,但片段应该是可重复使用的,所以如果你有很多听众也不会因为它可以和应该是可重复使用)

private iCommunicateListener listener; 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    // This makes sure that the container activity has implemented 
    // the callback interface. If not, it throws an exception 
    try { 
     listener = (iCommunicateListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement iCommunicateListener"); 
    } 
} 

现在你有积极的倾听者。 在您的onClicks中或者当您想要将信息发送到您的活动时,您必须致电listener.communicate("doSomething");

您的活动必须实施iCommunicateListener。

实施方法沟通后,您可以选择不同字符串的逻辑或想要通过回调发送的任何内容。 Activities和Fragments之间还有很多其他的沟通方式,但是因为你只是在开始学习这个。在你实现它之后,你会看到结果,你可以看看这个库,它肯定会帮助你在android开发中。 EventBus

使用EventBus,您不必使用回调,这将使您的片段更加可重用和灵活,但首先要学习正常的回调。这是一个基本模式,你会在很多不同的情况下使用它。 更多关于碎片:Fragments 希望这会有所帮助!