Android开发之浮动Activity
noelcaric12v
8年前
<h2>场景</h2> <p>在使用App时,曾经看到这样一个场景,如下图所示,点击顶部菜单按钮,有一个类似的对话框的列表显示出来,让用户选择其中的一个快递选项,然后选中的快递信息就会填充到底部的Activity中。</p> <p><img src="https://simg.open-open.com/show/2c2d37f6824a9a8283947c26f0fe8abe.png" alt="Android开发之浮动Activity" width="480" height="854"></p> <p> </p> <h2>分析</h2> <p>类似这样的效果到底是怎么做出来的?弹出的是一个普通对话框吗?其实不一定,弹出的可能是一个Activity,但不同的是该Activity是浮动显示在某一个Activity之上,而不是直接跳转。</p> <h2>案例</h2> <p>在最近一个App中有一个界面如下:</p> <p><img src="https://simg.open-open.com/show/197a974663d7d9f036df1d0ad80e3953.png" alt="Android开发之浮动Activity" width="960" height="540"></p> <p>点击底层Activity中浮动按钮,会浮动一个年份列表,选择某一个年份后回到底部Activity,然后底部Activity根据选择的年份加载对应的数据。这里底层的Activity略过,重点讲解一下浮动的Activity是如何实现的。</p> <p><strong>1、由于其本质还是一个Activity,所以看到的界面就是需要在xml中布局,这里非常简单,就是一个ListView,显示年份,比较简单,就不粘贴代码了</strong></p> <p><strong>2、新建一个style,该style配置Activity为浮动显示</strong></p> <pre> <code class="language-xml"><style name="Theme.Transparent" parent="android:Theme.Dialog"> <item name="android:windowIsTranslucent">true</item>//此对话框的背景 <item name="android:windowBackground">@android:color/transparent</item>//对话框是否透明 <item name="android:windowContentOverlay">@null</item>//对话框是否有遮盖 <item name="android:windowNoTitle">true</item>//对话框无标题 <item name="android:windowIsFloating">true</item> //对话框是否浮动 <item name="android:backgroundDimEnabled">true</item>//是否允许对话框的背景变暗 </style></code></pre> <p><strong>3、AndroidManifest.xml中设置Activity的主题如上</strong></p> <pre> <code class="language-xml"><activity android:name="com.activity.SelYearActivity" android:theme="@style/Theme.Transparent"></activity></code></pre> <p><strong>4、在底部的Activity中调用 <code>startActivityForResult</code>,并重写<code>onActivityResult</code>方法接收浮动Activity返回的数据,进行相应的逻辑处理,如之前提到的快递信息。</strong></p> <p><strong>5、最后在浮动的Activity中设置ListView的点击事件,这里将要将返回的数据添加到Intent中,然后调用 <code>setResult</code> 和 <code>onBackPressed()</code>,传值回底层的Activity并让当前浮动的Activity消失,大功告成。代码如下</strong></p> <pre> <code class="language-java">mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { //将选择的年份回传至上个界面 并让本界面消失 Intent intent = new Intent(); intent.putExtra("selYear", years.get(i)); setResult(RESULT_OK, intent); onBackPressed(); } });</code></pre> <p><br> </p> <p>文/YungFan(简书)<br> via:http://www.jianshu.com/p/a5f64e165ba7<br> 。</p>