起名Android Fragment之间的数据交流

Android Fragment Argument


确定性,多用Fragment能打更活的次序。
本文通过一个初步的事例,来论述fragment里头因Argument的数额交流。

 

简短说一下使贯彻的对象:
依照档涵盖两单移动与分级依附于当下有限独活动的鲜独Fragment。
简简单单起见,这里分别吗他们起名为:FirstActivityFirstFragmentSecondActivitySecondFragment
他俩之间的关系是:
星星单移动只有承担容纳(或者说托管)其相应的一定量独Fragment。而实际的显得与同用户交互则是因为Fragment负责。

页面中所有CSS代码,需要写副到<style></style>标签中。

为突出重点,这里只兑现最简便的功用:

style标签的type属性应该选text/css,但是type属性可以大概。

  • FirstFragment饱受显示一个ListView,这个ListView显示平差编程语言的称。
  • 当用户点击其中的item常,会越反到SecondActivity
  • 这时SecondActivityonCreate()道启动,在其中加载SecondFragment
  • 最后SecondFragmentTextView控件根据传过来的音展示相应的编程语言的名字。

如图:

1、CSS常因此选择器

CSS修改页面被的所有标签,必须凭选择器选中。
选择器中好形容多对CSS属性,用{}包裹:每个属性名与属于性值之间为此:分隔,多针对性能之间,必须用;分隔

 选择器{
 属性1:属性值1;
 属性2:属性值2;
 }


就是者意思

1-1、标签选择器

 写法:HTML标签名{}
打算:可以选中页面中,所有和选择器同名的HTML标签。

li{
    color: red;
    font-size: 24px;
}

 

 

在代码中实现时,FirstActivitySecondActivity居然都未需要相应的Layout资源文件。因为它唯一的图才是也Fragment提供容器,所以这边才需要在java代码中呢简单独Activity设置contentView即可:

1-2、类选择器(class选择器)

 写法:.class名{}
调用:在用调用选择器样式的价签上,使用class=”class名”调用选择器

预先级:class选择器>标签选择器,两只自冲突时,优先级赛的生效

 注意:如果用少单类名,用空格分隔

 

.first{
    color: blue;
}

 

 

 

setContentView(R.layout.common_fragment_container);

1-3、id选择器

写法:#id名{}
调用:需要调用样式的价签,起一个id=”id名”

 优先级:id选择器>class选择器

在意:一个页面中,不能够出现同名id

#one{
    background-color: yellow;
}

 

 


【class选择器与id选择器的界别】
1、写法不同:class选择器用.声明,id选择器用#声明
2、优先级不等:id选择器>class选择器
3、作用范围不一:class选择器可以频繁调用,id选择器只能用同一不好。

选择器的命名规范
 1、只能发出字母、数字、下划线、减号组合;
 2、开头不克是数字,也非可知是仅仅出一个减号

诚如起名要求发生语义,使用英文单词与数字之整合。


 

这名叫吧common_fragment_container的布局文件提供了一个FrameLayout来作为Fragment的容器:

1-4、通用选择器

 写法:*{}
企图:可以选中页面被所有的HTML标签
 优先级:最低!!!

 

*{
    color: orange;
}

 

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

1-5、并集选择器

写法:选择器1,选择器2,选择器3,……,选择器n{}
生效规则:多独选择器取并集,只要标签满足其中任意一个选择器,样式即可见效。

li,.first{
    color: red;
}

冲我们的构想,当用户点击FirstFragment遭受的ListView的item时,应该过反到SecondActivity
为此,我们在SecondActivity中定义静态方法:

1-6、交集选择器

 写法:选择器1选择器2……选择器n{} 所有选择器挨着,没有隔
生效规则:多只挑选器取交集,则须满足所有选择器的求,才会见效

li .first{

}
    private final static String 
    EXTRA_LANGUAGE_PICKED = "language_picked"; //键


//静态方法,提供从别的活动跳转到SecondActivity
public static Intent newIntent(Context packageContext, String languagePicked) {
        Intent intent = new Intent(packageContext, SecondActivity.class);
        intent.putExtra(EXTRA_LANGUAGE_PICKED, languagePicked);
        return intent;
    }

1-7、后代选择器

 写法:选择器1 选择器2 …… 选择器n{} 选择器之间空格分割
生效规则:只要满足,后一样选择器是眼前一个选择器的后生,即可见效。
(后代包括后、孙代、重孙代。。。)

浅地说话:只要后一个选择器,在前边一个选择器里面即可。

 

div span{

}

 

 

 

 

FirstFragment中ListView item的点击回调:

1-8、子代选择器

写法:选择器1>选择器2>……>选择器n{} 选择器之间因此>分隔
生效规则:必须满足,后一个选择器是前方一个选择器的直接子代,才会见效。(中间不克隔任何标签)

div>span{

}

[伪类选择器]
写法:伪类选择器, 在选择器后面用:分隔,紧接伪类状态;
 eg: .a:link .a:visited .a:hover
.a:active

 2、超链接的伪类状态:
 :link–未访问状态 :visited–已走访状态
 :hover–鼠标指上状态 :active–激活选定状态(鼠标点下未松)

 注意:当跨越链接多种伪类状态又有时时,必须随link–visited–hover–active的依次,
 否则会导致部分选择器不见效。

 3、input的伪类状态:
 :hover :focus–获得焦点状态 :active

专注:input的又状态又有,必须随上面的顺序。

4、其他标签,基本只用:hover状态。

 


public class FirstFragment extends Fragment {

    ListView mList;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_first, container, false);
        mList = v.findViewById(R.id.list);
//点击回调
        mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Resources resources = getResources();
//得到资源文件中定义的字符串数组
                String[] languages = 
resources.getStringArray(R.array.languages);
                String str = languages[position];
                Intent intent = SecondActivity.newIntent(
getActivity(), str);
//启动SecondActivity
                startActivity(intent);
            }
        });
        return v;

    }
}

 2、CSS的导入方式和优先级权重

2-1、优先级的权重
1、CSS生效的率先谱是:近者优先!
即,哪个选择器作用被最里层标签,则是选择器生效;
2、当选择器作用为一致层时,可以依据先级权重进行添加计算:
id选择器*100>class选择器*10>标签选择器*1

在意:并集选择器,相当给多个挑选器拆开写,所以,并集选择器的先行级无可知丰富

3、当选择器作用为平层,且优先级权重当时,写以末之挑选器 生效


 

2-2、引入CSS的老三种方式
1、行内样式表:直接在HTML标签中,使用style=””的主意引用;
<div style=”height: 100px;
“></div>
优点:使用灵活,优先级权重最高;
 缺点:不称w3c关于“内容及见”分离的要求;不便民样式复用;
 2、内部样式表:在<head></head>标签中,使用<style>标签包裹CSS代码;
 特点:一定水准达贯彻了HTML与CSS的分离,但是分别不敷彻底,没有法多页面并用样式。
 3、外部样式表:将CSS单独写副CSS文件被,并为HTML文件涉及。
亮点:彻底实现HTML与CSS的分手,符合W3C规范,有利于多页面复用统一样式。

2-2-1、导入CSS文件的少数种办法
1、在<head></head>标签中,使用link链接:

引入外部CSS样式表:
rel:选择stylesheet

type:选择text/css,可以大概

href:表示链接的CSS文件路径

 <link rel="stylesheet" type="text/css" href="CSS/02-CSS.css" />

2、在style标签中以@import导入

@import url("CSS/02-CSS.css");

[片种植导入方式的区别]

①link属于标准的HTML标签,而@import不是正规标签;
②link可以兼容所有小版本浏览器,而@import只在CSS2之后能用;
③link是将片个文本链接起来,起桥梁作用,而@import相当给将CSS文件复制到HTML文件被;
④link会在HTML文件边加载的经过遭到,边链接CSS文件;
 而@import会在HTML文件全部加载了后,再导入CSS文件

 

 


 

FirstFragment通过startActivity(intent)启动SecondActivity之后。
SecondActivity并无直跟用户交互。

3、CSS常因此文本属性

^CSS中的水彩代表方法^
①直接下颜色之单词表示:red green blue
②使颜色之十六上制丨表示:#ffffff
    六号数,两点滴分组,分别表示红、绿、蓝底配比;
③使用rgb(0~255,0~255,0~255)三各数,分别代表红、绿、蓝底配比;
④rgba():第四位数表示透明度。

width: 200px;
height: 200px;
background-color: rgb(255,255,255);

 


其要开的是:

3-1、CSS常因此文本属性

1、字体字号类:
①font-weight: 字体粗细, bold-加粗、normal-正常、lighter-细体
 也得以用100~900数值,400表示normal,700表示bold
②font-style: 字体样式。 italic-倾斜、normal-正常
③font-size:可以描绘如从单位px,也堪写%
200%意味着浏览器默认大小(16px)的蝇头加倍=32px
④font-family: 字体系列(字体族)。
>>>可以一直写字体名,也堪直接写字体系列名。
>>>常因此书:serif-衬线体 sans-serif-非衬线体
font-family可以吸收多单价值,用逗号分隔。表示先使用第一独,
>>>如果没这个书,依次向后采取。通常,最后一个值放字体系列名:
eg:fongt-family: “微软十分黑”,”宋体”,sans-serif;
⑤font缩写形式:
>>>顺序必须是font-weight font-style
font-size/line-height font-family
>>>不同性质之间因此空格分隔;
>>>font-size/line-height必须一组,用/分隔
>>>font-family多单字中,用逗号分隔
eg: font: bold丁italic 32px/50px “微软格外黑”,serif;

 

2、字体颜色
①color:字体颜色 可以是单词、十六进制、RGB等
②opacity:透明度,可选值0-1
[rgba和opacity的区别]
>>>RGBA本身可以设置颜色,而opacity必须配合其他颜料属性使用
>>>rgba就是叫眼前因素设置的水彩透明;
假设opacity,会吃眼前元素中的持有文字、背景、子元素都透明。
3、行距、对齐、其他类
①line-height:行愈。
可以写如从单位、可以一直写数字(表示默认行距的几乎加倍)
 可以写%(表示默认行距的百分比
>>>行高重要作用:让单行文字以div中垂直居中
安装行高等于div的莫大,及可被单行文字垂直居中。(非常 常用)
②text-algin:设置区域外的行级元素水平对齐方式;left、center、right
③letter-spacing: 字符间距,字与字之内的距离
④text-decoration: 文本修饰;
underline-下划线、overline-上划线、line-through-删除线、none

⑤overflow:设置过区域文字的显示方式。
>>>overflow: hidden; 超出区域的字吟唱不亮;
>>>overflow: scroll:无论文字多少,都见面展示档次垂直滚动条;
>>>overflow:
auto:自动,默认效果。文字多显示滚动条,文字少不显示滚动条
>>>可以使overflow-x和overflow-y单独修改两独方向的轮转条。
overflow-x: scroll;overflow-y: hidden;

⑥text-overflow:设置行末多余文字的显示方式;
>>>clip:多余文字裁剪掉 ellipsis: 多余文字显示省略号
>>>显示省略号特需配合white-space:nowrap;使用
>>>【重点】设置行末显示省略号(三行代码,缺一不可)

overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;

 

⑦white-space:nowrap;设置中文行末,不断推行显示

 ⑧text-indent:首行缩进。

⑨-webkit-text-stroke: 文字描边。
-webkit-代表挚友webkit内核的浏览器生效,常见的来chrome、safari

⑩text-shadow: 文字阴影,有四独属于性值,空格分隔
>>>水平阴影距离,正数:表示阴影右变,负数:表示阴影左移;(左负右正)
 >>>垂直阴影距离,正数:表示阴影下更换,负数:表示阴影上换;(上负下正)
 >>>阴影模糊距离,0表示阴影一点不模糊;
>>>阴影颜色;
缩写形式:text-shadow: 2px 2px
2px blue;

 

#div{
                font-weight: bold;
                font-style:italic;
                font-size: ;
                font-family: serif;
                font: bold italic 16px/50px "微软雅黑",serif;
                background-color: red;
                opacity: 0.5;
                line-height: 20px;
                text-align: center;
                letter-spacing: 5px;
                text-decoration: underline;
                overflow: auto;
                white-space: nowrap;
                text-overflow: ellipsis;
                text-indent: 20px;
                -webkit-text-stroke:0.5px blue;
                text-shadow: 2px 2px 2px blue;
            }

 


 

  • 以盛传的intent中的用户点击的编程语言名称取出来;
  • 接下来传被SecondFragment。由SecondFragment用她显得出来。

3-2、CSS常因此背景属性

1、background-color:背景色

2、background-image: 背景图。 使用url(“”)选择背景图片。
背景图和背景色同时有时时,背景图覆盖背景色。

3、background-repeat: 背景图的重新道,
 no-repeat:不平铺,repeat:平铺,repeat-x:沿x轴平铺,repeat-y:沿y轴平铺

 4、background-size:背景图的轻重缓急
[指定宽度 高度的写法]
>>>宽度高度的指定,可以写px,也得以写%(父容器宽高的百分比)
>>>当写少个属性时,分别表示宽度、高度
>>>当写一个性能时,表示宽度,高度将会 等较缩放

[别性能]
>>>contain:图片等比较缩放,直到宽或高中较充分的一端所安放100%说尽。
(可能导致比较短的单<100%,图片无法覆盖任何区域)
>>>cover:图片等比较缩放,直到宽或高中较小之一边缩放到100%了事。
(可能造成比较生之一面>100%,图片超出区域显示不都)

5、background-position: 背景图偏移量
>>>指定位置:left/center/right top/center/bottom
 当就写一个值时,另一个默认居中。
>>>指定坐标:两个特性分别表示 水平各移 垂直位移
①坐标的价,可以是px单位,也可是比例
②当写如从单位时:
水平方向:正数右移 负数左移;垂直方向:正数下移 负数上更换;
(左负右正 上负下正)
③当写%百分比常常:一般只能是正数。
意味着的凡,父容器去丢图片的厚实高,剩余空白区域之分布比例。
eg:background-position:30%; 水平方向去丢图片宽度,剩余区域3:7分

            #div2{
                width: 25px;
                height: 25px;
                /*background-color: yellow;*/
                background-image: url("img/icon.gif");
                white-space: nowrap;
                text-indent: 30px;
                line-height: 25px;
                background-position: -133px 0px;
            }
            #div3{
                width: 24px;
                height: 28px;
                background-image: url("img/icon.gif");
                white-space: nowrap;
                text-indent: 30px;
                background-position: 0px -170px;
            }
            #div4{
                width: 42px;
                height: 19px;
                background-image: url("img/icon.gif");
                text-indent: 9px;
                font-size: 14px;
                white-space: nowrap;
                line-height: 16px;
                background-position: 0px -30px;
            }

 

 


 

※这里还发生只稍知识点

list-style: 修改小黑点的体制;
none 去点多少黑点
url() 可以动用url导入一个稍稍图,作为列表的标识符号

float: 浮动  可以实现让块级元素,在一行中展示


 

SecondFragment想从SecondActivity那时取到多少来少数栽方式:

首先种植比较直接:

SecondFragment粗略粗暴地经过getActivity()法获得托管自己的SecondActivity
下一场通过getIntent()术赢得由FirstFragment中传过来的Intent对象;
末了抱中的extra信息。

这种措施则简易,但也时有发生代价。那就是破坏了包。使得SecondFragment未克叫复用。因为此时它们还负责了的工作。

次种办法比较复杂,但也再也灵敏:附加argument给Fragment:

要是附加argument给Fragment,需要调用Fragment.setArguments(Bundle)计。而且得是于fragment创建后,添加给Activity之前。
就此,一般的惯用做法是以Fragment类中补充加newInstance()静态方法。
经过是措施成功fragment实例以及Bundle对象的创始,
最后重复管argument放入bundle对象吃,并附加给fragment:

//SecondFragment
public class SecondFragment extends Fragment {

private static final String 
ARG_LANGUAGE_PICKED = "arg_language_picked";

    TextView mText;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_second, container, false);
        mText = v.findViewById(R.id.language_picked);
        String languagePicked 
= getArguments().getString(ARG_LANGUAGE_PICKED);
        mText.setText(languagePicked);
        return v;
    }

//newInstance()方法
    public static Fragment newInstance(String languagePicked) {
        Bundle bundle = new Bundle();
        bundle.putSerializable(ARG_LANGUAGE_PICKED, languagePicked);

        Fragment SecondFragmentInstance = new SecondFragment();
        SecondFragmentInstance.setArguments(bundle);
        return SecondFragmentInstance;
    }

}

兹我们有了这办法,又获了FirstFragment传的Intent对象中之extra信息languagePicked
我们唯有需要在SecondActivityonCreate()方法中,将languagePicked用作参数传入SecondFragment.newInstance()方法;
即可兑现,在SecondFragment创造之后,被补加给SecondActivity之前;
SecondFragment装载argument

//SecondActivity
public class SecondActivity extends AppCompatActivity {

private final static String 
EXTRA_LANGUAGE_PICKED = "language_picked";

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//使用通用的Fragment容器,
setContentView(R.layout.common_fragment_container);
//因为目前两个Activity的布局中
//其实都只需要一个用于容纳Fragment的frameLayout

        //要想在Activity中创建Fragment,先要得到FragmentManager
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);

        if (fragment == null) {
            //在firstActivity中通过Intent跳转到secondActivity,
            //SecondActivity创建之后,从传入的Intent中得到extra信息,
            //然后根据这个信息来创建secondFragment实例,
            //得到的信息将用来作为参数,传入secondFragment的newInstance()方法
            String languagePicked = 
getIntent().getStringExtra(EXTRA_LANGUAGE_PICKED);
//SecondFragment.newInstance()方法
            fragment = SecondFragment.newInstance(languagePicked);

            fragmentManager.beginTransaction()
                    .add(R.id.fragment_container, fragment)
                    .commit();
        }


    }

    //静态方法,提供从别的活动跳转到自身的Intent
    public static Intent newIntent(Context packageContext, String languagePicked) {
        Intent intent = new Intent(packageContext, SecondActivity.class);
        intent.putExtra(EXTRA_LANGUAGE_PICKED, languagePicked);
        return intent;
    }
}

即时等同做法的利落的处在就在:
SecondFragment尽管如此用取得数码,但是它不再亲自去
而是由托管它的Activity(此处是SecondActivity)来负担提供数据。
如此一来,就落实了SecondActivity的复用。
假使现在发生一个ThirdActivity呢想要托管SecondFragment,那其如果能够提供数据(类似于SecondActivity提供的languagePicked),那它们就同可其onCreate()方法倍受作出类似之兑现。
— end —

水平有限,难免纰漏,如发荒唐,欢迎指正。
各位共勉:)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图