问题1: Activity 如何传递数据到 Fragment?
答:采用 Bundle
方式。具体Demo步骤如下:
activcity_2_fragment.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:text="我是Activity" /> <FrameLayout android:layout_below="@+id/button" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="500dp"/></LinearLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
fragment.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorAccent" > <TextView android:id="@+id/fragment" android:text="我是fragment" android:layout_gravity="center" android:textSize="30dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/text" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:text="等待Activity发送消息" /> <Button android:id="@+id/button" android:layout_gravity="center" android:text="点击接收Activity消息" android:layout_centerInParent="true" android:textSize="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
Activity2Fragment
public class Activity2Fragment extends AppCompatActivity { TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activcity_2_fragment); text = (TextView) findViewById(R.id.text); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); final mFragment fragment = new mFragment(); Bundle bundle = new Bundle(); bundle.putString("message", "I love Google"); fragment.setArguments(bundle); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
mFragment.Java
public class mFragment extends Fragment { Button button; TextView text; Bundle bundle; String message; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View contentView = inflater.inflate(R.layout.fragment, container, false); button = (Button) contentView.findViewById(R.id.button); text = (TextView) contentView.findViewById(R.id.text); bundle = this.getArguments(); message = bundle.getString("message"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { text.setText(message); } }); return contentView; }
}
问题2:Fragment 如何传递数据到 Activity
- 答:采用 接口回调 方式。
- 接口回调 回顾
把实现了某一接口的类所创建的对象的引用 赋给 该接口声明的变量,通过该接口变量 调用 该实现类对象的实现的接口方法。
// 接口声明的变量Com com;// 实现了Com接口的类(Com1)所创建的对象的引用 赋给 该接口声明的变量Com com = new Com1;// 通过该接口变量(com) 调用 该实现类对象(Com1)的实现的接口方法(carson())com.carson();
具体Demo
- 步骤1:在
Activity
的布局文件定义1占位符(FrameLayout
)
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="scut.carson_ho.fragment_2_activity.MainActivity"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:text="等待Fragment发送消息" /> <Button android:id="@+id/button" android:layout_below="@+id/text" android:text="点击接收Fragment消息" android:layout_centerInParent="true" android:textSize="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <FrameLayout android:layout_below="@+id/button" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="500dp"/></RelativeLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
fragment.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/fragment" android:text="我是fragment" android:gravity="center" android:textSize="30dp" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorAccent"/></LinearLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 步骤3:设置回调接口
该接口用于用于Activity
与Fragment
通信
ICallBack.java
public interface ICallBack { void get_message_from_Fragment(String string);}
mFragment.java
public class mFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View contentView = inflater.inflate(R.layout.fragment, container, false); return contentView; } public void sendMessage(ICallBack callBack){ callBack.get_message_from_Fragment("消息:我来自Fragment"); }}
Main_Activity.java
public class MainActivity extends AppCompatActivity { Button button; TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button); text = (TextView)findViewById(R.id.text); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); final mFragment fragment = new mFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fragment.sendMessage(new ICallBack() { @Override public void get_message_from_Fragment(String string) { text.setText(string); } }); } }); }}