说明
- 本次练习是在19.2、Android – Fragment --基础学习 --动态加载、事务&管理的基础上修改的
- 用 fragment_itm_blank和主activity实现信息交互
- 布局基本没有,就是在res/layout/fragment_itm_blank.xml中新增俩按钮,主要用于触发发送、获取信息
- 在 java/com/pha/first/FragmentItmBlank.java中将没用的方法删除。
这个在19.1、Android – Fragment(碎片) 基础学习–静态加载提到了,创建Fragment时至少需要实现三个方法:onCreate( ),onCreateView( ),OnPause( ),但是实际只有一个onCreateView()就可以。
那现在我们保留onCreateView( )这一个。
其他的我先不动。然后开始此次学习与练习。
Activity向Fragment发送信息
Activity向Fragment发送信息的方式主要是通过Bundle(),然后通过Fragment的setArguments(Bundle)发送。Fragment通过getArguments获取信息
1、在主Java类java/com/pha/first/FragmentMainActivity.java中,修改onClick方法
先看下之前的程序
修改后
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_fra_one:
//定义 Fragement1
FragmentItmBlank itmBlank = new FragmentItmBlank();
// Activity 向Fragment 发送信息
Bundle bundle = new Bundle();
bundle.putString("sendMsg","Activity send message to Fragment!");
itmBlank.setArguments(bundle);
ChangeFragment(itmBlank);
break;
case R.id.btn_fra_two:
ChangeFragment(new FragmentItmList());
break;
default:
break;
}
两者对比可以看出来发送信息
1)、定义Bundle :
Bundle bundle = new Bundle();
2)、发送信息赋值:
目前传的字符串,其中sendMsg是消息表示码,或者说关键字。
当我们传递了,很多消息,具体指哪个消息,就是是通过第一个参数区分的。也就是练习“sendMsg”位置
bundle.putString("sendMsg","Activity send message to Fragment!");
3)、通过Fragment信息发送
itmBlank.setArguments(bundle);
2、Fragment获取Activity发送的信息
接收信息系定义在java/com/pha/first/FragmentItmBlank.java 中的onCreateView();
- 修改前代码
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_itm_blank, container, false)
}
- 修改后代码
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(root == null){
root = inflater.inflate(R.layout.fragment_itm_blank, container, false);
}
Bundle bundle = this.getArguments();
String Str = bundle.getString("sendMsg");
Toast.makeText(this.getContext(), Str, Toast.LENGTH_SHORT).show();
return root;
}
从代码可以看出修改过程
1)、通过 getArguments() 获取Activity传过来的 Bundle:
Bundle bundle = this.getArguments();
2、获取Bundle中的信息
我们获取Activity发送的sendMsg消息
String Str = bundle.getString("sendMsg");
3、就可以使用activity发送的消息。
我们将消息提醒出来 。这里用的是Toast
Toast.makeText(this.getContext(), Str, Toast.LENGTH_SHORT).show();
Fragment向Activity发送、获取信息
主要是通过Interface接口
1、接口创建两个方法,一个获取信息,一个发送信息
2、在Fragment中定义变量A(变量类型就是1定义的接口),方法(方法参数B的类型就是1定义的接口);同事方法内容是将参数B复制给变量A
3、Activity中调用fragment中的方法,其方法参数对象–就是接口内的两个方法(内部匿名类),通过这两个方法接收、发送信息
4、Fragment中通过执行变量A的方法(也是接口中的俩方法)发送、获取信息
1、创建接口方法
操作:选择新建的路径->右键->new->Java class -> interface
java/com/pha/first/face/FragmentSendMsgToActivity.java (名称随意起的,不要介意)
package com.pha.first.face;
import androidx.fragment.app.Fragment;
public interface FragmentSendMsgToActivity
{
void SetMsgFagementToActivity(String str);
String GetMsgFagementFromActivity(Fragment fragment);
}
2、Fragment中定义变量,方法
java/com/pha/first/FragmentItmBlank.java
private FragmentSendMsgToActivity fragmentSendMsgToActivity;
public void SetFragemntMsg (FragmentSendMsgToActivity fragmentSendMsgToActivity){
this.fragmentSendMsgToActivity=fragmentSendMsgToActivity;
}
其中FragmentSendMsgToActivity 是1中的接口名称
fragmentSendMsgToActivity 就是变量A
SetFragemntMsg 就是新建的方法
fragmentSendMsgToActivity:是方法中参数B,器类型也是1中的接口名称
内容就是一个A=B
3、Activity中调用Fragment中的方法
itmBlank.SetFragemntMsg(new FragmentSendMsgToActivity() {
// Fragment 主动向 Activity发送信息
@Override
public void SetMsgFagementToActivity(String str) {
Toast.makeText(FragmentMainActivity.this, str, Toast.LENGTH_SHORT).show();
}
//Fragment 主动获取 Activity 的指定信息
@Override
public String GetMsgFagementFromActivity(Fragment fragment) {
return "Msg from Activity";
}
});
其中itmBlank就是Fragment名称 ( 在activity向fragment过程中定义的,这就不写了 )
SetMsgFagementToActivity接收信息,也就是 说Fragment主动向 Activity 发送信息,通过这个方法的的参数Str实现的
GetMsgFagementFromActivity 发送信息 ,也就是说 Fragment主动从 Activity 获取信息,通过这个方法的返回值获取的
3、Fragment主动发送、获取信息
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_fra_itm_bk_one:
fragmentSendMsgToActivity.SetMsgFagementToActivity("Msg from Fragment");
break;
case R.id.btn_fra_itm_bk_two:
String str = fragmentSendMsgToActivity.GetMsgFagementFromActivity(null);
Toast.makeText(this.getContext(), str, Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
最终代码
java/com/pha/first/FragmentMainActivity.java
package com.pha.first;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.pha.first.face.FragmentSendMsgToActivity;
public class FragmentMainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_main);
findViewById(R.id.btn_fra_one).setOnClickListener(this);
findViewById(R.id.btn_fra_two).setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_fra_one:
//定义 Fragement1
FragmentItmBlank itmBlank = new FragmentItmBlank();
// Activity 向Fragment 发送信息
Bundle bundle = new Bundle();
bundle.putString("sendMsg","Activity send message to Fragment!");
itmBlank.setArguments(bundle);
itmBlank.SetFragemntMsg(new FragmentSendMsgToActivity() {
// Fragment 主动向 Activity发送信息
@Override
public void SetMsgFagementToActivity(String str) {
Toast.makeText(FragmentMainActivity.this, str, Toast.LENGTH_SHORT).show();
}
//Fragment 主动获取 Activity 的指定信息
@Override
public String GetMsgFagementFromActivity(Fragment fragment) {
return "Msg from Activity";
}
});
//主layout 显示 Fragment
ChangeFragment(itmBlank);
break;
case R.id.btn_fra_two:
ChangeFragment(new FragmentItmList());
break;
default:
break;
}
}
private void ChangeFragment(Fragment fragment) {
FragmentManager supportFragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = supportFragmentManager.beginTransaction();
transaction.replace(R.id.fra_one,fragment);
transaction.addToBackStack(null);
transaction.commit();
}
}
java/com/pha/first/face/FragmentSendMsgToActivity.java
package com.pha.first.face;
import androidx.fragment.app.Fragment;
public interface FragmentSendMsgToActivity
{
void SetMsgFagementToActivity(String str);
String GetMsgFagementFromActivity(Fragment fragment);
}
java/com/pha/first/FragmentItmBlank.java
package com.pha.first;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.pha.first.face.FragmentSendMsgToActivity;
public class FragmentItmBlank extends Fragment implements View.OnClickListener {
private static final String TAG = "Fragment";
private View root;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(root == null){
root = inflater.inflate(R.layout.fragment_itm_blank, container, false);
}
Bundle bundle = this.getArguments();
String Str = bundle.getString("sendMsg");
Toast.makeText(this.getContext(), Str, Toast.LENGTH_SHORT).show();
root.findViewById(R.id.btn_fra_itm_bk_one).setOnClickListener(this);
root.findViewById(R.id.btn_fra_itm_bk_two).setOnClickListener(this);
return root;
}
private FragmentSendMsgToActivity fragmentSendMsgToActivity;
public void SetFragemntMsg (FragmentSendMsgToActivity fragmentSendMsgToActivity){
this.fragmentSendMsgToActivity=fragmentSendMsgToActivity;
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_fra_itm_bk_one:
fragmentSendMsgToActivity.SetMsgFagementToActivity("Msg from Fragment");
break;
case R.id.btn_fra_itm_bk_two:
String str = fragmentSendMsgToActivity.GetMsgFagementFromActivity(null);
Toast.makeText(this.getContext(), str, Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
效果图(略)
。。。。
记忆知识点
1、Activity向Fragment发送信息
Activity向Fragment发送信息的方式主要是通过Bundle(),然后通过Fragment的setArguments(Bundle)发送。Fragment通过getArguments获取信息
2、Fragment向Activity发送、获取信息
主要是通过Interface接口
1、接口创建两个方法,一个获取信息,一个发送信息
2、在Fragment中定义变量A(变量类型就是1定义的接口),方法(方法参数B的类型就是1定义的接口);同事方法内容是将参数B复制给变量A
3、Activity中调用fragment中的方法,其方法参数对象–就是接口内的两个方法(内部匿名类),通过这两个方法接收、发送信息
4、Fragment中通过执行变量A的方法(也是接口中的俩方法)发送、获取信息