Fragment的发展
Android从3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像Activity一样包含布局。Fragment通常是嵌套在Activity中使用的。
Fragment的生命周期
Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系:
可以看到Fragment比Activity多了几个额外的生命周期回调方法:
onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现
下面我们一起看下本博客项目的预览图:
效果很简单粗暴,实现了动态添加fragment,fragment间的数据传递,fragment与activity的数据传递,都是比较常用的。
现在我们一起来分析这段实现代码:
- MainActivity:
package com.cc.csdndemo.activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.cc.csdndemo.R;
import com.cc.csdndemo.fragment.FirstFragment;
import com.cc.csdndemo.fragment.SecondFragment;
import com.cc.csdndemo.fragment.ThreeFragment;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button firstBTN, secondBTN, threeBTN;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById();
setOnclickListener();
initView();
}
private void findViewById() {
firstBTN = (Button) findViewById(R.id.firstBTN);
secondBTN = (Button) findViewById(R.id.secondBTN);
threeBTN = (Button) findViewById(R.id.threeBTN);
}
private void setOnclickListener() {
firstBTN.setOnClickListener(this);
secondBTN.setOnClickListener(this);
threeBTN.setOnClickListener(this);
}
private void initView() {
getSupportFragmentManager().beginTransaction().replace(R.id.contentF, new FirstFragment()).commit();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.firstBTN:
getSupportFragmentManager().beginTransaction().replace(R.id.contentF, new FirstFragment()).addToBackStack(null).commit();
break;
case R.id.secondBTN:
getSupportFragmentManager().beginTransaction().replace(R.id.contentF, new SecondFragment()).addToBackStack(null).commit();
break;
case R.id.threeBTN:
getSupportFragmentManager().beginTransaction().replace(R.id.contentF, new ThreeFragment()).addToBackStack(null).commit();
break;
}
}
}
- 动态添加fragment:
以上就是MainActivity主要代码,这里面有几点需要我们注意,getSupportFragmentManager().beginTransaction().replace(R.id.contentF, new FirstFragment()).commit();这个用法就是动态替换fragment的关键,首先我们需要通过getSupportFragmentManager()获取Fragment的管理器,第二步开启事务,然后动态替换显示控件,最终提交生效,addToBackStack(null)这个并不是必须的 ,这个是把fragment添加到回退栈中,让我们可以原步骤返回。
- fragment传递数据:
FirstFragment:
package com.cc.csdndemo.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import com.cc.csdndemo.R;
/**
* A simple {@link Fragment} subclass.
*/
public class FirstFragment extends Fragment implements View.OnClickListener {
private EditText editText;
private Button button;
public FirstFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_first, container, false);
editText = (EditText) view.findViewById(R.id.firstET);
button = (Button) view.findViewById(R.id.passParameterBTN);
button.setOnClickListener(this);
return view;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.passParameterBTN:
//获取输入框的内容
String s = editText.getText().toString().trim();
//传递给下一个fragment
SecondFragment secondFragment = new SecondFragment();
Bundle bundle = new Bundle();
bundle.putString("pass", s);
secondFragment.setArguments(bundle);
getFragmentManager().beginTransaction().replace(R.id.contentF, secondFragment).addToBackStack(null).commit();
break;
}
}
}
fragment之间传递数据的关键就在于secondFragment.setArguments(bundle);这里面需要传递bundle的类型参数,把需要传递的数据通过bundle携带,最终通过getFragmentManager().beginTransaction().replace(R.id.contentF, secondFragment).addToBackStack(null).commit();传递出去。
- SecondFragment:
package com.cc.csdndemo.fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.cc.csdndemo.R;
import com.cc.csdndemo.activity.Main2Activity;
/**
* A simple {@link Fragment} subclass.
*/
public class SecondFragment extends Fragment implements View.OnClickListener {
private TextView secondTV;
private Button activityPassParameterBTN;
public SecondFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_second, container, false);
secondTV = (TextView) view.findViewById(R.id.secondTV);
activityPassParameterBTN = (Button) view.findViewById(R.id.activityPassParameterBTN);
activityPassParameterBTN.setOnClickListener(this);
//判断是否有值传递过来
if (getArguments() != null) {
String s = getArguments().getString("pass");
secondTV.setText(s);
}
return view;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.activityPassParameterBTN:
//需要传递给activity的数据
String s = secondTV.getText().toString();
Intent intent = new Intent(getActivity(), Main2Activity.class);
intent.putExtra("s", s);
startActivity(intent);
break;
}
}
}
在这里面主要实现了,接收firstFragment传递的数据,和把数据传递给下一个Activity里面,String s = getArguments().getString(“pass”);这句话就是接收fragment传递的数据;fragment与Activity数据传输还是使用intent携带数据,唯一需要注意的是通过getActivity获取Context对象。
最后附上完整代码:http://download.csdn.net/detail/qq_33792946/9730556