在根据不同设备(手机或平板)生成不同的用户界面时可以用到可选别名资源。别名资源指在目录res/values/refs.xml里设定的资源如:
<resources>
<item name ="activity_masterdetail" type="layout">@layout/activity_fragment</item>
</resources>
其资源ID是R.layout.activity_masterdetail。注意,别名的type属性决定了资源ID属于什么内部类,即使存放在res/values/下,就像上面的资源ID依旧属于R.layout内部类。
而当需要创建一个可选别名资源时,则要在res目录下新建一个如values-sw600dp的目录,并在里面存放refs.xml。其中-sw600dp的意思是smallest width(最小宽度),其指的是屏幕的最小尺寸(与方向无关)。
wXXXdp ------ 有效宽度:宽度大于或等于XXXdp
hXXXdp ------ 有效高度:高度大于或等于XXXdp
swXXXdp ------ 最小宽度:宽度或高度(两者中最小的那个)大于或等于XXXdp
二、fragment回调接口
如果要开发一个fragment用来添加其他fragment到同一activity的FragmentManager上,我们的第一反应是直接在初始fragment上加一个监听器,通过监听器获取activity,再把新的fragment托管到activity上。这样做虽然行的通,但是这样一来初始fragment就必须知道托管activity是如何工作的,也就是说该fragment就再也无法作为独立的开发构件来使用了。
所以为了保持fragment的独立性,我们可以在fragment中定义回调接口,委托托管activity来完成那些不应由fragment处理的任务。托管activity将实现回调接口,履行托管fragment的任务。
下面例子中用Callbacks接口代指回调接口。要实现一个Callbacks接口,首先定义一个成员变量存放实现Callbacks接口的对象。然后将托管activity强制类型转换为Callbacks类型变量并复制给Callbacks类型变量。
强制类型转换activity并复制给Callbacks类型变量要在Fragment的生命周期onAttach(Activity activity)中处理,而在onDetach()中则应该将Callbacks变量设置为null。如下:
private Callbacks mCallbacks;
public interface Callbacks {
void onCrimeSelected(Crime crime);
}
@Override
public void onAttach(Activity activity){ //强制类型转换activity并复制给Callbacks
super.onAttach(activity);
mCallbacks = (Callbacks)activity;
}
@Override
public void onDetach(){ //销毁方法中将Callbacks设为null
super.onDetach();
mCallbacks = null;
}
而实现回调接口则要在托管fragment的Activity中实现:
public class CrimeListActivity extends SingleFragmentActivity implements CrimeListFragment.Callbacks{
public void onCrimeSelected (Crime crime){
.............
}
}