命名技术,用于通过接口将数据从片段/活动传递到片段/活动

时间:2014-03-19 11:21:00

标签: android interface callback android-activity fragment

在学校,我们现在正在学习如何通过使用界面使片段更具通用性。 这种技术仍然有点抽象,我不知道何时/如何使用它。

有人能指出一些关于如何使用该技术的资源(它可以被称为接口回调吗?)

非常感谢所有帮助!

3 个答案:

答案 0 :(得分:4)

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

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

假设我们有Activity MyActivity Fragment 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 将实现该接口。

答案 1 :(得分:3)

以下是步骤:

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

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

  3. 一旦你理解了完整的生命周期及其片段回调方法,那么Google就会很容易理解这个例子。

  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 on attach方法通过强制转换Activity来实例化接口实例,如果活动没有实现接口,则片段抛出ClassCastException。成功。

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

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

答案 2 :(得分:0)

您可以在eclipse中简单地创建新的Android应用程序项目。 然后使用回调方法创建Android对象(Fragment)。这将为您提供接口的概念。

然后同样可以申请片段活动。