Android编程权威指南(第二版)第十七章-主从用户界面 (master-detail interface)
别名资源是一种指向其他资源的特殊资源。它存放在res/values/目录下,并按照约定定义在refs.xml文件中。
一般,当我们要让应用可以很完美的运行在各种Android设备上,要求对不同屏幕大小规格的android机,实现不同的布局,那么我们就需要使用别名资源,value这个文件的名称不同,系统根据要求,找到不同的refs,那么我们在refs中用同样的名称指向不同的资源目标,实现控制层的代码一致性,布局呈现不同的效果。
资源修饰符就是描述,设备物理状态的语言(暂且说是物理状态,如屏幕大小)
wXXXdp 有效宽度:宽度大于或等于XXX dp
hXXXdp 有效高度:高度大于或等于XXX dp
swXXXdp 最小宽度:宽度或高度(两者中最小的那个)大于或等于XXX dp
主从界面,指的是,当我们把列表和列表项详细信息分开为两个fragment,显示在同一个界面,这时,我们就需要在列表中点击,详细信息界面进行更新,在详细信息修改保存后,列表里展示的相应信息改变,那么列表就是主界面,列表详细信息就是从界面,这章讲的就是,如何实现这两个界面的联动。
fragment做为独立的开发构件,为了保持fragment的独立性,一般不会在fragment中去获取另一个fragment的Manager,然后去提交事务。为保持fragment的独立性,我们可以在fragment中定义回调接口,委托托管activity来完成那些不应由fragment处理的任务。托管activity将实现回调接口,履行托管fragment的任务。
使用fragment 回调接口定义fragment托管给activity处理任务
public class ItemListFragment extends Fragment {
...
private Callbacks mCallbacks;
/**
* Required interface for hosting activities.
*/
public interface Callbacks {
void onItemSelected(ItemObj item);
//自定义的接口
}
@Override
public void onAttach(Activity activity) {
//该方法是在fragment附加给activity时调用的
super.onAttach(activity);
mCallbacks = (Callbacks) activity;
}
@Override
public void onDetach() {
//生命周期销毁方法
super.onDetach();
mCallbacks = null;
}
}
Activity类中,实现ItemListFragment.Callbacks接口
public class CrimeListActivity extends FragmentActivity
implements ItemListFragment .Callbacks {
@Override
public void onItemSelected(ItemObj item) {
//重写接口,让activity去操作,一般就开始一项fragmentManager 的一项事务
Fragment newDetail = ItemFragment.newInstance(item.getId());
getSupportFragmentManager().beginTransaction()
.replace(R.id.detail_fragment_container, newDetail)
.commit();
}
}
那么在我们的fragment中,item的点击事件下就可以调用回调方法
mCallbacks.onItemSelected(ItemObj item);
同样,我们在ItemFragment增加一个列表项信息刷新的回调接口,实现列表能同步列表项的更新。
public class ItemFragment extends Fragment {
...
private Callbacks mCallbacks;
public interface Callbacks {
void onItemUpdated(Item item);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallbacks = (Callbacks)activity;
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
}
再在activity中实现ItemFragment.Callbacks接口,使列表fragment重新刷新
public class CrimeListActivity extends FragmentActivity
implements ItemListFragment .Callbacks , CrimeFragment.Callbacks{
@Override
public void onItemSelected(ItemObj item) {......}
public void onCrimeUpdated(ItemObj item) {
ItemListFragment listFragment = (ItemListFragment)
getSupportFragmentManager()
.findFragmentById(R.id.fragment_container);
listFragment.updateUI();//updateUI这个刷新列表信息的方法要变成public
}
}

浙公网安备 33010602011771号