Android官方入门文档[18]与其他碎片通信

简介: Android官方入门文档[18]与其他碎片通信Communicating with Other Fragments与其他碎片通信 This lesson teaches you to1.

Android官方入门文档[18]与其他碎片通信

Communicating with Other Fragments
与其他碎片通信

 

This lesson teaches you to
1.Define an Interface
2.Implement the Interface
3.Deliver a Message to a Fragment

You should also read
•Fragments

这节课教你
1.定义一个接口
2.实现接口
3.传递一个消息给一个代码片段

你也应该阅读
•片段


Try it out
试试吧

Download the sample
FragmentBasics.zip
下载样本
FragmentBasics.zip

In order to reuse the Fragment UI components, you should build each as a completely self-contained, modular component that defines its own layout and behavior. Once you have defined these reusable Fragments, you can associate them with an Activity and connect them with the application logic to realize the overall composite UI.
为了重用代码片段UI组件,你应该建立各自的定义自己的布局和行为完全独立的,模块化的组件。一旦你定义了这些可重复使用的片段,您可以用他们的活动联系起来,并与应用逻辑连接起来,实现整体复合UI。

Often you will want one Fragment to communicate with another, for example to change the content based on a user event. All Fragment-to-Fragment communication is done through the associated Activity. Two Fragments should never communicate directly.
通常你想要一个代码片段与另一个通信,例如,以改变基于用户事件的内容。所有代码片段至代码片段的通信是通过相关联的活动完成。两个片段永远不应该直接通信。

 

Define an Interface
定义一个接口

 

--------------------------------------------------------------------------------

To allow a Fragment to communicate up to its Activity, you can define an interface in the Fragment class and implement it within the Activity. The Fragment captures the interface implementation during its onAttach() lifecycle method and can then call the Interface methods in order to communicate with the Activity.
为了让一个代码片段来了通信的活动,您可以定义在代码片段类的接口,并在活动中实现它。该代码片段捕获接口实现其onAttach()的生命周期方法的过程中,并且可以然后调用接口方法,以便与活动通信。

Here is an example of Fragment to Activity communication:
这里是片段到活动通信的例子:

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @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 = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }
    
    ...
}


 

 

Now the fragment can deliver messages to the activity by calling the onArticleSelected() method (or other methods in the interface) using the mCallback instance of the OnHeadlineSelectedListener interface.
现在该片段可以通过调用使用OnHeadlineSelectedListener接口的mCallback实例onArticleSelected()方法(或在接口的其它方法)传送消息到活动。

For example, the following method in the fragment is called when the user clicks on a list item. The fragment uses the callback interface to deliver the event to the parent activity.
例如,在片段下述方法,当用户点击一个列表项被调用。该片段使用回调接口传递该事件到父活动。

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Send the event to the host activity
        mCallback.onArticleSelected(position);
    }


 

 

Implement the Interface
实现接口


--------------------------------------------------------------------------------

In order to receive event callbacks from the fragment, the activity that hosts it must implement the interface defined in the fragment class.
为了从该片段接收事件回调,活动托管它必须实现在片段类中定义的接口。

For example, the following activity implements the interface from the above example.
例如,下面的活动实现从上面的例子中的接口。

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...
    
    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}


 

 

Deliver a Message to a Fragment
传递一个消息给一个代码片段

--------------------------------------------------------------------------------

The host activity can deliver messages to a fragment by capturing the Fragment instance with findFragmentById(), then directly call the fragment's public methods.
主机活动可以通过捕获与findFragmentById()的代码片段例如消息传送给一个片段,然后直接调用该片段的公共方法。

For instance, imagine that the activity shown above may contain another fragment that's used to display the item specified by the data returned in the above callback method. In this case, the activity can pass the information received in the callback method to the other fragment that will display the item:
例如,假设上述显示的活动可以包含的用于显示由上述回调方法返回的数据所指定的项的另一个片段。在这种情况下,该活动可以通过在回调方法的其他片段,将显示该项目收到的信息:

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article

        ArticleFragment articleFrag = (ArticleFragment)
                getSupportFragmentManager().findFragmentById(R.id.article_fragment);

        if (articleFrag != null) {
            // If article frag is available, we're in two-pane layout...

            // Call a method in the ArticleFragment to update its content
            articleFrag.updateArticleView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected article
            ArticleFragment newFragment = new ArticleFragment();
            Bundle args = new Bundle();
            args.putInt(ArticleFragment.ARG_POSITION, position);
            newFragment.setArguments(args);
        
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();
        }
    }
}


 

 

Next class: Saving Data
下一节课:保存数据

本文翻译自:https://developer.android.com/training/basics/fragments/communicating.html

目录
相关文章
|
4月前
|
数据库 Android开发 开发者
Android Studio入门之内容共享ContentProvider讲解以及实现共享数据实战(附源码 超详细必看)
Android Studio入门之内容共享ContentProvider讲解以及实现共享数据实战(附源码 超详细必看)
41 0
|
4月前
|
存储 XML Android开发
Android Studio App开发入门之数据存储中共享参数SharedPreferneces的讲解及使用(附源码 超详细必看)
Android Studio App开发入门之数据存储中共享参数SharedPreferneces的讲解及使用(附源码 超详细必看)
30 0
|
4月前
|
Android开发
Android Studio APP开发入门之对话框Dialog的讲解及使用(附源码 包括提醒对话框,日期对话框,时间对话框)
Android Studio APP开发入门之对话框Dialog的讲解及使用(附源码 包括提醒对话框,日期对话框,时间对话框)
34 0
|
4月前
|
XML 监控 Android开发
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
113 0
|
2天前
|
Android开发
Android JNI与CAN通信遇到的问题总结
Android JNI与CAN通信遇到的问题总结
21 1
|
4月前
|
XML Java Android开发
Android Studio App入门之列表视图ListView的讲解及实战(附源码 超详细必看)
Android Studio App入门之列表视图ListView的讲解及实战(附源码 超详细必看)
87 0
|
1月前
|
测试技术 API 调度
【Android 从入门到出门】第七章:开始使用WorkManager
【Android 从入门到出门】第七章:开始使用WorkManager
20 3
【Android 从入门到出门】第七章:开始使用WorkManager
|
1月前
|
存储 Android开发 C++
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
34 3
|
1月前
|
Android开发
【Android 从入门到出门】第四章:现代Android开发中的导航
【Android 从入门到出门】第四章:现代Android开发中的导航
22 2
【Android 从入门到出门】第四章:现代Android开发中的导航
|
1月前
|
XML API Android开发
【Android 从入门到出门】第三章:使用Hilt处理Jetpack Compose UI状态
【Android 从入门到出门】第三章:使用Hilt处理Jetpack Compose UI状态
26 4