碎片最佳实践-简易版的新闻应用

先上成果图

<*m* src="http://ww4.s**a*m*.c*/lar*e/85184d39*w1ez1dyb*mszj20ec0*fq4b.jp*" alt="小屏幕" />小屏幕

<*m* src="http://ww3.s**a*m*.c*/lar*e/85184d39*w1ez1e1sf9boj20e70m*76*.jp*" alt="点击后" />点击后
<*m* src="http://ww1.s**a*m*.c*/lar*e/85184d39*w1ez1e2eca23j20*70d40t*.jp*" alt="大屏幕Nexus7" />大屏幕Nexus7
<*m* src="http://ww1.s**a*m*.c*/lar*e/85184d39*w1ez1e3asyf9j20*e0ef**8.jp*" alt="点击后" />点击后

主体思想

写两个act*v*ty_ma**布局文件,一个在layout文件夹下,另一个置于layout-sw600dp下。前者只有一个t*tleFra*me*t碎片,后者还会加上co*te*tFra*me*t碎片,系统根据设备大小加载不同的act*v*ty_ma**。但是也由于两种布局下都包含t*tleFra*me*t碎片,在点击L*stV*ew时,面临两种选择。其一,若为单页模式,就跳转到包含内容布局的活动。若为双页,获取右碎片实例(*etFra*me*tMa*a*er.f**dFra*me*tById),refresh下即可。至于如何判断当前处于单页还是双页,两个act*v*ty_ma**不同的就是大屏幕的多了一个右侧碎片,给这个碎片加上*d,在t*tleFra*me*t中的o*Act*v*tyCreated(活动加载完成才执行的函数) 用*etAct*v*ty().f**dV*ewById(右侧碎片的*d)来判断。*etAct*v*ty是获取与该碎片相关联的活动

遇到的问题

    继承自a*dro*d.app.Fra*me*t的碎片类,里面的o*Attach(Co*text co*text) 在A*I23中
    不会被调用,导致里面的初始化操作不会执行

解决办法: 将o*Attach()中代码转移进o*CreateV*ew()

    代码无异常,运行时抛出Act*v*tyNotFou*d异常

解决办法:在A*dro*dMa**fest下注册活动

上代码

代码结构

<*m* src="http://ww3.s**a*m*.c*/lar*e/85184d39*w1ez1f*2ousmj208y097*mt.jp*" alt="结构" />结构

News.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
publ*c class News {

pr*vate Str*** t*tle;
pr*vate Str*** co*te*t;

publ*c vo*d setT*tle(Str*** t*tle) {
th*s.t*tle = t*tle;
}

publ*c vo*d setCo*te*t(Str*** co*te*t) {
th*s.co*te*t = co*te*t;
}

publ*c Str*** *etT*tle() {
retur* t*tle;
}

publ*c Str*** *etCo*te*t() {
retur* co*te*t;
}
}

NewsAdapter.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
publ*c class NewsAdapter exte*ds ArrayAdapter<News&*t;{

pr*vate **t resourceId;

pr*vate V*ew v*ew;

pr*vate V*ewHolder v*ewHolder;

publ*c NewsAdapter(Co*text co*text,**t textV*ewResourceId, L*st<News&*t; objects) {
super(co*text, textV*ewResourceId, objects);
resourceId = textV*ewResourceId;
}

@Overr*de
publ*c V*ew *etV*ew(**t pos*t*o*, V*ew co*vertV*ew, V*ewGroup pare*t) {
News *ews = *etItem(pos*t*o*);
*f(co*vertV*ew == *ull){
v*ew = LayoutI*flater.from(*etCo*text()).**flate(resourceId,*ull);
v*ewHolder = *ew V*ewHolder();
v*ewHolder.t*tleTextV*ew = (TextV*ew) v*ew.f**dV*ewById(R.*d.t*tle_*tem_tv);
v*ew.setTa*(v*ewHolder);
} else {
v*ew = co*vertV*ew;
v*ewHolder = (V*ewHolder) v*ew.*etTa*();
}

v*ewHolder.t*tleTextV*ew.setText(*ews.*etT*tle());
retur* v*ew;
}

class V*ewHolder{
TextV*ew t*tleTextV*ew;
}
}

NewsCo*te*tFra*me*t.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
publ*c class NewsCo*te*tFra*me*t exte*ds Fra*me*t{

pr*vate V*ew v*ew;
@Nullable
@Overr*de
publ*c V*ew o*CreateV*ew(LayoutI*flater **flater, V*ewGroup co*ta**er, Bu*dle savedI*sta*ceState) {
v*ew = **flater.**flate(R.layout.co*te*t_fra*,co*ta**er,false);
retur* v*ew;
}

publ*c vo*d refresh(Str*** t*tle, Str*** co*te*t){
L**earLayout l**earLayout = (L**earLayout) v*ew.f**dV*ewById(R.*d.co*te*t);
l**earLayout.setV*s*b*l*ty(V*ew.VISIBLE);
TextV*ew t*tle_tv = (TextV*ew) v*ew.f**dV*ewById(R.*d.tv_t*tle);
TextV*ew co*te*t_tv = (TextV*ew) v*ew.f**dV*ewById(R.*d.tv_co*te*t);
t*tle_tv.setText(t*tle);
co*te*t_tv.setText(co*te*t);
}

}

NewsT*tleFra*me*t.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
publ*c class NewsT*tleFra*me*t exte*ds Fra*me*t *mpleme*ts AdapterV*ew.O*ItemCl*ckL*ste*er{

pr*vate L*st<News&*t; *ewsL*st = *ew ArrayL*st<News&*t;();

pr*vate Boolea* two*a*e;
@Nullable
@Overr*de
publ*c V*ew o*CreateV*ew(LayoutI*flater **flater, V*ewGroup co*ta**er, Bu*dle savedI*sta*ceState) {
***tData();
NewsAdapter adapter = *ew NewsAdapter(*etAct*v*ty(),R.layout.t*tle_*tem,*ewsL*st);
V*ew v*ew = **flater.**flate(R.layout.*ewst*tle_fra*,co*ta**er,false);
L*stV*ew NewsT*tleL*stV*ew = (L*stV*ew) v*ew.f**dV*ewById(R.*d.t*tle_l*st_v*ew);
NewsT*tleL*stV*ew.setAdapter(adapter);
NewsT*tleL*stV*ew.setO*ItemCl*ckL*ste*er(th*s);
retur* v*ew;
}

publ*c vo*d ***tData(){
News *ews1 = *ew News();
*ews1.setT*tle("Goo*le w*ll accept Gaby to be the CEO");
*ews1.setCo*te*t("To reduce hous*** **ve*tor*es, more m**ra*t rural workers should be *ssued w*th urba*-res*de*cy perm*ts, wh*ch w*ll allow them to purchase hous*** ** c*t*es, accord*** to a stateme*t released after a meet*** of the *ol*t*cal Bureau of the C*C Ce*tral Comm*ttee pres*ded over by *res*de*t ** ***p***.");
*ewsL*st.add(*ews1);

News *ews2 = *ew News();
*ews2.setT*tle("H**h-tech products at L**ht of the I*ter*et Expo Ba*du 'self-dr*v***' cars to h*t roads ** 3 years");
*ews2.setCo*te*t("Ba*du **d*cated that the *ew bus**ess u**t w*ll focus o* research a*d developme*t of self-dr*v*** tech*olo*y as well as bu*ld the **dustr*al cha** to support the product*o* of *ext-*e*erat*o* cars.");
*ewsL*st.add(*ews2);

News *ews3 = *ew News();
*ews3.setCo*te*t("I* the future, veh*cles could be self-dr*ve* a*d co*trolled by smart systems. We have set a tar*et to commerc*al*ze our operat*o*s ** the *ext three years," he sa*d, add*** that ** 10 years, about 80 perce*t of the *ewly produced veh*cles would be equ*pped w*th self-dr*v*** tech*olo**es");
*ews3.setT*tle("Reaso*able eco*omom*c *rowth rate tar*eted");
*ewsL*st.add(*ews3);
}

@Overr*de
publ*c vo*d o*Act*v*tyCreated(Bu*dle savedI*sta*ceState) {
super.o*Act*v*tyCreated(savedI*sta*ceState);
*f(*etAct*v*ty().f**dV*ewById(R.*d.co*te*t_fra*_layout) == *ull){
two*a*e = false;
} else{
two*a*e = true;
}
}

@Overr*de
publ*c vo*d o*ItemCl*ck(AdapterV*ew<?&*t; pare*t, V*ew v*ew, **t pos*t*o*, lo** *d) {
News *ews = *ewsL*st.*et(pos*t*o*);
*f(two*a*e){
NewsCo*te*tFra*me*t *ewsCo*te*tFra*me*t = (NewsCo*te*tFra*me*t) *etFra*me*tMa*a*er().f**dFra*me*tById(R.*d.co*te*t_fra*_layout);
*ewsCo*te*tFra*me*t.refresh(*ews.*etT*tle(), *ews.*etCo*te*t());
} else{
co*te*tAct*v*ty.act*o*Start(*etAct*v*ty(),*ews.*etT*tle(),*ews.*etCo*te*t());
}
}
}

co*te*t_fra*.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml vers*o*="1.0" e*cod***="utf-8"?&*t;
<Relat*veLayout xml*s:a*dro*d="http://schemas.a*dro*d.com/apk/res/a*dro*d"
a*dro*d:or*e*tat*o*="vert*cal"
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"&*t;

<L**earLayout
a*dro*d:*d="@+*d/co*te*t"
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"
a*dro*d:or*e*tat*o*="vert*cal"
a*dro*d:v*s*b*l*ty="**v*s*ble"&*t;

<TextV*ew
a*dro*d:*d="@+*d/tv_t*tle"
a*dro*d:textS*ze="20sp"
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="wrap_co*te*t"
a*dro*d:padd***="10dp"/&*t;

<Ima*eV*ew
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="1dp"
a*dro*d:src="@drawable/va*dh"
a*dro*d:scaleType="f*t*Y"/&*t;

<TextV*ew
a*dro*d:*d="@+*d/tv_co*te*t"
a*dro*d:textS*ze="20sp"
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="0dp"
a*dro*d:layout_we**ht="1"
a*dro*d:padd***="15dp"/&*t;
</L**earLayout&*t;

<Ima*eV*ew
a*dro*d:layout_w*dth="1dp"
a*dro*d:layout_he**ht="match_pare*t"
a*dro*d:src="@drawable/va*dh"
a*dro*d:layout_al****are*tLeft="true"/&*t;
</Relat*veLayout&*t;

*ewsT*tle_fra*.xml

1
2
3
4
5
6
7
8
9
10
<?xml vers*o*="1.0" e*cod***="utf-8"?&*t;
<L**earLayout xml*s:a*dro*d="http://schemas.a*dro*d.com/apk/res/a*dro*d"
a*dro*d:or*e*tat*o*="vert*cal" a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"&*t;

<L*stV*ew
a*dro*d:*d="@+*d/t*tle_l*st_v*ew"
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"&*t;</L*stV*ew&*t;
</L**earLayout

t*tle_*tem.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml vers*o*="1.0" e*cod***="utf-8"?&*t;
<L**earLayout xml*s:a*dro*d="http://schemas.a*dro*d.com/apk/res/a*dro*d"
a*dro*d:or*e*tat*o*="vert*cal" a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"&*t;

<TextV*ew
a*dro*d:*d="@+*d/t*tle_*tem_tv"
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"
a*dro*d:s***leL**e="true"
a*dro*d:ell*ps*ze="e*d"
a*dro*d:padd***Left="10dp"
a*dro*d:padd***R**ht="10dp"
a*dro*d:padd***Top="15dp"
a*dro*d:padd***Bottom="15dp"/&*t;
</L**earLayout&*t;

co*te*t.xml

1
2
3
4
5
6
7
8
9
10
11
12
<?xml vers*o*="1.0" e*cod***="utf-8"?&*t;
<L**earLayout xml*s:a*dro*d="http://schemas.a*dro*d.com/apk/res/a*dro*d"
a*dro*d:or*e*tat*o*="vert*cal" a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"&*t;

<fra*me*t
a*dro*d:*d="@+*d/co*te*t_alo*e"
a*dro*d:*ame="com.example.*aby.fra*me*tbestpact*cey.NewsCo*te*tFra*me*t"
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"/&*t;

</L**earLayout

layout-a*ct*v*ty_ma**

1
2
3
4
5
6
7
8
9
10
11
12
<?xml vers*o*="1.0" e*cod***="utf-8"?&*t;
<Relat*veLayout xml*s:a*dro*d="http://schemas.a*dro*d.com/apk/res/a*dro*d"
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"&*t;

<fra*me*t
a*dro*d:*d="@+*d/t*tle_fra*"
a*dro*d:*ame="com.example.*aby.fra*me*tbestpact*cey.NewsT*tleFra*me*t"
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"/&*t;

</Relat*veLayout&*t;

layout-sw600dp-act*v*ty_ma**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml vers*o*="1.0" e*cod***="utf-8"?&*t;
<L**earLayout xml*s:a*dro*d="http://schemas.a*dro*d.com/apk/res/a*dro*d"
a*dro*d:layout_w*dth="match_pare*t"
a*dro*d:layout_he**ht="match_pare*t"&*t;

<fra*me*t
a*dro*d:*d="@+*d/*ews_t*tle_fra*me*t"
a*dro*d:*ame="com.example.*aby.fra*me*tbestpact*cey.NewsT*tleFra*me*t"
a*dro*d:layout_w*dth="0dp"
a*dro*d:layout_he**ht="match_pare*t"
a*dro*d:layout_we**ht="1"/&*t;

<fra*me*t
a*dro*d:*d="@+*d/co*te*t_fra*_layout"
a*dro*d:*ame="com.example.*aby.fra*me*tbestpact*cey.NewsCo*te*tFra*me*t"
a*dro*d:layout_w*dth="0dp"
a*dro*d:layout_he**ht="match_pare*t"
a*dro*d:layout_we**ht="3"
/&*t;

</L**earLayout&*t;
原文地址:https://www.cnblogs.com/gabygoole/p/5299865.html