概述
直接上代码
首先是主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 同一Activity 静态加载fragment 并实现通信的全部内容,希望文章能够帮你解决Android 同一Activity 静态加载fragment 并实现通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复