通常,一个活动可能包含一个或多个协同工作的Fragment以向用户展现一致的UI。在这种情况下,Fragment之间就需要彼此通信并交换数据,这是非常重要的。例如,一个Fragment可能包含了一个条目列表(如来自一个RSS提要的帖子)。当用户轻点Fragment上的某个条目时,所选条目的详细信息可能会显示在另一个Fragment上。
下面的“试一试”介绍了一个Fragment如何访问另一个Fragment中的视图。
(1) 使用上一节创建的项目,向Fragment1.xml文件中添加如下所示的粗体代码:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#00FF00"
- >
- <TextView
- android:id="@+id/lblFragment1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="This is fragment #1" />
- </LinearLayout>
(2) 向fragment2.xml文件中添加如下所示的粗体代码:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#FFFE00"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="This is fragment #2" />
- <Button android:id="@+id/btnGetText"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Get text in Fragment #1" />
- </LinearLayout>
(3) 修改MainActivity.java文件,将前几节添加的代码注释掉。修改后的代码如下所示:
- package net.learn2develop.Fragments;
- import net.learn2develop.Fragments.R;
- import android.app.Activity;
- import android.os.Bundle;
- public class MainActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- }
(4) 向Fragment2.java文件中添加如下所示的粗体代码:
- package net.learn2develop.Fragments;
- import android.app.Fragment;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
- public class Fragment2 extends Fragment {
- @Override
- public View onCreateView(LayoutInflater inflater,
- ViewGroup container, Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- return Inflater.inflate(R.layout.fragment2,
- container, false);
- }
- @Override
- public void onStart() {
- super.onStart();
- //---Button view---
- Button btnGetText = (Button)
- getActivity().findViewById(R.id.btnGetText);
- btnGetText.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- TextView lbl = (TextView)
- getActivity().findViewById(R.id.lblFragment1);
- Toast.makeText(getActivity(), lbl.getText(),
- Toast.LENGTH_SHORT).show();
- }
- });
- }
- }
(5) 将这两个Fragment放到main.xml中:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <fragment
- android:name="net.learn2develop.Fragments.Fragment1"
- android:id="@+id/fragment1"
- android:layout_weight="1"
- android:layout_width="0px"
- android:layout_height="match_parent" />
- <fragment
- android:name="net.learn2develop.Fragments.Fragment2"
- android:id="@+id/fragment2"
- android:layout_weight="1"
- android:layout_width="0px"
- android:layout_height="match_parent" />
- </LinearLayout>
(6) 按下F11键在Android模拟器上调试应用。在右边第2个Fragment中单击按钮,将会看到Toast类显示出文本This is fragment #1(如图2-13所示)。
示例说明
由于Fragment被嵌入到了活动中,因此可以通过getActivity()方法获取Fragment当前所嵌入到的活动,然后使用findViewById()方法找到Fragment中包含的视图:
- TextView lbl = (TextView)
- getActivity().findViewById(R.id.lblFragment1);
- Toast.makeText(getActivity(), lbl.getText(),
- Toast.LENGTH_SHORT).show();