Fragment介绍
Fragment英文是碎片的意思是为了方便管理Activity
Fragment有自己的生命周期 也可以添加替换删除显示和隐藏 但是Fragment
只能显示于Activity 一个Activity可以有多个Fragment 一个Fragment也
可以被多个Activity使用
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对象
Fragment静态显示
静态显示直接在布局文件声明(写死了不能经行改变)
<fragment
android:id="@+id/lll"
//直接点出来继承 Fragment的类
android:name="com.example.fragment.bottomfrogment"
android:layout_width="match_parent"
android:layout_height="match_parent"
></fragment>
静态显示不做过多的说明因为是在布局文件里面直接显示出来
在继承Fragment里面的重写oncreateview方法里面直接返回view用来
类似动态显示 (oncreateview请看动态显示)
Fragment动态显示(包含EventBus 和Arguments传值)
动态显示十分灵活可以进行替换显示隐藏等一系列的操作
案例展示
(EventBus使用前请导依赖 implementation ‘org.greenrobot:eventbus:3.1.1’)
用两个Fragment来做这个案例 两个碎片分为上下两部分 上面为Listview 下面为Textview
里面还涉及到了EventBus传值和Argument传值
布局文件
//Activity布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
//上下两个线性布局用来给Fragment经行占位
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:id="@+id/ll"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:id="@+id/l2"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
</LinearLayout>
</RelativeLayout>
上面Fragment布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rr"
android:background="#599"
android:layout_width="match_parent" android:layout_height="match_parent">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</RelativeLayout>
下面Fragment布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
LisetView布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img"
android:layout_width="150dp"
android:layout_height="150dp" />'
<TextView
android:id="@+id/tvtv"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
</RelativeLayout>
Activity代码
package com.example.day12work;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
FragmentManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//用来管理Fragment的管理者
manager = getSupportFragmentManager();
//开启事物
FragmentTransaction fragmentTransaction = manager.beginTransaction();
Top top = new Top();
Bottom bottom=new Bottom();
//给Activity添加Fragment
fragmentTransaction.add(R.id.ll,top);
fragmentTransaction.add(R.id.l2,bottom);
//提交
fragmentTransaction.commit();
}
}
上面TopFragment代码
package com.example.day12work;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import org.greenrobot.eventbus.EventBus;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Top extends Fragment {
ArrayList<Map<String, Object>> arrayList = new ArrayList<>();
Mybaseadpter mybaseadpter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
for (int i=0;i<12;i++){
if(i==0){
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.demaxiya);
Map<String, Object> map = new HashMap<>();
map.put("str", "德玛西亚");
map.put("tupian", bitmap);
arrayList.add(map);
}else if(i==1){
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.nuokesasi);
Map<String, Object> map = new HashMap<>();
map.put("str", "诺克萨斯");
map.put("tupian", bitmap1);
arrayList.add(map);
}else if(i==2){
Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.anouniya);
Map<String, Object> map = new HashMap<>();
map.put("str", "艾欧尼亚");
map.put("tupian", bitmap2);
arrayList.add(map);
}else if(i==3){
Bitmap bitmap3 = BitmapFactory.decodeResource(getResources(), R.drawable.zuan);
Map<String, Object> map = new HashMap<>();
map.put("str", "祖安");
map.put("tupian", bitmap3);
arrayList.add(map);
}else if(i==4){
Bitmap bitmap4 = BitmapFactory.decodeResource(getResources(), R.drawable.piertewufu);
Map<String, Object> map = new HashMap<>();
map.put("str", "皮尔特沃夫");
map.put("tupian", bitmap4);
arrayList.add(map);
}else if(i==5){
Bitmap bitmap5 = BitmapFactory.decodeResource(getResources(), R.drawable.bierjiwote);
Map<String, Object> map = new HashMap<>();
map.put("str", "比尔吉沃特");
map.put("tupian", bitmap5);
arrayList.add(map);
}else if(i==6){
Bitmap bitmap6 = BitmapFactory.decodeResource(getResources(), R.drawable.jushenfeng);
Map<String, Object> map = new HashMap<>();
map.put("str", "巨神峰");
map.put("tupian", bitmap6);
arrayList.add(map);
}else if(i==7){
Bitmap bitmap7 = BitmapFactory.decodeResource(getResources(), R.drawable.debangercheng);
Map<String, Object> map = new HashMap<>();
map.put("str", "德邦尔城");
map.put("tupian", bitmap7);
arrayList.add(map);
}else if(i==8){
Bitmap bitmap8 = BitmapFactory.decodeResource(getResources(), R.drawable.anningdao);
Map<String, Object> map = new HashMap<>();
map.put("str", "暗影岛");
map.put("tupian", bitmap8);
arrayList.add(map);
}else if(i==9){
Bitmap bitmap9 = BitmapFactory.decodeResource(getResources(), R.drawable.shuruima);
Map<String, Object> map = new HashMap<>();
map.put("str", "恕瑞玛");
map.put("tupian", bitmap9);
arrayList.add(map);
}else if(i==10){
Bitmap bitmap10 = BitmapFactory.decodeResource(getResources(), R.drawable.fuleierzhuode);
Map<String, Object> map = new HashMap<>();
map.put("str", "弗雷尔卓德");
map.put("tupian", bitmap10);
arrayList.add(map);
}else if(i==11){
Bitmap bitmap11 = BitmapFactory.decodeResource(getResources(), R.drawable.xukong);
Map<String, Object> map = new HashMap<>();
map.put("str", "虚空之地");
map.put("tupian", bitmap11);
arrayList.add(map);
}
}
mybaseadpter = new Mybaseadpter(getActivity(), arrayList);
View view = inflater.inflate(R.layout.sim, container, false);
ListView lv = view.findViewById(R.id.lv);
lv.setAdapter(mybaseadpter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.e("######", "onItemClick: " +position);
//EventBus传值
EventBus.getDefault().postSticky(position);
//注释了的为Arguments传值(不方便代码多 用EventBus好一些)
// FragmentManager manager = getActivity().getSupportFragmentManager();
// FragmentTransaction fragmentTransaction = manager.beginTransaction();
// Bottom bottom=new Bottom();
// fragmentTransaction.add(R.id.l2,bottom);
// Bundle bundle = new Bundle();
// bundle.putString("name",position+"");
// bottom.setArguments(bundle);
// fragmentTransaction.replace(R.id.l2,bottom);
// fragmentTransaction.commit();
}
});
return view;
}
}
Bottom下面Fragment的代码
package com.example.day12work;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class Bottom extends Fragment {
TextView textView;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//EventBus需要在接收方注册
EventBus.getDefault().register(this);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.simm, container, false);
textView = view.findViewById(R.id.tv);
//注释的为rguments收值
// Bundle bundle = getArguments();
// String name = bundle.getString("name");
// textView.setText(name);
return view;
}
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void getshuju(Integer i) {
if (i == 0) {
textView.setText("德玛西亚是一个实力雄厚、奉公守法的国家,有着功勋卓著的光荣军史。这里非常重视正义、荣耀、职责的意识形态,这里的人民为此感到强烈自豪。德玛西亚是一个自给自足的农耕社会,肥沃的耕地、大片未砍伐的森林、以及矿产储量丰富的山脉遍及全境。德玛西亚继承着排外、封闭的传统,一部分原因是蛮族、盗匪、以及其他以侵略为本性的文明对其频繁地骚扰。有些人认为德玛西亚的黄金时代已经过去,除非它能够适应新时代的变化——很多人都认定绝无可能——否则它将不可避免地走向衰落。虽然存在争议,但德玛西亚依然是瓦洛兰大陆上最具统治性的政治势力之一,号称拥有整个符文之地上最为强悍精锐、训练有素的军队。");
} else if (i == 11) {
textView.setText("伴着宇宙的诞生,一声尖叫宣示了虚空的开端。虚空代表着境界彼端某种不可知的虚无。它是一种不知餍足的饥饿,经过永世的等待,直到它的主人,神秘的监视者们发号施令,迎来最终的万物消解。\n" +
"\n" +
"凡人被这种力量触碰,就等同于窥到了永恒的虚幻。同时遭受的剧痛折磨足以击溃最强大的意志。虚空领域中栖息着许多造物,通常只有很原始的认知能力,因为它们只被赋予一个目标——为符文之地带去彻底的湮灭");
} else if (i == 1) {
textView.setText("诺克萨斯是一个威名震天的强大帝国。在诺克萨斯境外的人眼中,它拥兵自重、血腥野蛮、欲壑难填,但对于那些看透它好战外表的人来说,这里的社会氛围实际上超乎寻常地包容。人民的所有特长和天赋都会得到尊重和受到培养的机会。诺克萨斯人曾经是一群残暴的掠夺者,他们占领了一座古城,并将其建成了现在的帝国中心。当时的诺克萨斯面临着来自各方的威胁,所以他们与所有敌人都激烈交锋,睚眦必报,不胜不归,最终让帝国的版图连年扩张。这一段艰难求生的历史让诺克萨斯人从骨子里感到骄傲自豪,也因此重视力量胜过一切。当然,力量可以通过许多不同的形式表现。无论社会立场、身世背景、祖国故乡和个人财富如何,任何人都可能在诺克萨斯获得权力、地位、和尊敬,只要他们能够表现出必要的能力。");
} else if (i == 2) {
textView.setText("艾欧尼亚的土地上充盈着未遭破坏的自然之美和原生魔法。这座庞大的岛屿上四散着人类的定居点,这是一群充满灵性的人,追求着平静和谐、与世无争的生活。艾欧尼亚境内存在许多教派和社团,每一派都遵循各自(常常是彼此冲突的)的教义与理念。艾欧尼亚自给自足、闭关锁国,在数世纪以来瓦洛兰大陆上的多次战争中大多保持中立姿态——直到诺克萨斯的入侵。这次野蛮的侵略强迫艾欧尼亚重新审视自己在这个世界上的位置。它会采取怎样的措施、它未来的路何去何从,一切都未可预知。但无论艾欧尼亚的选择如何,符文之地的命运都必将因此而改变。");
} else if (i == 3) {
textView.setText("祖安是一片庞大的地下城区,坐落在皮尔特沃夫周边蜿蜒的沟壑与峡谷之下。交错层叠、腐蚀老化的排烟管网中泄露出各色烟尘,将上方射下来的光线过滤成诡异的颜色,在祖安工坊的有色玻璃之间交叉反射。祖安和皮尔特沃夫曾经是联合统一的,但现在却分裂开来,各成一派。虽然祖安一直都笼罩在雾霾遮蔽的暮色中,但这里的繁华热闹却不让分毫,这的居民包罗万象,文化异彩纷呈。皮尔特沃夫的财富也带动了祖安的发展,让它成为了头顶那座城市的黑暗镜面。许多运往皮尔特沃夫的商品最后都辗转流入了祖安的黑市,有些海克斯科技发明家可能会觉得地上之城给他们施加的限制太严格,他们中的许多人都会发现自己的危险研究在祖安颇受欢迎。对于不稳定技术和鲁莽产业的放纵式开发,让整个祖安的大片地区都遭到污染,生存条件也变得越来越危险。剧毒的废水淤积在城市的下游地区,但即使是在这里,人们依然能够设法生存并繁荣灿烂。");
} else if (i == 4) {
textView.setText("皮尔特沃夫是一座繁荣进步的城市,自身实力与影响力都在冉冉崛起。这里是瓦洛兰大陆的文化中心,艺术、工艺、贸易与创新携手并进。它的实力并非来自军事力量,而是来自广泛的贸易合作和超前于时代的思维。皮尔特沃夫坐落在毗邻祖安城区的悬崖之上,俯视着大海,一批批船队穿过它巨大的海湾峡口,满载着来自世界各地的商品。海运贸易带来的财富曾经为城市的成长带来前所未有的推动作用,皮尔特沃夫曾经——而且一如既往地进行着革命创新,造就了一座财富与梦想之城。初创商会资助了各项令人惊奇的新领域开发项目:宏大的艺术杂烩、冷门的海克斯科技研究,还有象征他们实力的纪念碑式建筑。随着越来越多发明家如饥似渴地追寻着前沿的海克斯科技知识,皮尔特沃夫已经成为了吸引全世界能工巧匠的天然磁石。");
} else if (i == 5) {
textView.setText("比尔吉沃特是走私贩、劫掠者和不义之徒的避难港湾。在这里,富可敌国或是家破人亡都只在转瞬之间。对于那些逃避审判、债务和迫害的人,这个城市能让他们重获新生,因为在比尔吉沃特的蜿蜒街路上,没人会在乎你的过去。这里是不同文化、种族、和信仰的大熔炉,无时不在蠢蠢欲动。\n" +
"\n" +
"虽然比尔吉沃特是极其危险的地方,但这里也充满了机遇,不受到任何政府、法令、和道德的制约束缚。无论是来路不正的海克斯科技,还是当地黑帮的俯首听命,只要你出得起钱,一概唾手可得。话虽如此,每当拂晓之际,粗心大意之人都会漂在港湾中,钱袋空空,喉头见血。");
} else if (i == 6) {
textView.setText("巨神峰是符文大陆的世界之巅,这座高耸入云的山峰完全由坚硬的山石构成,终年沐浴着烈日阳光,永远俯视着脚下的群山,恢弘磅礴举世无双。巨神峰坐落于远离文明的无人之地,对于许多人都是遥不可及的,只有那些意志最坚决的追寻者有幸一睹尊容。许多传奇故事都与巨神峰有关,并且,和其他神秘地区一样,巨神峰也是一座吸引着梦想家、疯人和冒险者的璀璨信标。有些勇敢的人会尝试攀上这座绝顶高山,可能是为了寻找智慧和启迪,可能是为了追求荣耀或者灵魂深处某种会当凌绝顶的渴求。登顶并非绝无可能,并且那些在登顶后存活下来的极少数人也几乎不会透露他们看到了什么。有些回来的人眼中满是迷惑和空洞,而另一些则变得面目全非,被选为星灵,充满了一种超凡且非人的能量,并且被赋予了只有少数凡人才能理解的命运。");
} else if (i == 7) {
textView.setText("约德尔人的故乡究竟在何处?对于这个问题人们众说纷纭,不过有一些凡人声称自己穿过了无形的传送门,进入了超越物质领域的奇异魔法世界。他们都描述了一个魔法奔放的地方,鲁莽蛮横的人会被无数的奇观带入歧途,最后迷失在梦境中,永远无法返回……\n" +
"\n" +
"在班德尔城,任何约德尔人以外的种族都会感到自己的全部感官得到了强化。城中所见无不色彩斑斓,食物与水的味道让人经年沉醉——只要尝过一次,就终身难忘。这里日光溶溶,春水不休,每一株植物都会结出累累硕果。或许这些描述中有一部分事实,或许全都是假的——因为没有任何两个讲述者能够对所见所闻达成一致。\n" +
"\n" +
"只有一件事可以肯定,那就是班德尔城和里面的居民都具有某种超脱时间的属性,这或许可以解释为什么从那里回来的凡人全都像是一夜苍老了许多年岁,更多人则根本是一去不复返。");
} else if (i == 8) {
textView.setText("现在被称为暗影岛的这片土地曾经是环境优美的岛屿,但却因一场魔法灾难的毁灭打击而彻底改头换面。现在,黑雾无时无刻萦绕着这块岛屿,土地本身也遭到邪术的污染和腐化。任何活物如果来到岛上,生命力都会渐渐流逝,继而引来永不知足、猎食成性的死灵。那些在黑雾中殒命的灵魂会遭受诅咒,永世栖息于这片充满哀怨的土地。更可怕的是,暗影岛的力量每一年都在逐渐变强,不死的残魂正在扩张它们的侵扰范围,在整个符文之地收割着生者的希望与灵魂。");
} else if (i == 9) {
textView.setText("恕瑞玛帝国曾经是一个繁荣昌盛的文明,坐落于一片广袤的沙漠之中。在发展与繁荣的时代过后,闪亮的都城分崩离析,整个帝国也化为废墟。后来的几千年间,恕瑞玛的昔日荣光从历史故事变成了神话传说和宗教信仰,流传在四散漂泊的幸存者后裔中。\n" +
"\n" +
"大多数生活在恕瑞玛的游牧居民都必须在这片无情的土地上寻找基本的生存物资。有些守在少数几片绿洲周围的小型哨站里。其余则靠着盗猎帝国废墟下埋藏的财富,或是承接雇佣兵契约为生。为了活命狗苟蝇营,最后葬身于黄沙之中。现在,各个部族开始蠢蠢欲动,因为沙漠的中心传来了轻语:恕瑞玛之城已经再次崛起。");
} else if (i == 10) {
textView.setText("弗雷尔卓德是一片环境恶劣、严酷无情的土地。这里的人们全都充满自豪并极具独立意识。他们个个都是天生的武士,强盗文化源远流长。虽然弗雷尔卓德境内存在着许多不同的部族,但他们之间的纷争被划分为三个阵营,而这场内战的结果将决定所有部族的未来。一个阵营毫不动摇地坚持着他们逆境求生所必备的传统;另一个阵营追随着团结统一的梦想,追随一位年轻人的理想主张;第三个阵营则跪倒在一位神秘女巫的强大魔力之下,顶礼膜拜。");
}
}
@Override
public void onDestroy() {
super.onDestroy();
//EventBus需要在结束时解绑接触注册
EventBus.getDefault().unregister(this);
}
}
自定义适配器
package com.example.day12work;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Map;
public class Mybaseadpter extends BaseAdapter {
Context context;
ArrayList<Map<String, Object>> arrayList;
public Mybaseadpter(Context context, ArrayList<Map<String, Object>> arrayList) {
this.context = context;
this.arrayList = arrayList;
}
@Override
public int getCount() {
return arrayList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHodler viewHodler;
if (convertView == null) {
viewHodler=new ViewHodler();
convertView=View.inflate(context,R.layout.ist,null);
viewHodler.imageView=convertView.findViewById(R.id.img);
viewHodler.textView=convertView.findViewById(R.id.tvtv);
convertView.setTag(viewHodler);
}else{
viewHodler = (ViewHodler) convertView.getTag();
}
if(viewHodler!=null){
Map<String, Object> map = arrayList.get(position);
viewHodler.textView.setText(map.get("str").toString());
viewHodler.imageView.setImageBitmap((Bitmap)map.get("tupian"));
}
return convertView;
}
class ViewHodler {
ImageView imageView;
TextView textView;
}
}