<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>special (special)</title>
    <link>https://ruby-china.org/special</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>jimu Mirror，加速你的 Android UI 开发</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;这个节点好久没人新建帖子了，我来热一热..&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;p&gt;用过 &lt;strong&gt;Sketch&lt;/strong&gt; 的朋友应该都知道一个叫 &lt;strong&gt;Mirror&lt;/strong&gt; 的功能，它可以将你的设计稿放到手机上预览，为设计师们提高了不少效率。而今天我要介绍的 &lt;strong&gt;jimu Mirror&lt;/strong&gt; ，和 &lt;strong&gt;Sketch Mirror&lt;/strong&gt; 类似，可以将 Android 的 xml 实时放到手机上预览。但是现代化的 IDE 都已经提供在 IDE 内实时预览 xml 的功能，&lt;strong&gt;jimu Mirror&lt;/strong&gt; 有啥用呢？&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;有用！还是相当有用！&lt;/strong&gt; 本文将以微信的界面作为参考，在不写一句 Java 代码的情况下，轻松实现微信的几个界面。&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="安装 jimu Mirror"&gt;安装 jimu Mirror&lt;/h3&gt;
&lt;p&gt;jimu Mirror 支持 Android Studio / IDEA，本文将以 Android Studio 作为开发环境，读者请自行下载对应版本。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://jimulabs.com/mirror-downloads/" rel="nofollow" target="_blank"&gt;http://jimulabs.com/mirror-downloads/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;将插件下载下来后，在 Android Studio 菜单进行简单操作，即可安装。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Configure -&amp;gt; Plugins -&amp;gt; install plugin from disk&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;没什么意外的话，你应该就能看见 Mirror 的小图标了。：）&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.specyci.com/uploads/picture/asset/17/736807d2-7187-4d7c-9339-dfca766a38c6.png" title="" alt="Alt text"&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="配置 jimu Mirror"&gt;配置 jimu Mirror&lt;/h3&gt;
&lt;p&gt;如果你使用的是 Android Studio，恭喜你，你什么都不用做，把手机接上电脑就可以了！如果你是其它 IDE，请查看&lt;a href="http://jimulabs.com/mirror-docs/project-configuration-in-mirror-server/" rel="nofollow" target="_blank" title=""&gt;官方文档&lt;/a&gt;。&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="基本操作"&gt;基本操作&lt;/h3&gt;
&lt;p&gt;首先，将 Android Studio 的 Project 面板从 &lt;strong&gt;Android&lt;/strong&gt; 切换到 &lt;strong&gt;Project&lt;/strong&gt;，这样我们就能观察所有文件的变化；&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.specyci.com/uploads/picture/asset/18/2.png" title="" alt="Alt text"&gt;&lt;/p&gt;

&lt;p&gt;再通过菜单，将 Mirror 的 Console 打开，这样我们就能观察 Mirror 的运行情况；&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.specyci.com/uploads/picture/asset/19/3.png" title="" alt="Alt text"&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;最后点一下「Start/Stop Mirror」的小图标，把 Mirror 跑起来，如无意外，Project 下会生成一个 app/mirror 的目录，同时你的手机应该会跑起 jimu Mirror 的主程序。&lt;/strong&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="编写「聊天」列表界面"&gt;编写「聊天」列表界面&lt;/h3&gt;
&lt;p&gt;先新建两个 layout，一个放 ListView 一个放 ListView Item。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;fragemnt_messages.xml&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;list_item_message.xml&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;往 &lt;strong&gt;fragment_messages.xml&lt;/strong&gt; 增加一个 ListView，代码大概如下：&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;LinearLayout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ListView&lt;/span&gt;
        &lt;span class="err"&gt;...&lt;/span&gt;
        &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/listView"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后往 &lt;strong&gt;list_item_message.xml&lt;/strong&gt; 添加所需要的控件，例如放置头像的 ImageView，放置昵称的 TextView。&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;LinearLayout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ImageView&lt;/span&gt;
        &lt;span class="err"&gt;...&lt;/span&gt;
        &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/avatar"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TextView&lt;/span&gt;
        &lt;span class="err"&gt;...&lt;/span&gt;
        &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/name"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TextView&lt;/span&gt;
        &lt;span class="err"&gt;...&lt;/span&gt;
        &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/content"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TextView&lt;/span&gt;
        &lt;span class="err"&gt;...&lt;/span&gt;
        &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/time"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按下「保存」按钮，可以看到在 Mirror 的 Console 里有新的输出，它为刚才修改的文件生成了新的 mirror 数据文件。&lt;/p&gt;
&lt;h4 id="Mirror XML 简介"&gt;Mirror XML 简介&lt;/h4&gt;
&lt;p&gt;打开 &lt;strong&gt;app/mirror&lt;/strong&gt; 下的 &lt;strong&gt;list_item_message.xml&lt;/strong&gt;，可以看到如下 XML 代码：&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;screen&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;_content&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"@layout/list_item_message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- ImageView Examples:
        &amp;lt;avatar src="@drawable/image_resource" /&amp;gt;
        &amp;lt;avatar src="relative_path/image.jpg" /&amp;gt; --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;avatar&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- TextView Examples:
        &amp;lt;name text="@string/string_resource" /&amp;gt;
        &amp;lt;name text="Text literal" textSize="14sp" /&amp;gt; --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;name&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;content&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;time&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/_content&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/screen&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们在 layout 中 ID 为 avatar 的 ImageView，在 Mirror 的数据文件里被 &lt;code&gt;&amp;lt;avatar/&amp;gt;&lt;/code&gt; 闭合所定义，我们可以在闭合内设置 avatar 的属性，例如我要给它设置个 src：&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;avatar&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"@drawable/image_resource"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同理地，其它属性也可以在闭合里写属性定义。&lt;/p&gt;
&lt;h4 id="实现聊天列表界面"&gt;实现聊天列表界面&lt;/h4&gt;
&lt;p&gt;上面简单地说明了下 &lt;strong&gt;Mirror XML&lt;/strong&gt;，但是我们的目标是编写一个列表，然不是一个 Item，所以要实现聊天列表，真正要修改的是 &lt;strong&gt;app/mirror/fragment_messages.xml&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;打开 &lt;strong&gt;app/mirror/fragment_messages.xml&lt;/strong&gt;，可以看到类似结构。&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;screen&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;_content&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"@layout/fragment_messages"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;listView&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/listView&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/_content&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/screen&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要往 ID 为 &lt;strong&gt;listView&lt;/strong&gt; 的 ListView 添加数据，往闭合内放 &lt;strong&gt;items&lt;/strong&gt; 即可；&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;items&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"list_item_message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;_item&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;avatar&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"@drawable/avatar_special"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;name&lt;/span&gt; &lt;span class="na"&gt;text=&lt;/span&gt;&lt;span class="s"&gt;"Special"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;content&lt;/span&gt; &lt;span class="na"&gt;text=&lt;/span&gt;&lt;span class="s"&gt;"[图片]"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;time&lt;/span&gt; &lt;span class="na"&gt;text=&lt;/span&gt;&lt;span class="s"&gt;"晚上 11:59"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/_item&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;_item&amp;gt;&lt;/span&gt;
    ....
    &lt;span class="nt"&gt;&amp;lt;/_item&amp;gt;&lt;/span&gt;
    ...
&lt;span class="nt"&gt;&amp;lt;/items&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;小 Tips&lt;/strong&gt;: 这里的测试数据，例如 drawable，可以放到 app/mirror/res 下，这样可以实现测试数据与正式代码分离，非常优雅！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;其中我们在最外层的 &lt;strong&gt;items&lt;/strong&gt; 声明了渲染的 layout 为 &lt;strong&gt;list_item_message&lt;/strong&gt;，子 &lt;strong&gt;_item&lt;/strong&gt; 也支持定义它自己的 layout，例如在聊天列表里，有服务号、订阅号的记录，它们的样式可能与其它不同。&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;items&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"list_item_message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;_item&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"list_item_message_special"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;_item&lt;/span&gt; &lt;span class="na"&gt;count=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/items&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外，通过设置 &lt;strong&gt;count&lt;/strong&gt; 属性可以实现添加重复的 item。&lt;/p&gt;
&lt;h4 id="聊天列表效果"&gt;聊天列表效果&lt;/h4&gt;
&lt;p&gt;添加好各种模拟数据后，保存好所有文件，回到手机上，在 jimu Mirror 的界面列表选择 &lt;code&gt;fragment_messages&lt;/code&gt;。
&lt;img src="http://www.specyci.com/uploads/picture/asset/20/4.png" title="" alt="Alt text"&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="编写主界面"&gt;编写主界面&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;目前 jimu Mirror 暂时只支持 Actionbar Tab 去切换 Fragments，所以主界面先用 Actionbar Tab 吧。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;新建 layout &lt;strong&gt;activity_main.xml&lt;/strong&gt;，往里添加一个 ViewPager：&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;LinearLayout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;android.support.v4.view.ViewPager&lt;/span&gt; &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/pager"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改 mirror 下对应的 XML 文件：&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;screen&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;actionbar&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"微信"&lt;/span&gt; &lt;span class="na"&gt;showTabsFor=&lt;/span&gt;&lt;span class="s"&gt;"@id/pager"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;_content&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"@layout/activity_main"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;pager&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;_page&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"聊天"&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"fragment_messages"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;listView&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;items&amp;gt;&lt;/span&gt;
                    ....
                    &lt;span class="nt"&gt;&amp;lt;/items&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/listView&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/_page&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;_page&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"发现"&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"fragment_discovery"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;listView&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;items&amp;gt;&lt;/span&gt;
                    ....
                    &lt;span class="nt"&gt;&amp;lt;/items&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/listView&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/_page&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;_page&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"通讯录"&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"fragment_contacts"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/pager&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/_content&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/screen&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;items&amp;gt;&amp;lt;/items&amp;gt;&lt;/code&gt; 内就是把上面&lt;strong&gt;编写「聊天列表」&lt;/strong&gt;的 items 往里堆，当然这样很不 DRY。我们可以把&lt;strong&gt;items&lt;/strong&gt;抽离出一个 XML，再把它们 &lt;strong&gt;include&lt;/strong&gt; 进去。&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!--- File name: messages.xml ---&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;items&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"list_item_message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;_item&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;avatar/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;name/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;content/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;time/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/_item&amp;gt;&lt;/span&gt;
    ....
&lt;span class="nt"&gt;&amp;lt;/items&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!--- File name: activity_main.xml ---&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;_page&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"聊天"&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"fragment_messages"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;listView&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;items&lt;/span&gt; &lt;span class="na"&gt;include=&lt;/span&gt;&lt;span class="s"&gt;"messages.xml"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/listView&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/_page&amp;gt;&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="效果"&gt;效果&lt;/h4&gt;
&lt;p&gt;在 jimu Mirror 的 layout 列表里选择 &lt;strong&gt;activity_main&lt;/strong&gt;，哈哈，还挺像嘛！&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.specyci.com/uploads/picture/asset/21/5.png" title="" alt="Alt text"&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="结语"&gt;结语&lt;/h3&gt;
&lt;p&gt;这几年 Android 相关的开发工具都在飞速进步，前几年我们还在挣扎 ADT，现在一个 Android Studio 妥妥的，再配个 Genymotion，谁还想念那自带模拟器呢？
这个插件虽算不上革命之举，但从效率上，无疑提高了界面开发速度，如果团队里还有屌炸天懂 XML 规范的设计师，相当部分的前端工作可以托付给他了。&lt;/p&gt;

&lt;p&gt;最后，&lt;strong&gt;相关资源&lt;/strong&gt;附上本文项目代码。&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="相关资源"&gt;相关资源&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/SpecialCyCi/MirrorWechat" rel="nofollow" target="_blank" title=""&gt;MirrorWechat&lt;/a&gt;&lt;/strong&gt;: 本文示范代码，使用 jimu Mirror 模仿微信界面。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://jimulabs.com/mirror-docs/mirror-tutorial/" rel="nofollow" target="_blank" title=""&gt;MirrorTutorial&lt;/a&gt;&lt;/strong&gt;: 官方的说明文档。&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>special</author>
      <pubDate>Tue, 30 Dec 2014 13:55:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/23475</link>
      <guid>https://ruby-china.org/topics/23475</guid>
    </item>
    <item>
      <title>[成都][远程][长期有效] Tower 实习生再招募</title>
      <description>&lt;p&gt;由于之前几批实习生给我们团队带来了良好成果，我们决定再展开新一轮的 &lt;a href="https://tower.im/" rel="nofollow" target="_blank" title=""&gt;Tower&lt;/a&gt; 实习生招募，如果你还在学校，并且有意愿寻觅一个实习的机会，不妨接着往下看。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;我们提供：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;一个你愿意并值得为此打造的产品；&lt;/li&gt;
&lt;li&gt;足够多的解决实际产品问题的机会，以战促学；&lt;/li&gt;
&lt;li&gt;可远程办公；&lt;/li&gt;
&lt;li&gt;每月 6k 以上的薪水，保证你成为同学中的土豪。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;我们要求：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;在读高校生，实习时间至少能持续半年；&lt;/li&gt;
&lt;li&gt;远超同龄人水准的互联网产品设计、开发、运营技能；&lt;/li&gt;
&lt;li&gt;远超同龄人水准的责任心及协作能力；&lt;/li&gt;
&lt;li&gt;对打造最好用的企业软件的兴趣与热情。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;我们期待你的加入，如果你表现优异，我们也十分愿意让你成为同学中那个第一个签署拥有丰厚待遇的三方协议的「传说中的高手」。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.lagou.com/gongsi/21907.html" rel="nofollow" target="_blank" title=""&gt;点击这里&lt;/a&gt;，在拉钩上给我们提交简历吧~&lt;/p&gt;</description>
      <author>special</author>
      <pubDate>Sat, 06 Sep 2014 10:50:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/21408</link>
      <guid>https://ruby-china.org/topics/21408</guid>
    </item>
    <item>
      <title>如何确保订单状态安全性</title>
      <description>&lt;p&gt;最近做一电商系统，其中肯定包括了订单系统，订单表有一字段是当前订单状态，已用 strong_parameter 保护该字段。
但是客户认为还不够安全，担心黑客还能通过其它手段更改到订单状态字段，造成资金损失，要求对订单状态更改时，做一定的核验。
求教各位有何能确保订单状态安全性的手段？&lt;/p&gt;</description>
      <author>special</author>
      <pubDate>Tue, 15 Apr 2014 10:50:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/18610</link>
      <guid>https://ruby-china.org/topics/18610</guid>
    </item>
  </channel>
</rss>
