Fragment
Fragment,英文碎片的意思,早期应用在平板设计中
如何实现Fragment
步骤1:创建Fragment对象:(右击新建Fragment一步搞定)
(1).定义一个类, 继承Fragment
(2).重写父类的方法onCreateView()
(3).在onCreateView()方法中, 为Fragment 创建UI界面
步骤2:显示Fragment
(1)静态显示 Fragment – 布局页面中直接写
a.在Activity 对应的页面中, 通过标签 引入
b.在标签中, 必须要指定id属性, 用来标识Fragment 的唯一性 c.在标签中,必须要有name属性, 用来标识当前显示那个Fragment
(2)动态显示 Fragment — 在Activity.java 代码中显示
a.在Activity 对应的页面中, 需要通过布局容器占位
b.在Activity 代码中得到Fragment 管理器对象
c.得到Fragment 事务管理 添加、移除、显示、隐藏、替换Fragment 提交事务
四.Fragment的生命周期
1.onAttach() :Fragment与Activity有联系。
2.onCreate():创建Fragment
3.onCreateView():创建Fragment视图,尽量不要做耗时操作
4.onActivityCreated():当Activity中的onCreate方法执行完后调用。
5.onStart():启动。
6.onResume():可见
7.onPause():不可见
8.onStop():停止。
9. onDestroyView() :销毁Fragment视图
10.onDestroy():销毁fragment对象
11.onDetach():Fragment和Activity解除关联的时候调用
Fragment的回退栈
Fragment2 f2 = new Fragment2();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.replace(R.id.fl, f2);
//将当前的事务添加到了回退栈
tx.addToBackStack(null);
tx.commit();
Fragment之间的传值:使用EventBus
举例:fragment1页面有一个编辑框,fragment2页面有一个按钮和一个编辑框,当点击按钮的时候,向fragment1发送数据并展现在fragment1中。
发送方:fragment2
EventBus.getDefault().post(数据);
接受方:fragment1
onCreate :注册
onDestory:解除注册
@subscribe定义方法接受数据
/**
* 如何实现微信切换
* 1.activity布局:FrameLayout(放fragment容器)
* 2.创建fragment类:自定义类继承Fragment 重写onCreateView方法 加载布局
* 3.点击按钮切换
getSupportFragmentManager().beginTransaction().replace(R.id.frame,fragment1).commit();
*
* */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
RadioButton radioButton1,radioButton2,radioButton3;
Myframe1 myframe1;
Myframe2 myframe2;
Myframe3 myframe3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
radioButton1=findViewById(R.id.rb1);
radioButton2=findViewById(R.id.rb2);
radioButton3=findViewById(R.id.rb3);
myframe1=new Myframe1();
myframe2=new Myframe2();
myframe3=new Myframe3();
radioButton1.setOnClickListener(this);
radioButton2.setOnClickListener(this);
radioButton3.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.rb1:
//获得Fragment管理者
FragmentManager supportFragmentManager = getSupportFragmentManager();
//开启事务
FragmentTransaction transaction = supportFragmentManager.beginTransaction();
//操作
transaction.replace(R.id.frame,myframe1);//参数一 fragmelaypout容器
//提交
transaction.addToBackStack("shouye");
transaction.commit();
break;
case R.id.rb2:
getSupportFragmentManager().beginTransaction().replace(R.id.frame,myframe2).addToBackStack("message").commit();
break;
case R.id.rb3:
getSupportFragmentManager().beginTransaction().replace(R.id.frame,myframe3).addToBackStack("my").commit();
break;
}
}
}
public class Myframe1 extends Fragment {
Button button,button1;
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frame1_layout,null);
button=view.findViewById(R.id.btn);
button1=view.findViewById(R.id.btn2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message message = Message.obtain();
message.what=1000;
message.obj="来咯来咯他们真的来咯";
Myframe3.handler.sendMessage(message);
}
});
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().postSticky("爱情有时很残忍");
}
});
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onDestroyView() {
super.onDestroyView();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onDetach() {
super.onDetach();
}
}
public class Myframe2 extends Fragment {
TextView textView;
String string;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frame2_layout,null);
textView=view.findViewById(R.id.tv1);
textView.setText(string);
EventBus.getDefault().register(this);
return view;
}
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void back(String message){
string=message;
EventBus.getDefault().removeAllStickyEvents();
}
@Override
public void onDestroyView() {
super.onDestroyView();
EventBus.getDefault().unregister(this);
}
}
public class Myframe3 extends Fragment {
public static Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==1000){
s=(String) msg.obj;
}
}
};
static String s;
static TextView textView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frame3_layout,null);
textView=view.findViewById(R.id.tv);
textView.setText(s);
return view;
}
}
ViewPager
android.support.v4.view.ViewPager
特点:
继承于ViewGroup, 是一个容器, 添加一系列的View
数据填充需要通过PagerAdapter(向导页)
ViewPager 通常和Fragment一起使用FragmentPagerAdapter(底部导航栏)
.自动轮播
2.滑动小圆点跟着走
3.最后一页显示立即体验按钮
4.最后一页,右上角倒计时
5.第一次打开有向导页,当第2次打开没有向导页,直接是首页
三.思路:1个ViewPager+4个View+1个PagerAdapter
1.容器:ViewPager------>Listview
2.数据:ArrayList<View.
3.适配器:PagerAdapter-------->BaseAdapter
重写的方法:
(1)getCount():返回数据源的总数量
(2)isViewFromObject() 判断当前显示的View 和instantiateItem() 返回的页面是否一致
(3)instantiateItem() 根据下标, 创建ViewPager中显示的页面
(4)destroyItem() 根据下标, 移除ViewPager 中的页面
public class MainActivity extends AppCompatActivity {
RadioButton radioButton1,radioButton2,radioButton3;
ViewPager viewPager;
TextView textView;
ArrayList<View> arrayList=new ArrayList<>();
MyPager myPager;
int count =0;
Timer timer;
Timer timer2;
int daojishi=10;
@SuppressLint("HandlerLeak")
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==101){
//如果是最后一页,直接取消定时器
if (count==arrayList.size()){
timer.cancel();
}
viewPager.setCurrentItem(count++);
}else if (msg.what==102){
textView.setText("倒计时:"+daojishi--);
if (daojishi==0){
Toast.makeText(MainActivity.this, "走你", Toast.LENGTH_SHORT).show();
timer2.cancel();
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager=findViewById(R.id.pager);
radioButton1=findViewById(R.id.rb1);
radioButton2=findViewById(R.id.rb2);
radioButton3=findViewById(R.id.rb3);
textView=findViewById(R.id.tv);
ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.b);
arrayList.add(imageView);
ImageView imageView1 = new ImageView(this);
imageView1.setImageResource(R.drawable.a);
arrayList.add(imageView1);
ImageView imageView2 = new ImageView(this);
imageView2.setImageResource(R.drawable.c);
arrayList.add(imageView2);
myPager=new MyPager(arrayList);
myPager.notifyDataSetChanged();
viewPager.setAdapter(myPager);
timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(101);//发送一个空的消息
}
},0,1000);
timer2=new Timer();
timer2.schedule(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(102);//发送一个空的消息
}
},0,1000);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
//滑动前
@Override
public void onPageScrolled(int i, float v, int i1) {
}
//滑动后
@Override
public void onPageSelected(int i) {
if (i==0){
radioButton1.setChecked(true);
}else if (i==1){
radioButton2.setChecked(true);
}else if (i==2){
radioButton3.setChecked(true);
}
}
//滑动状态
@Override
public void onPageScrollStateChanged(int i) {
}
});
}
}
public class MyPager extends PagerAdapter {
ArrayList<View> arrayList;
public MyPager(ArrayList<View> arrayList) {
this.arrayList = arrayList;
}
@Override
public int getCount() {
return arrayList.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view==o;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(arrayList.get(position));
return arrayList.get(position);
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(arrayList.get(position));
}
}