Android中activity与fragment通信
来源:互联网 发布:网络研修成果 编辑:程序博客网 时间:2024/05/24 04:30
Android中activity与fragment通信
一、activity之间传值
- 通过intent传递数据
- 通过Application
- 使用单例
- 静态成员变量
- 持久化(sqlite、share preference、file等)
1、通过intent传递数据
- 直接传递,intent.putExtra(key, value)
- 通过bundle,intent.putExtras(bundle);
注意:
①这两种都要求传递的对象必须可序列化(Parcelable、Serializable),特别注意对象中对象也要序列化
②Parcelable实现相对复杂
③关于Parcelable和Serializable,官方说法:
Serializable: it's error prone and horribly slow. So in general: stay away from Serializable if possible.
也就是说和Parcelable相比,Seriaizable容易出错并且速度相当慢。
④通过intent传递数据是有大小限制滴,超过限制,要么抛异常,要么新的Activity启动失败,所以还是很严重的啊。
2、Application
将数据保存在全局Application中,随整个应用的存在而存在,这样很多地方都能访问。
但是需要注意的是:
当由于某些原因(比如系统内存不足),我们的app会被系统强制杀死,此时再次点击进入应用时,系统会直接进入被杀死前的那个界面,制造一种从来没有被杀死的假象。那么问题来了,系统强制停止了应用,进程死了,那么再次启动时Application自然新的,那里边的数据自然木有啦,如果直接使用很可能报空指针或者其他错误。
因此还是要考虑好这种情况的:
①使用时一定要做好非空判断
②如果数据为空,可以考虑逻辑上让应用直接返回到最初的activity,比如用 FLAG_ACTIVITY_CLEAR_TASK 或者 BroadcastReceiver 杀掉其他的activity。
3、使用单例
比如一种常见的写法:
public class DataHolder { private String data; public String getData() {return data;} public void setData(String data) {this.data = data;} private static final DataHolder holder = new DataHolder(); public static DataHolder getInstance() {return holder;}}
这样在启动activity之前:
DataHolder.getInstance().setData(data);
新的activity中获取数据:
String data = DataHolder.getInstance().getData();
4、静态Static
public static final String SEX = "sex";
5、持久化数据
sqlite、share preference、file
二、fragment之间传值
三、activity与fragment之间传值
1、activity向fragment传值:采用bundle方式
activity布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout 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:background="@color/rainbow_yellow" android:orientation="vertical" tools:context="com.anwanfei.anfly.summary.activity.FragmentTestActivity"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="我是Activity" android:textColor="@color/colorPrimary" android:textSize="20dp" /> <FrameLayout android:layout_margin="20dp" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/button" /></LinearLayout>
fragment布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/rainbow_red" android:orientation="vertical"> <TextView android:id="@+id/fragment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="我是fragment" android:textColor="@color/colorPrimary" android:textSize="30dp" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textColor="@color/white" android:text="等待Activity发送消息" android:textSize="20dp" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_gravity="center" android:text="点击接收Activity消息" android:textSize="20dp" /></LinearLayout>
activity中:
public class FragmentTestActivity extends BaseActivity { @BindView(R.id.text) TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void initView() { //获取fragmentmanager FragmentManager supportFragmentManager = getSupportFragmentManager(); //获取fragmentTranscation FragmentTransaction ft = supportFragmentManager.beginTransaction(); //创建需要添加的fragment TestFragment testFragment = new TestFragment(); //创建bundle对象 Bundle bundle = new Bundle(); //往bundle中添加数据 bundle.putString("message","我来自FragmentTestActivity"); //把数据设置到fragment中 testFragment.setArguments(bundle); //动态添加fragment ft.add(R.id.fragment_container,testFragment); ft.commit(); } @Override public int getLayoutId() { return R.layout.activity_fragment_test; }}
fragment中:
public class TestFragment extends BaseFragment { @BindView(R.id.fragment) TextView fragment; @BindView(R.id.text) TextView text; @BindView(R.id.button) Button button; Unbinder unbinder; private String message; @Override protected View initView() { View view = View.inflate(getActivity(), R.layout.fragment_test, null); return view; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO: inflate a fragment view View rootView = super.onCreateView(inflater, container, savedInstanceState); unbinder = ButterKnife.bind(this, rootView); return rootView; } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); } @Override protected void initData() { super.initData(); //通过argument获取activity传过来的全部值 Bundle arguments = this.getArguments(); //获取某一值 message = arguments.getString("message"); } @OnClick(R.id.button) public void onViewClicked() { text.setText(message); }
2、fragment向activity传–接口回调方式
- 接口回调:把实现了某一接口的类所创建的对象的引用 赋给 该接口声明的变量,通过该接口变量 调用 该实现类对象的实现的接口方法。
接口声明的变量 :Com com;实现了Com接口的类(Com1)所创建的对象的引用 赋给 该接口声明的变量:Com com = new Com1; 通过该接口变量(com)调用 该实现类对象(Com1)的实现的接口方法(carson()) com.carson();
activtiy布局:
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/text" android:layout_centerInParent="true" android:text="点击接收Fragment消息" android:textSize="10dp" /> <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="500dp" android:layout_below="@+id/button" /></LinearLayout>
fragment布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorAccent" android:gravity="center" android:text="我是fragment" android:textSize="30dp" /></LinearLayout>
设置回调接口ICallback,用于activity与fragment之间通信:
public interface ICallback { void getMessageFromFragment(String string);}
设置fragment类
public class MyFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment, container, false); return view; } //设置接口回调方法 public void sendMessage(ICallback iCallback) { iCallback.getMessageFromFragment("我是来自fragment的消息"); }}
设置Activity类文件
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView textview = (TextView) findViewById(R.id.textview); Button button = (Button) findViewById(R.id.button); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); final MyFragment myFragment = new MyFragment(); fragmentTransaction.add(R.id.fragment_container, myFragment); fragmentTransaction.commit(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //通过接口回调的方法获取fragment的消息 myFragment.sendMessage(new ICallback() { @Override public void getMessageFromFragment(String string) { textview.setText(string); } }); } }); }}
- android中fragment与activity之间通信
- Android中activity与Fragment通信
- Android中activity与fragment通信
- 【Android】Fragment与Activity通信
- Fragment与Activity通信 Android
- android中Fragment与Activity之间通信原理以及例子
- android中fragment与activity之间通信原理以及例子
- android中fragment与activity之间通信原理以及例子
- android中fragment与activity之间通信原理以及例子
- android中fragment与activity之间通信原理以及例子
- android中fragment与activity之间通信原理以及例子
- Android 中Fragment与Activity通信大汇总
- Android中Fragment与Fragment,Fragment与Activity之间的通信
- android Activity与Fragment之间的通信
- Android自助餐之Fragment与Activity通信
- Fragment与Activity通信
- Fragment与Activity通信
- Fragment与Activity通信
- 通达oa破解版|通达oa破解版下载|通达oa2017破解版
- Node.js事件示例
- PHPStorm 配置命名空间
- js添加获取cookie无路径限制
- Web Services初窥
- Android中activity与fragment通信
- javascript--对call方法的理解
- Java获得Class实例的三种方式
- syslog.h和android的log系统冲突问题
- JOB:前端面试8
- shell动态读取文件夹下的文件和文件名并替换到页面上
- ReviveOverlay
- slf4j 和 log4j合用的(Maven)配置
- PHP并发