fragment 依赖于activity 。不是android 四大组件,是一个view,与activity 不可分开,有很多时候,我们用fragment 做界面,甚至拿它充当了activity 。
既然它依赖activity 并 可以充当activity ,那我们就应该有权利在来控制它。那看了谷歌公司是怎么做的。先看一部分代码。
这里的布局放了两个button 和一个FrameLayout布局
**注意FrameLayout 在哪用的 观察id 在下面代码里的出现**
activity 的 xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/id_ly_bottombar"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:layout_alignParentBottom="true"
layout="@layout/layout_bar" />
<FrameLayout
android:id="@+id/id_content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/id_ly_bottombar" />
LinearLayout>
对fragment 操作有fragment 事物来来处理
注意这几个方法,这是对fragment 在activity 动态 添加 替换 删除
transaction.add();
transaction.replace();
transaction.remove()
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction =fm.beginTransaction();
BFragment() bFragment = new BFragment();
transaction.add(R.id.id_content,BFragment);//注意这里的 id 是bFragment 所在的父布局
transaction.commit();
接下看我们怎么在activity 和 Fragment 传递数据
和activity一样利用 Bundle
Person 类必须实现 Serializable接口
activity 里写法
Person person=new Person("姓名","手机");
OneWithDataFragment oneWithDataFragment = new OneWithDataFragment();
//OneWithDataFragment 是我们需要传入数据的Fragment
Bundle bundle=new Bundle();
bundle.putSerializable("person",person);
oneWithDataFragment.setArguments(bundle);
transaction.commit();
fragment 写法
Bundle bundle=getArguments();
Person person=(Person) bundle.getSerializable("person");
TextView tv=(TextView)view.findViewById(R.id.tv);
tv.setText(person.getName()+person.getPhone());
fragment 和 fragment 是传递数据
fragment 既然依赖activity 那我们就也利用factivity 来实现。
我们在两个fragment 里都写接口,让 activity 实现这两个接口。
要传递数据的fragment
在 传递接口方法里加上参数,在实现类的实现方法里初始化数据
public interface intentDataListener{
void initentData(Person person);
}
要接收数据的fragment
在 接收的接口方法里加上返回值,在实现类的实现方法里将数据返回
public interface DataListener{
Person getIntentData();
}
下面看具体代码
activity
package com.example.erhu.fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.example.erhu.jsondemo.R;
/**
* Created by erhu on 16/9/21.
*/
public class AActivity extends AppCompatActivity implements View.OnClickListener,BFragment.DataListener,CFragment.intentDataListener {
BFragment bFragment;
CFragment cFragment;
Person p=new Person("姓名","手机");
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
findViewById(R.id.one_btn).setOnClickListener(this);
findViewById(R.id.two_btn).setOnClickListener(this);
defaultFragment();
}
@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction =fm.beginTransaction();
switch (v.getId()){
case R.id.one_btn:
if (bFragment==null){
bFragment = new BFragment();
bFragment.setListener(this);
}
transaction.replace(R.id.id_content, bFragment);
break;
case R.id.two_btn:
if (cFragment==null){
cFragment = new CFragment();
cFragment.setListener(this);
}
transaction.replace(R.id.id_content, cFragment);
break;
}
transaction.commit();
}
public void defaultFragment(){
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
bFragment = new BFragment();
bFragment.setListener(this);
transaction.add(R.id.id_content, bFragment);
transaction.commit();
}
@Override
public void initentData(Person person) {
p=person;
}
@Override
public Person getIntentData() {
return p;
}
}
要传递数据的fragment
package com.example.erhu.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.erhu.jsondemo.R;
public class CFragment extends Fragment implements View.OnClickListener{
View view;
public intentDataListener listener;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view=inflater.inflate(R.layout.fragment_c,null);
view.findViewById(R.id.cfragment).setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.cfragment:
if (listener!=null){
Person person=new Person("我是碎片传来数据","qqqqqqqq");
listener.initentData(person);
}
break;
}
}
public interface intentDataListener{
void initentData(Person person);
}
/**
*
* 设置回调接口
*/
public void setListener(intentDataListener listener) {
this.listener = listener;
}
}
接收数据的fragment
package com.example.erhu.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.example.erhu.jsondemo.R;
import org.w3c.dom.Text;
public class BFragment extends Fragment implements View.OnClickListener{
Button button;
View view;
public DataListener listener;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view=inflater.inflate(R.layout.fragment_b,null);
button=(Button)view.findViewById(R.id.bfragment);
button.setOnClickListener(this);
return view;
}
public interface DataListener{
Person getIntentData();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bfragment:
getPersonData();
break;
}
}
public void getPersonData(){
Person p= listener.getIntentData();
TextView tv=(TextView) view.findViewById(R.id.fr_tv);
tv.setText(p.getName());
}
public void setListener(DataListener listener) {
this.listener = listener;
}
}