Fragment
一、介绍
模块化/可重用的组件
定义了自己的布局,通过使用它自己的生命周期回调方法定义了它自己的行为。可以将Fragment包含到多个Activity中。
1、创建Fragment,必须创建其子类或者继承已存在的子类
2、onCreateView()方法
返回View--可以为NULL
3、Fragment加载方式
i:静态加载
ii:动态加载
三、 生命周期
关键方法(至少实现加粗的这三个方法)onCreateView();每次创建都会绘制fragment的View组件时回调该方法
onAttach();当Fragment被添加到Activity时会回调这个方法,并且只调用一次
onCreate();创建Fragment时会回调这个方法,并且只调用一次
onActivityCreated();当Fragment所在Activity启动完成后调用
onStart();启动fragment
onResume();恢复Fragment时会被回调,调用onStart()后面一定会调用onResume();
onPause();暂停
onStop();停止fragment
onDestroyView();销毁Fragment所包含的View组件时会调用
onDestroy();销毁Fragment会被回调
OnDetach();Fragment从Activity中删除时会回调该方法,只调用一次
下图为 fragment 的生命周期(它所在的 activity 处于运行状态)。
<span style="font-size:12px;">package huaxa.it.fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
public class MainActivity1 extends FragmentActivity implements OnCheckedChangeListener{
private RadioGroup group;
protected void onCreate(Bundle savedInstanceState) {
// TODO 自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
group = (RadioGroup) findViewById(R.id.radioGroup1);
group.setOnCheckedChangeListener(this);
}
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO 自动生成的方法存根
switch (checkedId) {
case R.id.radio0:
Intent intent = new Intent(this,MainActivity2.class);
startActivity(intent);
//Toast.makeText(this, "点击有效果", Toast.LENGTH_SHORT).show();
break;
case R.id.radio1:
MyFragment2 myFragment2 = new MyFragment2();//初始化
android.support.v4.app.FragmentManager fragementManager = getSupportFragmentManager();//获得fragment的一个管理者
android.support.v4.app.FragmentTransaction beginTransaction = fragementManager.beginTransaction();//开启事务,获取事务的对象
beginTransaction.add(R.id.main1, myFragment2);//第一个参数MyFragment2加载到哪个布局,第二个参数是MyFragment2对象
beginTransaction.addToBackStack(null);//传递名字为空
beginTransaction.commit();
break;
case R.id.radio2:
Intent intent2 = new Intent(this,MainActivity3.class);
startActivity(intent2);
break;
case R.id.radio3:
break;
default:
break;
}
}
}</span>
<span style="font-size:12px;"> MainActivity2:</span>
package huaxa.it.fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity2 extends FragmentActivity {
/** Called when the activity is first created. */
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
Button button = (Button) findViewById(R.id.button);
tv = (TextView) findViewById(R.id.textview);
button.setText("改变");
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO 自动生成的方法存根
tv.setText("TextView改变了!");
}
});
}
}
<span style="font-size:12px;">————MainActivity3:————</span>
package huaxa.it.fragment;
import huaxa.it.fragment.MyFragment3.MyListener;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity3 extends FragmentActivity implements MyListener{
private EditText edit;
private Button send;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO 自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.main3);
edit = (EditText) findViewById(R.id.edit1);
send = (Button) findViewById(R.id.send1);
send.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO 自动生成的方法存根
MyFragment3 myFragment3 = new MyFragment3();
String text = edit.getText().toString();
android.support.v4.app.FragmentManager fragementManager = getSupportFragmentManager();//获得fragment的一个管理者
android.support.v4.app.FragmentTransaction beginTransaction = fragementManager.beginTransaction();//开启事务,获取事务的对象
beginTransaction.add(R.id.main3, myFragment3);
Bundle bundle = new Bundle();
bundle.putString("sending", text);
myFragment3.setArguments(bundle);
beginTransaction.commit();
Toast.makeText(MainActivity3.this, "已经发送出去了",Toast.LENGTH_SHORT).show();
}
});
android.support.v4.app.FragmentManager fragementManager = getSupportFragmentManager();
Fragment fragment = fragementManager.findFragmentById(R.id.frag);
MyFragment1 frag = (MyFragment1) fragment;
frag.setAbc("静态传送数值已发送!");
}
public void thanks(String code) {
// TODO 自动生成的方法存根
Toast.makeText(MainActivity3.this, "谢谢收到了"+code,Toast.LENGTH_SHORT).show();
}
}
<span style="font-size:12px;">————Fragment1:————</span>
package huaxa.it.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MyFragment1 extends Fragment {
private String abc;
private Button button;
public String getAbc() {
return abc;
}
public void setAbc(String abc) {
this.abc = abc;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//inflate是把Layout形成一个以view类实现成的对象,onCreateView需要返回View的对象,所以改写return
/*传递一个布局文件,第一个参数是:fragment需要加载的布局文件;
*第二个参数:想让Fragment的对象放到activity中,必须将root放在ViewGroup来=加载layout布局文件的父ViewGroup;
*第三个参数:True,返回ViewGroup
**/
View view = inflater.inflate(R.layout.fragment1, container, false);
//布局文件放在view里面所以需要加上view.,否则会报错
TextView textview = (TextView) view.findViewById(R.id.textview);
textview.setText("静态加载Fragment");
button = (Button) view.findViewById(R.id.button);
button.setText("获取内容");
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO 自动生成的方法存根
String text = getAbc();
Toast.makeText(getActivity(), "已接收到静态传值"+text, Toast.LENGTH_SHORT).show();
}
});
return view;
//return super.onCreateView(inflater, container, savedInstanceState);
}
}
————Fragment2:————
package huaxa.it.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class MyFragment2 extends Fragment {
private TextView textview;
private Button button;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//inflate是把Layout形成一个以view类实现成的对象,onCreateView需要返回View的对象,所以改写return
/*传递一个布局文件,第一个参数是:fragment需要加载的布局文件;
*第二个参数:想让Fragment的对象放到activity中,必须将root放在ViewGroup来=加载layout布局文件的父ViewGroup;
*第三个参数:True,返回ViewGroup
**/
View view = inflater.inflate(R.layout.fragment1, container, false);
//布局文件放在view里面所以需要加上view.,否则会报错
textview = (TextView) view.findViewById(R.id.textview);
textview.setText("动态加载Fragment");
button = (Button) view.findViewById(R.id.button);
button.setText("改变");
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO 自动生成的方法存根
textview.setText("TextView改变了!");
}
});
return view;
//return super.onCreateView(inflater, container, savedInstanceState);
}
}
————Fragment3:————
package huaxa.it.fragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MyFragment3 extends Fragment{
private TextView textview;
private Button button;
private String code = "Thanks very much!";
private MyListener listener;
public interface MyListener{
public void thanks(String code);
}
public void onAttach(Activity activity) {
// TODO 自动生成的方法存根
listener = (MyListener) activity;
super.onAttach(activity);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO 自动生成的方法存根
View view = inflater.inflate(R.layout.fragment1, container, false);
//布局文件放在view里面所以需要加上view.,否则会报错
textview = (TextView) view.findViewById(R.id.textview);
textview.setText("动态加载Fragment");
String text = getArguments().get("sending")+"";
Toast.makeText(getActivity(), "fragment已经接收到了"+text,Toast.LENGTH_SHORT).show();
Toast.makeText(getActivity(), "fragment发送了"+code,Toast.LENGTH_SHORT).show();
listener.thanks(code);
button = (Button) view.findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO 自动生成的方法存根
textview.setText("加载方式改变了!");
}
});
return view;
}
}