【问题标题】:Name technique for passing data from fragment/activity to fragment/activity with interfaces使用接口将数据从片段/活动传递到片段/活动的命名技术
【发布时间】:2014-04-25 14:24:39
【问题描述】:

在学校,我们现在正在学习如何通过使用接口使片段更加通用。 这种技术仍然有点抽象,我真的不知道何时/如何使用它。

谁能给我一些关于如何使用该技术的资源(可以称为接口回调吗?)

非常感谢所有帮助!

【问题讨论】:

  • 观看这个精彩的视频,我相信你会明白的 - youtube.com/watch?v=VyyGP_d0Ia8
  • @Matt 这里的任何答案对您有用吗?如果是这样,如果可以将其中一个答案标记为正确,那就太好了

标签: android interface callback android-activity fragment


【解决方案1】:

您可以在 Eclipse 中简单地创建新的 Android 应用程序项目。 然后使用回调方法创建 Android 对象(片段)。这将使您对接口有所了解。

然后同样你可以申请activity去fragment。

【讨论】:

    【解决方案2】:

    回调方法,正如您所说的那样,就像在 Java 或 Android 的许多部分中发现的 Listener 接口一样简单。如果您想了解非常笼统的描述,您可以查看Observer pattern。但如果您已经了解如何使用 Listener,您将很容易理解回调

    注意:请勿将其与 Callback term 混合使用 - 它们不一样。

    假设我们有Activity MyActivityFragment MyFragment。我们想将一些数据从 Fragment 发布到 Activity。然后让我们在 MyFragment 中创建一个接口:

    public class MyFragment extends Fragment{
    
        private PostDataCallback mCallback;//our Activity will implement this
    
        @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 {
                 mCallback = (PostDataCallback) activity;
             } catch (ClassCastException e) {
                 throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
             }
         }
    
    
        public interface PostDataCallback{
            public void onPostData(Object data);
        }
    
       /*
        we trigger this method when we calculated
             data or something like that and want to post it*/
    
        public void onSomeEvent(Object data){
    
            mCallback.onPostData(data);
        }
    }
    

    我们的 MyActivity 将如下所示:

    public class MyActivity extends Activity implements MyFragment.PostDataCallback{
    
        private Object data;
    
        @Override
        protected void onCreate(Bundle savedInstanceState){
            getFragmentManager().beginTransaction().add(R.id.some_container_id, new MyFragment(), "my fragment");
    
    
        }
    
        @Override
        public void onPostData(Object data){
            this.data = data;
            //some operations
    
        }
    
    }    
    

    所以,MyFragment 对其回调的实现一无所知。但它知道,它可以在 PostDataCallback 的实例上调用方法 onPostData(Object o),该实例保存在变量 mCallback 中。

    因此,当 MyFragment 触发 mCallback.onPostData(data) 时,MyActivity 得到结果。

    如果我们想将消息从 MyActivity 发送到 MyFragment,则完全相同的方法会起作用,但反之亦然:触发方法,回调接口定义和实例将驻留在 MyActivity 中,MyFragment 将实现接口。

    【讨论】:

      【解决方案3】:

      以下是步骤:

      1. 从右侧的http://developer.android.com/training/basics/fragments/index.html(given 下载示例数据)并查看如何从 xml 添加片段或动态执行片段事务操作的 url。

      2. 然后建议您阅读片段指南..http://developer.android.com/guide/components/fragments.html

      3. 一旦你了解了完整的生命周期及其片段回调方法,那么谷歌给出的示例就很容易理解了。

      4. 在片段中定义接口以调用接口或将回调传递给活动..

      5. 假设您有两个片段,分别显示为文章标题和文章详细信息的列表。

      6. 在您的文章列表中扩展了片段列表公共类 Fragment1 扩展了 ListFragment
      7. 在 oncreateview 方法中使用列表适配器设置您的列表视图。

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
        android.R.layout.simple_list_item_1, Array);
        setListAdapter(adapter);
        
      8. 现在我们需要在用户点击文章时显示文章详情,所以我们需要将位置传递给活动,以便它可以回调相应的文章详情以显示在fragment2中。
      9. 所以当用户点击文章时,系统会调用 onListItemClick 回调方法。

        public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        

        这里调用接口,传递文章位置

      10. 定义接口并在方法中传递位置,活动将覆盖。

        public interface OnArticleSelectedListener {
        public void onArticleSelected(int position);
        }
        
      11. 在 on attach 方法中通过强制转换 Activity 实例化接口实例,如果 Activity 没有实现接口,则 Fragment 会抛出 ClassCastException。关于成功。

      12. 通过将位置作为捆绑数据传递给 Fragment2 来覆盖显示文章详细信息的接口方法。

      希望它能帮助您理解示例代码。

      【讨论】:

        猜你喜欢
        • 2016-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多