Android Master-Detail

本节目录:

  1. 主从用户界面
  2. 增加布局灵活性
  3. 使用别名系统
  4. fragment 回调接口

主从用户界面


本来对应手机设备,一般都是单版面,上图这种双版面可以叫做主从界面

增加布局灵活性

  1. 手机的布局都是单版面(single-pane)
  2. 在平板上,因为同时显示主从用户的界面,我们需要生成双版面(two-pane)布局

如何实现?

  1. 修改托管 fragment 的 setContentView 方法
  2. 创建两个 fragment 容器布局
  3. 修改托管的 Activity 实现在手机中显示单版面,在平板上实例化双版面

具体到项目:

  1. 修改布局,从单版面修改为双版面
  2. 给父类 SimpleFragmentActivity 中的加载 fragment 改为 获取布局的方法
  3. 分别给水平,垂直布局修改布局
  4. 覆写 getLayoutResID 返回 需要加载的布局

使用别名系统

别名系统是一种指向其他资源的特殊资源

  1. 在 res/values 创建refs.xml 别名资源文件
  2. 创建默认的别名资源值

    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <item name="activity_masterdetail" type="layout">
    @layout/activity_fragment
    </item>
    </resources>
  3. 创建规定屏幕范围的资源值


1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="activity_masterdetail" type="layout">
@layout/activity_twopane
</item>
</resources>

上面两种别名资源,可以通过设备屏幕的大小改变不同的布局文件。

  • 当屏幕小于 600dp 将使用 R.layout.activity_fragment 单版面布局
  • 当屏幕大学 600dp 将使用 R.layout.activity_twopane
    双版面的布局

fragment 回调接口

当我们在双版面的情况下,不在启动新的页面,在第一个页面的 fragment 中的点击事件获取第二个页面的 FragmentManager ,然后提交一个 fragment
事务,将第二个 Fragment 添加到双版面的布局。虽然这种方法行的通。

fragment 天生是独立的开发构件。如果用 fragment 用来添加其他 fragment 到 activity 的 FragmentManager,那么这个 fragment 就必须知道托管 activity 是如何工作的。

托管 activity 将实现回调接口,履行托管 fragment 的任务

接口回调是用接口句柄来得到并调用实现这个接口的子类的引用

  1. 在 fragment 定义回调接口,托管 activity 强制转化为 CallBacks 对象并赋值给 CallBacks 类型变量(强制转化的目的是托管 activity 必须实现回调接口,这种机制将 fragment 需要完成的事务托管给 activity)
  2. 托管的 activity 实现 .CallBacks 接口
  3. 实现接口的方法,方法内写事务

实例:

  1. 当为手机设备,启动 activity
  2. 当为平板设备,将 fragment 放入 双版面的详情页面

以下是实现接口的回调方法

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public void onCrimeSelected(Crime crime) {
if(findViewById(R.id.detail_fragment_container)==null){
Intent intent=CrimePagerActivity.newIntent(this,crime.getId());
startActivity(intent);
}else{
Fragment newDetail=CrimeFragment.newInstance(crime.getId());
getSupportFragmentManager().beginTransaction()
.replace(R.id.detail_fragment_container,newDetail)
.commit();
}
}

当点击不同列表,显示不同详情页,调用全部回调方法。

  1. 点击列表调用显示详情页的回调方法
  2. 点击添加按钮时,调用显示详情页的回调方法

回调函数刷新

  1. 将列表清单刷新私有方法改为公有方法
  2. 将详细面板创建 Callbacks 回调方法,并创建 onAttach()将 activity 赋值给 Callbacks 对象。frgament 结束方法 onDetach() 将 null 复制 Callbacks 对象
  3. 托管 activity 实现接口方法,并在方法中实现托管的代码
(*^▽^*)