Android 如何使用回调接口从Mainactivity到Fragment进行通信?
我有四个菜单的导航抽屉,每个菜单都有自己的片段 ,在第一个片段内有两个片段的视图寻呼机滑动选项卡 Activity_main.xmlAndroid 如何使用回调接口从Mainactivity到Fragment进行通信?,android,android-layout,android-fragments,android-viewpager,navigation-drawer,Android,Android Layout,Android Fragments,Android Viewpager,Navigation Drawer,我有四个菜单的导航抽屉,每个菜单都有自己的片段 ,在第一个片段内有两个片段的视图寻呼机滑动选项卡 Activity_main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://sc
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.CoordinatorLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorColor="@color/white"
app:tabIndicatorHeight="4dp" />
</android.support.design.widget.AppBarLayout>
////////////// Here I'm replacing each fragments ////////////////
<FrameLayout
android:id="@+id/main_content_framelayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/fab_margin"
android:src="@drawable/ic_done"
android:visibility="gone"/>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header"
app:menu="@menu/drawer_view"/>
</android.support.v4.widget.DrawerLayout>
HomeTabFragment
public class Home_Tab_Fragment extends Fragment {
private FragmentActivity myContext;
ViewPager viewPager;
TabLayout tabLayout;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.layout_viewpager, container, false);
viewPager = (ViewPager) rootView.findViewById(R.id.view_pager);
return rootView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SlidingTabAdapter adapter = new SlidingTabAdapter(getChildFragmentManager());
adapter.addFragment(new FirstTabFragment(), "First TAB");
adapter.addFragment(new SecondTabFragment(), "Second Tab");
viewPager.setAdapter(adapter);
tabLayout = (TabLayout) getActivity().findViewById(R.id.tabs);
tabLayout.setVisibility(View.VISIBLE);
tabLayout.setupWithViewPager(viewPager);
}
}
滑动适配器
public class SlidingTabAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
public SlidingTabAdapter(FragmentManager fm) {
super(fm);
}
public void addFragment(Fragment fragment, String title) {
mFragments.add(fragment);
mFragmentTitles.add(title);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
}
}
在MainActivity内部,我想调用FirstTabFragment方法[updateFirstFragmentValues()]
我尝试在FirstTabFragment中添加标记
public static final String TAG ="FirstTabFragment.TAG";
然后我在MainActivity中调用,如下所示,但片段总是空的
public void invokeMethodFromFirstTabFragment() {
FragmentManager fm = this.getSupportFragmentManager();
FirstTabFragment fb=(FirstTabFragment)fm.findFragmentByTag(FirstTabFragment.TAG);
if (null != fb) {
fb.updateFirstFragmentValues();
}else{
L.m("Fragment is null===========");
}
}
敬请告知,如何从“MainActivity”内部调用“FirstTabFragment”方法
请注意,FirstTabFragment未直接添加到MainActivity,
它是通过“Home\u Tab\u Fragment”添加的
首先,创建接口:
public interface CallBackListener{
void onCallBack();
}
public MyActivity extends AppCompatActivity implements CallBackListener{
@Override
public void onCallBack(){
// Do somethings here...
}
}
零碎
public MyFragment extends Fragment{
private CallBackListener mCallBack;
@Override
public void onAttach(Context context) {
AppCompatActivity activity;
if (context instanceof AppCompatActivity) {
activity = (AppCompatActivity) context;
try {
mCallBack= (CallBackListener ) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " class must be implement" +
" OnBackFragmentListener");
}
}
super.onAttach(context);
}
}
使用:
在活动中,您必须实现接口:
public interface CallBackListener{
void onCallBack();
}
public MyActivity extends AppCompatActivity implements CallBackListener{
@Override
public void onCallBack(){
// Do somethings here...
}
}
首先,创建接口:
public interface CallBackListener{
void onCallBack();
}
public MyActivity extends AppCompatActivity implements CallBackListener{
@Override
public void onCallBack(){
// Do somethings here...
}
}
零碎
public MyFragment extends Fragment{
private CallBackListener mCallBack;
@Override
public void onAttach(Context context) {
AppCompatActivity activity;
if (context instanceof AppCompatActivity) {
activity = (AppCompatActivity) context;
try {
mCallBack= (CallBackListener ) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " class must be implement" +
" OnBackFragmentListener");
}
}
super.onAttach(context);
}
}
使用:
在活动中,您必须实现接口:
public interface CallBackListener{
void onCallBack();
}
public MyActivity extends AppCompatActivity implements CallBackListener{
@Override
public void onCallBack(){
// Do somethings here...
}
}
编辑:
您不能从MainActivity直接访问FirstTabFragment
方法。首先,您必须从活动中调用Home\u Tab\u Fragment
方法。然后从该方法可以调用FirstTabFragment
方法
以下是策略:
步骤1:Home\u Tab\u Fragment
到FirstTabFragment
通信
定义这样的接口
public interface IHomeToFirstFragmentController{
void firstFragmentMethod();
}
public interface IActivityToHomeTabController{
void callFirstFragment();
}
现在在FirstTabFragment
中实现IHomeToFirstFragmentController
。然后必须实现firstFragmentMethod()
用这种方法从Home\u Tab\u Fragment
调用此firstFragmentMethod
方法
YOUR_fragmentInstance.firstFragmentMethod();
第2步:活动至主页选项卡\u片段
:
定义这样的接口
public interface IHomeToFirstFragmentController{
void firstFragmentMethod();
}
public interface IActivityToHomeTabController{
void callFirstFragment();
}
现在,在您的Home\u选项卡\u片段中实现iffragmentcontroller
。然后必须实现callFirstFragment()
编辑2:
用这种方法调用片段
((IFragmentController)YOUR_fragmentInstance).firstFragmentMethod();
希望这将给你一个关于这个主题的想法。有关更多信息,请访问编辑:
您不能从MainActivity直接访问FirstTabFragment
方法。首先,您必须从活动中调用Home\u Tab\u Fragment
方法。然后从该方法可以调用FirstTabFragment
方法
以下是策略:
步骤1:Home\u Tab\u Fragment
到FirstTabFragment
通信
定义这样的接口
public interface IHomeToFirstFragmentController{
void firstFragmentMethod();
}
public interface IActivityToHomeTabController{
void callFirstFragment();
}
现在在FirstTabFragment
中实现IHomeToFirstFragmentController
。然后必须实现firstFragmentMethod()
用这种方法从Home\u Tab\u Fragment
调用此firstFragmentMethod
方法
YOUR_fragmentInstance.firstFragmentMethod();
第2步:活动至主页选项卡\u片段
:
定义这样的接口
public interface IHomeToFirstFragmentController{
void firstFragmentMethod();
}
public interface IActivityToHomeTabController{
void callFirstFragment();
}
现在,在您的Home\u选项卡\u片段中实现iffragmentcontroller
。然后必须实现callFirstFragment()
编辑2:
用这种方法调用片段
((IFragmentController)YOUR_fragmentInstance).firstFragmentMethod();
希望这将给你一个关于这个主题的想法。有关更多信息,请访问好的,阅读您的所有回复,我知道您只需在创建片段时将数据传递给片段,并能够执行片段的一些方法。好的,很简单:
IMessageFragment接口
消息片段
东西非常简单,界面的存在只是为了良好的代码风格和支持设计模式。好的,阅读您的所有响应,我知道您只需要在创建时将数据传递给片段,并能够执行片段的一些方法。好的,很简单:
IMessageFragment接口
消息片段
东西很简单,接口的存在只是为了良好的代码风格和支持设计模式。你考虑过使用回调这样的方法吗?@Georgy Savatkov:我使用回调接口来实现片段到活动的通信,但在这种情况下,我想在活动之间进行通信。如果FirstTabFragment没有直接添加到MainActivity中,您可以为此提供示例代码吗。您不能对此类需求使用接口回调@Janki gadhiya,敬请告知从MainActivity调用片段公共方法的任何可能方式。我的真实场景是,一旦从服务器加载数据,我想刷新fragment recyclerview适配器数据。我认为您的布局设计有点混乱。回答我,我会尝试给出解决方案。您是否考虑过使用回调之类的方法来实现这一点?@Georgy Savatkov:我使用回调接口将片段与活动进行通信,但在这个例子中,我想从一个活动到另一个片段进行交流。如果FirstTabFragment没有直接添加到MainActivity中,您可以为此提供示例代码吗。您不能对此类需求使用接口回调@Janki gadhiya,敬请告知从MainActivity调用片段公共方法的任何可能方式。我的实际情况是,一旦从服务器加载数据,我想刷新fragment recyclerview适配器数据。我认为您的布局设计有点混乱。请回答我,我会尽力给出答案solution@lrish路易斯,请注意,我不想从片段呼叫活动。我想从活动调用到片段,如何在Activity Classis中附加接口我很抱歉。我想如果你想将数据从一个活动传递到另一个片段,你可以使用fragment、broadcast receiver、handler-message的参数…你不能使用接口从一个活动回调到另一个片段(个人观点)@lrish Louis,我无法在MainActivity中获取片段实例,因为fragment与MainActivity没有直接连接,它附加在ViewPager主机片段中,该主机片段在MainActivity中调用。有什么办法解决这个案子吗?@lrish-Louis,请注意,我不想让碎片呼叫活动。我