Android 同一Activity 静态加载fragment 并实现通信
2015-09-05 08:42
591 查看
直接上代码
首先是主Activity:
MainActivity.Java
activity_main.xml
然后fragment_one.xml:
接着是fragment_two.xml
首先是主Activity:
MainActivity.Java
package com.example.acer.fragment_test; import android.app.Activity; import android.app.FragmentManager; import android.os.Bundle; public class MainActivity extends Activity implements Fragment_One.OneOnClickListener{ public static final String MESS = "data"; private String data; private Fragment_Two fragment_two; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //实现接口方法,实现将fragment_one中的数据传到宿主Activity @Override public void setData(String str) { data = str; } //定义fragment_one中的Button点击事件响应 @Override public void handleClick() { //获得Activity中fragment的管理器,用来操作其中的fragment. FragmentManager fragmentManager = getFragmentManager(); //调用newInstance(String data)方法,将Activity中的数据传给fragment_two,fragment_two将数据放到唯一与之绑定的Bundle中,通过getArgument()方法,得到Activity中fragment_one中发送的数据.(这里不用new Fragment_Two,而是定义了一个方法是有原因的,解决屏幕重置问题) fragment_two = Fragment_Two.newInstance(data); //利用事务动态覆盖之前的fragment_two. fragmentManager.beginTransaction().replace(R.id.fragment_two, fragment_two).commit(); } }
activity_main.xml
//在主xml中定义两个fragment标签,静态加载的标志,此时要注意给标签设定id,name,否则会出现异常 <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:paddingLeft="@dimen/activity_horizontal_margin" android:orientation="vertical" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <fragment android:id="@+id/fragment_one" android:layout_width="wrap_content" android:layout_height="wrap_content" android:name="com.example.acer.fragment_test.Fragment_One" ></fragment> <fragment android:id="@+id/fragment_two" android:layout_width="wrap_content" android:layout_height="wrap_content" android:name="com.example.acer.fragment_test.Fragment_Two"></fragment> </LinearLayout>
然后fragment_one.xml:
//定义一个输入框和发送按钮 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <EditText android:id="@+id/input_text" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_one" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试"/> </LinearLayout> Fragment_one.java package com.example.acer.fragment_test; import android.app.Fragment; import android.content.DialogInterface; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; /** * Created by acer on 2015/9/4. */ public class Fragment_One extends Fragment implements View.OnClickListener { private EditText editText; private Button button; //绘制fragment_one时回调的方法 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_one,container,false); button = (Button) view.findViewById(R.id.btn_one); editText = (EditText) view.findViewById(R.id.input_text); button.setOnClickListener(this); return view; } //声明一个接口,让Activity实现,实现与Activity解耦 public interface OneOnClickListener{ void setData(String str); void handleClick(); } //定义Button按钮的监听事件. @Override public void onClick(View v) { if (getActivity() instanceof OneOnClickListener){ Toast.makeText(getActivity(),editText.getText().toString(),Toast.LENGTH_SHORT).show(); ((OneOnClickListener) getActivity()).setData(editText.getText().toString()); ((OneOnClickListener) getActivity()).handleClick(); } } }
接着是fragment_two.xml
//定义一个用来显示发送来的数据 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/show_text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </FrameLayout> Fragment_Two.java: package com.example.acer.fragment_test; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Created by acer on 2015/9/4. */ public class Fragment_Two extends Fragment { private String data; //创建fragment_two时回调的方法,此时判断bundle是否为空,空则表示第一次绘制,非空表示fragment_one发送了数据给Activity,Activity又通过setArgument()方法发送到fragment_two中。 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = getArguments(); if(bundle!=null) { data = bundle.getString(MainActivity.MESS); }else { data = "当前无内容"; } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_two,container,false); return view; } //在onCreateView()方法执行后的方法中写新数据(否则会一起绘制,达不到覆盖的效果),onStart(),onResume()都可以,具体可以看一下fragment的生命周期 @Override public void onStart() { super.onStart(); TextView textView = (TextView) getActivity().findViewById(R.id.show_text); textView.setText(data); } //定义方法来返回一个含有bundle数据的fragment_two,bundle中的数据是fragment_one发送来的数据. public static Fragment_Two newInstance(String data){ Bundle bundle = new Bundle(); bundle.putString(MainActivity.MESS,data); Fragment_Two fragment_two = new Fragment_Two(); fragment_two.setArguments(bundle); return fragment_two; } }
相关文章推荐
- android菜鸟进阶之路——线程的基本探究
- phonegap android插件,启动activity并返回值
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android Studio 中快速提取方法
- Android Studio之Gradle多渠道打包
- Android 测试BOOT_COMPLETED 广播
- Android 低版本实现Tint--着色功能
- Android Source:优雅的repo sync自动重试
- android 自定义view(三)
- Android开发工具:Android Studio中Gradle的配置
- 第一个opencv4android项目
- Android Studio——Activity切换
- Android 编程下两种方式注册广播的区别
- Android截屏方法汇总
- Android之Service通信-(1)
- 2015-09-04
- 安卓开发之自定义Dialog
- Android之Thread与Service
- [置顶] android studio在svn中ignore的文件及文件夹
- Android开发--通过相册或拍照选择头像