Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用回调接口从Mainactivity到Fragment进行通信?_Android_Android Layout_Android Fragments_Android Viewpager_Navigation Drawer - Fatal编程技术网

Android 如何使用回调接口从Mainactivity到Fragment进行通信?

Android 如何使用回调接口从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

我有四个菜单的导航抽屉,每个菜单都有自己的片段 ,在第一个片段内有两个片段的视图寻呼机滑动选项卡

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://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,请注意,我不想让碎片呼叫活动。我