Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

转载:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文。 http://developer.android.com/guide/topics/ui/actionbar.html Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,它可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作,并且ActionBar还可以自动适应各种不同大小的屏幕。下面是一张使用ActionBar的界面截图: 其中,[1]是ActionBar的图标,[2]是两个action按钮,[3]是overflow按钮。 由于Action Bar是在3.0以后的版本中加入的,如果想在2.x的版本里使用ActionBar的话则需要引入Support Library,不过3.0之前版本的市场占有率已经非常小了,这里简单起见我们就不再考虑去做向下兼容,而是只考虑4.0以上版本的用法。 添加和移除Action Bar ActionBar的添加非常简单,只需要在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可以了,而使用Eclipse创建的项目自动就会将Application的theme指定成Theme.Holo,所以ActionBar默认都是显示出来的。新建一个空项目并运行,效果如下图所示: 而如果想要移除ActionBar的话通常有两种方式,一是将theme指定成Theme.Holo.NoActionBar,表示使用一个不包含ActionBar的主题,二是在Activity中调用以下方法: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> - <span style="color: black;">ActionBar actionBar = getActionBar(); </span> - <span style="color: black;">actionBar.hide(); </span> 现在重新运行一下程序,就可以看到ActionBar不再显示了,如下图所示: 修改Action Bar的图标和标题 默认情况下,系统会使用或者中icon属性指定的图片来作为ActionBar的图标,但是我们也可以改变这一默认行为。如果我们想要使用另外一张图片来作为ActionBar的图标,可以在或者中通过logo属性来进行指定。比如项目的res/drawable目录下有一张weather.png图片,就可以在AndroidManifest.xml中这样指定: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:logo</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/weather&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 现在重新运行一下程序,效果如下图所示: ![](http://img.blog.csdn.net/20140602121519562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) OK,ActionBar的图标已经修改成功了,那么标题中的内容该怎样修改呢?其实也很简单,使用label属性来指定一个字符串就可以了,如下所示: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:label</span>=<span class="attribute-value" style="color: blue;">&#8220;天气&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:logo</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/weather&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 现在重新运行一下程序,结果如下图所示: ![](http://img.blog.csdn.net/20140602121652968?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 添加Action按钮 ActionBar还可以根据应用程序当前的功能来提供与其相关的Action按钮,这些按钮都会以图标或文字的形式直接显示在ActionBar上。当然,如果按钮过多,ActionBar上显示不完,多出的一些按钮可以隐藏在overflow里面(最右边的三个点就是overflow按钮),点击一下overflow按钮就可以看到全部的Action按钮了。 当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的Action按钮,我们只需要在这个方法中去加载一个menu资源,并把所有的Action按钮都定义在资源文件里面就可以了。 那么我们先来看下menu资源文件该如何定义,代码如下所示: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">menu</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/tools&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">item</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/action_compose&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:icon</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/ic_action_compose&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:showAsAction</span>=<span class="attribute-value" style="color: blue;">&#8220;always&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:title</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/action_compose&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">item</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/action_delete&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:icon</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/ic_action_delete&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:showAsAction</span>=<span class="attribute-value" style="color: blue;">&#8220;always&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:title</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/action_delete&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">item</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/action_settings&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:icon</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/ic_launcher&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:showAsAction</span>=<span class="attribute-value" style="color: blue;">&#8220;never&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:title</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/action_settings&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">menu</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 可以看到,这里我们通过三个<item>标签定义了三个Action按钮。<item>标签中又有一些属性,其中id是该Action按钮的唯一标识符,icon用于指定该按钮的图标,title用于指定该按钮可能显示的文字(在图标能显示的情况下,通常不会显示文字),showAsAction则指定了该按钮显示的位置,主要有以下几种值可选:always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中,never则表示永远显示在overflow中。 接着,重写Activity的onCreateOptionsMenu()方法,代码如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onCreateOptionsMenu(Menu menu) { </span> - <span style="color: black;"> MenuInflater inflater = getMenuInflater(); </span> - <span style="color: black;"> inflater.inflate(R.menu.main, menu); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreateOptionsMenu(menu); </span> - <span style="color: black;">} </span> 这部分代码很简单,仅仅是调用了MenuInflater的inflate()方法来加载menu资源就可以了。现在重新运行一下程序,结果如下图所示: ![](http://img.blog.csdn.net/20140602121900750?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到,action_compose和action_delete这两个按钮已经在ActionBar中显示出来了,而action_settings这个按钮由于showAsAction属性设置成了never,所以被隐藏到了overflow当中,只要点击一下overflow按钮就可以看到它了。 这里我们注意到,显示在ActionBar上的按钮都只有一个图标而已,我们在title中指定的文字并没有显示出来。没错,title中的内容通常情况下只会在overflow中显示出来,ActionBar中由于屏幕空间有限,默认是不会显示title内容的。但是出于以下几种因素考虑,即使title中的内容无法显示出来,我们也应该给每个item中都指定一个title属性: - 当ActionBar中的剩余空间不足的时候,如果Action按钮指定的showAsAction属性是ifRoom的话,该Action按钮就会出现在overflow当中,此时就只有title能够显示了。 - 如果Action按钮在ActionBar中显示,用户可能通过长按该Action按钮的方式来查看到title的内容。 响应Action按钮的点击事件 当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,通过方法传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别出用户点击的是哪一个Action按钮,比如: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onOptionsItemSelected(MenuItem item) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">switch</span> (item.getItemId()) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> R.id.action_compose: </span> - <span style="color: black;"> Toast.makeText(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, <span class="string" style="color: blue;">&#8220;Compose&#8221;</span>, Toast.LENGTH_SHORT).show(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> R.id.action_delete: </span> - <span style="color: black;"> Toast.makeText(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, <span class="string" style="color: blue;">&#8220;Delete&#8221;</span>, Toast.LENGTH_SHORT).show(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> R.id.action_settings: </span> - <span style="color: black;"> Toast.makeText(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, <span class="string" style="color: blue;">&#8220;Settings&#8221;</span>, Toast.LENGTH_SHORT).show(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">default</span>: </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onOptionsItemSelected(item); </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> 可以看到,我们让每个Action按钮被点击的时候都弹出一个Toast,现在重新运行一下代码,结果如下图所示: ![](http://img.blog.csdn.net/20140602115507171) 通过Action Bar图标进行导航 启用ActionBar图标导航的功能,可以允许用户根据当前应用的位置来在不同界面之间切换。比如,A界面展示了一个列表,点击某一项之后进入了B界面,这时B界面就应该启用ActionBar图标导航功能,这样就可以回到A界面。 我们可以通过调用setDisplayHomeAsUpEnabled()方法来启用ActionBar图标导航功能,比如: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setTitle(<span class="string" style="color: blue;">&#8220;天气&#8221;</span>); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> ActionBar actionBar = getActionBar(); </span> - <span style="color: black;"> actionBar.setDisplayHomeAsUpEnabled(<span class="keyword" style="font-weight: bold; color: #006699;">true</span>); </span> - <span style="color: black;">} </span> 现在重新运行一下程序,结果如下图所示: ![](http://img.blog.csdn.net/20140602152755500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到,在ActionBar图标的左侧出现了一个向左的箭头,通常情况下这都表示返回的意思,因此最简单的实现就是在它的点击事件里面加入finish()方法就可以了,如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onOptionsItemSelected(MenuItem item) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">switch</span> (item.getItemId()) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> android.R.id.home: </span> - <span style="color: black;"> finish(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> …… </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> 当点击ActionBar图标的时候,系统同样会调用onOptionsItemSelected()方法,并且此时的itemId是android.R.id.home,所以finish()方法也就是加在这里的了。 现在看上去,ActionBar导航和Back键的功能貌似是一样的。没错,如果我们只是简单地finish了一下,ActionBar导航和Back键的功能是完全一样的,但ActionBar导航的设计初衷并不是这样的,它和Back键的功能还是有一些区别的,举个例子吧。 ![](http://img.blog.csdn.net/20140602161656000) 上图中的Conversation List是收件箱的主界面,现在我们点击第一封邮件会进入到Conversation1 details界面,然后点击下一封邮件会进入到Conversation 2 details界面,再点击下一封邮箱会进入到Conversation3 details界面。好的,这个时候如果我们按下Back键,应该会回到Conversation 2 details界面,再按一次Back键应该回到Conversation1 details界面,再按一次Back键才会回到Conversation List。而ActionBar导航则不应该表现出这种行为,无论我们当前在哪一个Conversation details界面,点击一下导航按钮都应该回到Conversation List界面才对。 这就是ActionBar导航和Back键在设计上的区别,那么该怎样才能实现这样的功能呢?其实并不复杂,实现标准的ActionBar导航功能只需三步走。 第一步我们已经实现了,就是调用setDisplayHomeAsUpEnabled()方法,并传入true。 第二步需要在AndroidManifest.xml中配置父Activity,如下所示: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:logo</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/weather&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">meta-data</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;android.support.PARENT_ACTIVITY&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:value</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.LaunchActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 可以看到,这里通过meta-data标签指定了MainActivity的父Activity是LaunchActivity,在Android 4.1版本之后,也可以直接使用android:parentActivityName这个属性来进行指定,如下所示: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:logo</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/weather&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:parentActivityName</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.LaunchActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 第三步则需要对android.R.id.home这个事件进行一些特殊处理,如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onOptionsItemSelected(MenuItem item) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">switch</span> (item.getItemId()) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> android.R.id.home: </span> - <span style="color: black;"> Intent upIntent = NavUtils.getParentActivityIntent(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (NavUtils.shouldUpRecreateTask(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, upIntent)) { </span> - <span style="color: black;"> TaskStackBuilder.create(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>) </span> - <span style="color: black;"> .addNextIntentWithParentStack(upIntent) </span> - <span style="color: black;"> .startActivities(); </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> { </span> - <span style="color: black;"> upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); </span> - <span style="color: black;"> NavUtils.navigateUpTo(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, upIntent); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> &#8230;&#8230; </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> 其中,调用NavUtils.getParentActivityIntent()方法可以获取到跳转至父Activity的Intent,然后如果父Activity和当前Activity是在同一个Task中的,则直接调用navigateUpTo()方法进行跳转,如果不是在同一个Task中的,则需要借助TaskStackBuilder来创建一个新的Task。 这样,就按照标准的规范成功实现ActionBar导航的功能了。 添加Action View ActionView是一种可以在ActionBar中替换Action按钮的控件,它可以允许用户在不切换界面的情况下通过ActionBar完成一些较为丰富的操作。比如说,你需要完成一个搜索功能,就可以将SeachView这个控件添加到ActionBar中。 为了声明一个ActionView,我们可以在menu资源中通过actionViewClass属性来指定一个控件,例如可以使用如下方式添加SearchView: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">menu</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">item</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/action_search&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:icon</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/ic_action_search&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:actionViewClass</span>=<span class="attribute-value" style="color: blue;">&#8220;android.widget.SearchView&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:showAsAction</span>=<span class="attribute-value" style="color: blue;">&#8220;ifRoom|collapseActionView&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:title</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/action_search&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> &#8230;&#8230; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">menu</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 注意在showAsAction属性中我们还声明了一个collapseActionView,这个值表示该控件可以被合并成一个Action按钮。 现在重新运行一下程序,效果如下图所示: ![](http://img.blog.csdn.net/20140604232000843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvbGluX2Jsb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) OK,果然有一个搜索样式的Action按钮出现了,现在点击一下这个搜索按钮,效果如下图所示: ![](http://img.blog.csdn.net/20140604232624109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvbGluX2Jsb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到,这时SearchView就会展开占满整个ActionBar,而其它的Action按钮由于将showAsAction属性设置成了ifRoom,此时都会隐藏到overflow当中。 如果你还希望在代码中对SearchView的属性进行配置(比如添加监听事件等),完全没有问题,只需要在onCreateOptionsMenu()方法中获取该ActionView的实例就可以了,代码如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onCreateOptionsMenu(Menu menu) { </span> - <span style="color: black;"> MenuInflater inflater = getMenuInflater(); </span> - <span style="color: black;"> inflater.inflate(R.menu.main, menu); </span> - <span style="color: black;"> MenuItem searchItem = menu.findItem(R.id.action_search); </span> - <span style="color: black;"> SearchView searchView = (SearchView) searchItem.getActionView(); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 配置SearchView的属性</span> </span> - <span style="color: black;"> &#8230;&#8230; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreateOptionsMenu(menu); </span> - <span style="color: black;">} </span> 在得到了SearchView的实例之后,就可以任意地配置它的各种属性了。关于SearchView的更多详细用法,可以参考官方文档 [http://developer.android.com/guide/topics/search/search-dialog.html](http://developer.android.com/guide/topics/search/search-dialog.html) 。</div> <div> 除此之外,有些程序可能还希望在ActionView展开和合并的时候显示不同的界面,其实我们只需要去注册一个ActionView的监听器就能实现这样的功能了,代码如下所示: <div class="dp-highlighter bg_java"> <div class="bar"> <div class="tools" style="color: silver;"> **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onCreateOptionsMenu(Menu menu) { </span> - <span style="color: black;"> MenuInflater inflater = getMenuInflater(); </span> - <span style="color: black;"> inflater.inflate(R.menu.main, menu); </span> - <span style="color: black;"> MenuItem searchItem = menu.findItem(R.id.action_search); </span> - <span style="color: black;"> searchItem.setOnActionExpandListener(<span class="keyword" style="font-weight: bold; color: #006699;">new</span> OnActionExpandListener() { </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onMenuItemActionExpand(MenuItem item) { </span> - <span style="color: black;"> Log.d(<span class="string" style="color: blue;">&#8220;TAG&#8221;</span>, <span class="string" style="color: blue;">&#8220;on expand&#8221;</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onMenuItemActionCollapse(MenuItem item) { </span> - <span style="color: black;"> Log.d(<span class="string" style="color: blue;">&#8220;TAG&#8221;</span>, <span class="string" style="color: blue;">&#8220;on collapse&#8221;</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreateOptionsMenu(menu); </span> - <span style="color: black;">} </span> </div> 可以看到,调用MenuItem的setOnActionExpandListener()方法就可以注册一个监听器了,当SearchView展开的时候就会回调onMenuItemActionExpand()方法,当SearchView合并的时候就会调用onMenuItemActionCollapse()方法,我们在这两个方法中进行相应的UI操作就可以了。 </div> <div> </div> ## <a style="color: #336699;" name="t6"></a>Overflow按钮不显示的情况 <div> 虽然现在我们已经掌握了不少ActionBar的用法,但是当你真正去使用它的时候还是可能会遇到各种各样的问题,比如很多人都会碰到overflow按钮不显示的情况。明明是同样的一份代码,overflow按钮在有些手机上会显示,而在有些手机上偏偏就不显示,这是为什么呢?后来我总结了一下,overflow按钮的显示情况和手机的硬件情况是有关系的,如果手机没有物理Menu键的话,overflow按钮就可以显示,如果有物理Menu键的话,overflow按钮就不会显示出来。比如我们启动一个有Menu键的模拟器,然后将代码运行到该模拟器上,结果如下图所示: </div> <div> ![](http://img.blog.csdn.net/20140603224128421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 可以看到,ActionBar最右边的overflow按钮不见了!那么此时我们如何查看隐藏在overflow中的Action按钮呢?其实非常简单,按一下Menu键,隐藏的内容就会从底部出来了,如下图所示: </div> <div> ![](http://img.blog.csdn.net/20140603224335953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 看到这里相信不少朋友都想吐槽一下了,这显然是一种非常蛋疼的设计,在不同手机上竟然显示了不同的界面,而且操作方法也完全不一样,这样会给用户一种非常不习惯的感觉。话说Google为什么要把ActionBar的overflow设计成这样我也不太理解,但是我们还是有办法改变这一默认行为的。 </div> <div> 实际上,在ViewConfiguration这个类中有一个叫做sHasPermanentMenuKey的静态变量,系统就是根据这个变量的值来判断手机有没有物理Menu键的。当然这是一个内部变量,我们无法直接访问它,但是可以通过反射的方式修改它的值,让它永远为false就可以了,代码如下所示: <div class="dp-highlighter bg_java"> <div class="bar"> <div class="tools" style="color: silver;"> **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> &#8230;&#8230; </span> - <span style="color: black;"> setOverflowShowingAlways(); </span> - <span style="color: black;">} </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> setOverflowShowingAlways() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">try</span> { </span> - <span style="color: black;"> ViewConfiguration config = ViewConfiguration.get(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>); </span> - <span style="color: black;"> Field menuKeyField = ViewConfiguration.<span class="keyword" style="font-weight: bold; color: #006699;">class</span>.getDeclaredField(<span class="string" style="color: blue;">&#8220;sHasPermanentMenuKey&#8221;</span>); </span> - <span style="color: black;"> menuKeyField.setAccessible(<span class="keyword" style="font-weight: bold; color: #006699;">true</span>); </span> - <span style="color: black;"> menuKeyField.setBoolean(config, <span class="keyword" style="font-weight: bold; color: #006699;">false</span>); </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">catch</span> (Exception e) { </span> - <span style="color: black;"> e.printStackTrace(); </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> </div> 这里我们在onCreate()方法的最后调用了setOverflowShowingAlways()方法,而这个方法的内部就是使用反射的方式将sHasPermanentMenuKey的值设置成false,现在重新运行一下代码,结果如下图所示: </div> <div> ![](http://img.blog.csdn.net/20140603231228859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 可以看到,即使是在有Menu键的手机上,也能让overflow按钮显示出来了,这样就可以大大增加我们软件界面和操作的统一性。 </div> <div> </div> ## <a style="color: #336699;" name="t7"></a>让Overflow中的选项显示图标 <div> 如果你点击一下overflow按钮去查看隐藏的Action按钮,你会发现这部分Action按钮都是只显示文字不显示图标的,如下图所示: </div> <div> ![](http://img.blog.csdn.net/20140603234836500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 这是官方的默认效果,Google认为隐藏在overflow中的Action按钮都应该只显示文字。当然,如果你认为这样不够美观,希望在overflow中的Action按钮也可以显示图标,我们仍然可以想办法来改变这一默认行为。 </div> <div> 其实,overflow中的Action按钮应不应该显示图标,是由MenuBuilder这个类的setOptionalIconsVisible方法来决定的,如果我们在overflow被展开的时候给这个方法传入true,那么里面的每一个Action按钮对应的图标就都会显示出来了。调用的方法当然仍然是用反射了,代码如下所示: <div class="dp-highlighter bg_java"> <div class="bar"> <div class="tools" style="color: silver;"> **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onMenuOpened(<span class="keyword" style="font-weight: bold; color: #006699;">int</span> featureId, Menu menu) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (featureId == Window.FEATURE_ACTION_BAR && menu != <span class="keyword" style="font-weight: bold; color: #006699;">null</span>) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (menu.getClass().getSimpleName().equals(<span class="string" style="color: blue;">&#8220;MenuBuilder&#8221;</span>)) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">try</span> { </span> - <span style="color: black;"> Method m = menu.getClass().getDeclaredMethod(<span class="string" style="color: blue;">&#8220;setOptionalIconsVisible&#8221;</span>, Boolean.TYPE); </span> - <span style="color: black;"> m.setAccessible(<span class="keyword" style="font-weight: bold; color: #006699;">true</span>); </span> - <span style="color: black;"> m.invoke(menu, <span class="keyword" style="font-weight: bold; color: #006699;">true</span>); </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">catch</span> (Exception e) { </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onMenuOpened(featureId, menu); </span> - <span style="color: black;">} </span> </div> 可以看到,这里我们重写了一个onMenuOpened()方法,当overflow被展开的时候就会回调这个方法,接着在这个方法的内部通过返回反射的方法将MenuBuilder的setOptionalIconsVisible变量设置为true就可以了。 </div> <div> 现在重新运行一下代码,结果如下图所示: </div> <div> ![](http://img.blog.csdn.net/20140603235840984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 好了,目前为止我们已经把ActionBar的基础知识介绍完了,那么今天的讲解就到这里 </div>

2014年7月30日 · 12 分钟 · 天边的星星

HttpURLConnection 访问图片时发生403问题,使用DefaultHttpClient就OK

请求某些网站的图片时 /** 根据一个网络连接(String)获取bitmap图像 @param imageUri @return @throws MalformedURLException */ public Bitmap getbitmap(String imageUri) { // 显示网络上的图片 Bitmap bitmap = null; try { URL myFileUrl = new URL(imageUri); HttpURLConnection conn = (HttpURLConnection) myFileUrl .openConnection(); // conn.setDoInput(true); conn.setRequestProperty(“User-agent”, “Mozilla/4.0”); conn.connect(); InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); return null; } return bitmap; } 如果不添加conn.setRequestProperty(“User-agent”, “Mozilla/4.0”);这句会造成返回的状态code是403, 使用 public Bitmap loadImageFromUrl(String url) { Bitmap d = null; // URL m; InputStream i = null; try { HttpGet get = new HttpGet(url); DefaultHttpClient client = new DefaultHttpClient(); HttpResponse re = client.execute(get); i = re.getEntity().getContent(); } catch (MalformedURLException e1) { e1.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } d = BitmapFactory.decodeStream(i); return d; } ...

2014年7月24日 · 1 分钟 · 天边的星星

安卓面试题(一)

面试题一:AIDL****的全称是什么?如何工作? Android interface definition language (android接口定义语言) , 用来跨进程的访问方法, 像 游戏中调用支付宝接口就是用的这个。 访问远程的服务的方法. 如何工作。 面试题二:Android****程序运行时权限与文件系统权限的区别? 程序运行时权限:Android程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求,打电话,访问网络,获取坐标,写sd卡,读写联系人等..安装的时候会提示用户。 文件系统权限:其实就是Linux的文件系统权限,比如-rw—— 私有权限 -rw-rw-rw- 全局可读可写,(777是可读可写可执行1+2+4)还有sharedpreference里面的Context.Mode_private Context.Mode.world_read_able Context.Mode_world_writeable夜市文件系统的权限。 **面试题三:**系统上安装了多种浏览器,能否指定某浏览器访问指定页面? 找到对应的浏览器的意图,传递数据URI , 激活这个意图 Intent .setAction(VIEW) Intent intent = new Intent(); // com.android.browser/.BrowserActivity intent.setClassName(“com.android.browser”, “com.android.browser.BrowserActivity”); Intent.setdata(uri); 像腾讯那个检测是否安装自己的浏览器,方法是queryintentactivity(),获取到所有Action。然后查里面有没有自己浏览器的action,没有的话就提示用户。 面试题四:对主线程的理解: 耗时的不能再主线程做,会anr异常,像安卓四大组件都是在主线程里面。 面试题五:Framework****工作方式及原理,Activity是如何生成一个view的,机制是什么? 所有的框架都是基于反射 和 配置文件(manifest)的。 Activity创建一个view是通过 ondraw 画出来的, 画这个view之前呢,还会调用onmeasure方法来计算显示的大小.但是Surfaceview 是直接操作硬件的,因为 或者视频播放对帧数有要求,onDraw效率太低,不够使,Surfaceview直接把数据写到显存。 面试题六:android****本身的一些限制,比如apk包大小限制,读取大文件时的时间限? 如果在broadCast里面不能超过10秒, 在service里面不能超过20秒 在主线程里面不能超过5秒。 像有些系统不能安装大文件,我们一般是把素材文件放到一个素材包而不是安装包,两者区分开。 **面试题七:**如何加载的音乐信息,如何改善其效率? Android提供mediascanner,mediaStore等接口, 音乐文件的信息都会存放到系统的数据库表中,可以通过content provider获取, 显示出来,改善效率,是个常见问题, 可以从以下几个方面作答, 分批加载数据, 延时加载数据, 合理使用缓存等… 预先加载一些 都会的使用的大的class的字节码, 提前加载. 时间换时间 空间换时间 面试题八:ListView****如何提高其效率? 异步加载数据, 分页加载数据,使用 onscallLinster(); 2.Static class ViewHolder ...

2014年7月24日 · 1 分钟 · 天边的星星

Android之监测手机网络状态的广播

今天具体说下Android检测网络状态的广播,我们在做一些手机应用的时候如果网络发生改变可能会给用户造成一些损失,在中国2G,3G网络都没有普及的情况下,基本都是包流量的,所以在做一些视频应用软件的时候,如果用户在使用WIFI的时候如果无线网络中断,手机网络会自动换手机网络,从而给用户造成不必要的损失。 Android手机在对于一些系统广播,如短信的接收,电话的接收,电池电量过低,网络状态改变都会发一个广播,既然系统会发送一条广播,那么就需要一个接收器来处理这个广播。首先定义一个类继承NetworkChangeReceiver,重写onReceive()就行了。然后在OnReceive()这个方法进行相应广播的处理。 网络状态切换的广播类: **[java]** [view plain](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)[copy](http://blog.csdn.net/lonely_fireworks/article/details/7373166#) <div> </div> </div> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">package</span> com.test; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.BroadcastReceiver; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.Intent; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.net.ConnectivityManager; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.net.NetworkInfo.State; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> BroadcastReceiver { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onReceive(Context context, Intent intent) { </span> - <span style="color: black;"> State wifiState = <span class="keyword" style="font-weight: bold; color: #006699;">null</span>; </span> - <span style="color: black;"> State mobileState = <span class="keyword" style="font-weight: bold; color: #006699;">null</span>; </span> - <span style="color: black;"> ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); </span> - <span style="color: black;"> wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); </span> - <span style="color: black;"> mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && mobileState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> </span> - <span style="color: black;"> && State.CONNECTED != wifiState </span> - <span style="color: black;"> && State.CONNECTED == mobileState) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 手机网络连接成功</span> </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && mobileState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> </span> - <span style="color: black;"> && State.CONNECTED != wifiState </span> - <span style="color: black;"> && State.CONNECTED != mobileState) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 手机没有任何的网络</span> </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && State.CONNECTED == wifiState) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 无线网络连接成功</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> 在上面这个接收类中OnReceive()方法,你可以在上面三个网络状态(只有手机网络,只有无线网络,没有任何网络)中进行相应的处理,然后在应用中注册广播,注册广播有2种方式,一种在androidmanifest.xml中注册,一种在java代码中注册。 ...

2014年7月4日 · 4 分钟 · 天边的星星

使用PHP生成二维码的两种方法(带logo图像)

随着科技的进步,二维码应用领域越来越广泛,今天我给大家分享下如何使用PHP生成二维码,以及如何生成中间带LOGO图像的二维码 **一、利用Google API生成二维码** Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: urlToEncode=”http://www.jb51.net”; generateQRfromGoogle(urlToEncode); /** * google api 二维码生成【QRcode可以存储最多4296个字母数字类型的任意文本,具体可以查看二维码数据格式】 * @param string chl 二维码包含的信息,可以是数字、字符、二进制信息、汉字。 不能混合数据类型,数据必须经过UTF-8 URL-encoded * @param intwidhtHeight 生成二维码的尺寸设置 * @param string EC_level 可选纠错级别,QR码支持四个等级纠错,用来恢复丢失的、读错的、模糊的、数据。 * L-默认:可以识别已损失的7%的数据 * M-可以识别已损失15%的数据 * Q-可以识别已损失25%的数据 * H-可以识别已损失30%的数据 * @param intmargin 生成的二维码离图片边框的距离 */ function generateQRfromGoogle(chl,widhtHeight =’150′,EC_level=’L’,margin=’0′) { chl = urlencode(chl); echo ‘widhtHeight.’x’.widhtHeight.’ &cht=qr&chld=’.EC_level.’|’.margin.’&chl=’.chl.'” alt=”QR code” widhtHeight=”‘.widhtHeight.’ ” widhtHeight=”‘.$widhtHeight.'”/>’; } 二、使用PHP二维码生成类库PHP QR Code生成二维码 PHP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址:http://phpqrcode.sourceforge.net/。 下载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2。 phpqrcode.php提供了一个关键的png()方法,其中参数text表示生成二位的的信息文本;参数outfile表示是否输出二维码图片 文件,默认否;参数level表示容错率,也就是有被覆盖的区域还能识别,分别是 L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%); 参数size表示生成图片大小,默认是3;参数margin表示二维码周围边框空白区域间距值;参数saveandprint表示是否保存二维码并 显示。 ...

2014年7月3日 · 1 分钟 · 天边的星星

Android使用PhotoView实现图片缩放功能

使用第三方开源项目,地址:https://github.com/chrisbanes/PhotoView 引入library 项目. 简单的加载一张图片: **[java]** [view plain](http://blog.csdn.net/own_1991/article/details/12186627#)[copy](http://blog.csdn.net/own_1991/article/details/12186627#) <div> </div> </div> </div> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> MainActivity <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> Activity { </span> - <span style="color: black;"> </span> - <span style="color: black;"> ImageView imgView; </span> - <span style="color: black;"> PhotoViewAttacher attacher; </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> imgView=(ImageView) findViewById(R.id.img); </span> - <span style="color: black;"> imgView.setImageResource(R.drawable.wallpaper); </span> - <span style="color: black;"> attacher=<span class="keyword" style="font-weight: bold; color: #006699;">new</span> PhotoViewAttacher(imgView); </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> 布局文件: **[html]** [view plain](http://blog.csdn.net/own_1991/article/details/12186627#)[copy](http://blog.csdn.net/own_1991/article/details/12186627#) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">RelativeLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/tools&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">&#8220;.MainActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">ImageView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/img&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">RelativeLayout</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span>

2014年6月28日 · 2 分钟 · 天边的星星

理解Android的手势识别

对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理。不过,为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们提供的手势识别工具GestureDetector就可以帮上大忙了。 基础 GestureDetector的工作原理是,当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置侦听器获得GestureDetector处理后的手势。 GestureDetector提供了两个侦听器接口,OnGestureListener处理单击类消息,OnDoubleTapListener处理双击类消息。 OnGestureListener的接口有这几个: // 单击,触摸屏按下时立刻触发 abstract boolean onDown(MotionEvent e); // 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势) abstract boolean onSingleTapUp(MotionEvent e); // 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会 abstract void onShowPress(MotionEvent e); // 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发 abstract void onLongPress(MotionEvent e); // 滚动,触摸屏按下后移动 abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY); // 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势 abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY); OnDoubleTapListener的接口有这几个: // 双击,手指在触摸屏上迅速点击第二下时触发 abstract boolean onDoubleTap(MotionEvent e); // 双击的按下跟抬起各触发一次 abstract boolean onDoubleTapEvent(MotionEvent e); // 单击确认,即很快的按下并抬起,但并不连续点击第二下 abstract boolean onSingleTapConfirmed(MotionEvent e); ...

2014年6月28日 · 2 分钟 · 天边的星星

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

本文内容: 1、横向ListView的所有实现思路; 2、其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册; 3、实现的横向ListView在点击、浏览时item背景会变色,并解决了listview里setSelected造成item的选择状态混乱的问题。 众所周知,ListView默认的方向是垂直的,但有些时候人们更喜欢横向ListView。纵观整个网络,横向ListView的实现思路如下: 1、在布局里用HorizontalScrollView包含一个ListView,参考这里; 2、利用GridView,把它的行数设为1行; 3、有人继承ListView构造了一个HorizontalScrollListView,参见:这里 4、国外一位大牛继承AdapterView构造的HorizontalListView,这是以上所有方法里本人认为最正统的方法,本文即基于此方法,参见:这里 下面看源码: 这是Activity的布局文件:activity_main.xml **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">RelativeLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/tools&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingBottom</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_vertical_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingLeft</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_horizontal_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingRight</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_horizontal_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingTop</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_vertical_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">&#8220;.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">org.yanzi.ui.HorizontalListView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/horizon_listview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;150dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_alignParentTop</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">org.yanzi.ui.HorizontalListView</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">ImageView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/image_preview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_below</span>=<span class="attribute-value" style="color: blue;">&#8220;@id/horizon_listview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_centerInParent</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:clickable</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:background</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/selector_imageview_background&#8221;</span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="comments" style="color: #008200;"><!&#8211; android:background=&#8221;@android:drawable/ic_menu_gallery&#8221; &#8211;></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">RelativeLayout</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 这是横向listview的每个item的布局,图片+文字,horizontal_list_item.xml **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><?</span><span class="tag-name" style="font-weight: bold; color: blue;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">LinearLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingLeft</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingRight</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingTop</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingBottom</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:orientation</span>=<span class="attribute-value" style="color: blue;">&#8220;vertical&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:gravity</span>=<span class="attribute-value" style="color: blue;">&#8220;center&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:clickable</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:background</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/selector_item_background&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">ImageView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/img_list_item&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">TextView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/text_list_item&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:gravity</span>=<span class="attribute-value" style="color: blue;">&#8220;center&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">LinearLayout</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 下面文件是selector_imageview_background.xml,这是大图片你点击浏览时背景发生变化的selector,没有啥实际作用。 **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><?</span><span class="tag-name" style="font-weight: bold; color: blue;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_green_light&#8221;</span> <span class="attribute" style="color: red;">android:state_pressed</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_green_light&#8221;</span> <span class="attribute" style="color: red;">android:state_focused</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/image_background&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"><span class="comments" style="color: #008200;"><!&#8211; android:drawable=&#8221;@android:color/transparent&#8221; &#8211;></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 下面是每个item的selector,在focus和select时颜色会发生变化:selector_item_background.xml **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><?</span><span class="tag-name" style="font-weight: bold; color: blue;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_red_light&#8221;</span> <span class="attribute" style="color: red;">android:state_selected</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_green_dark&#8221;</span> <span class="attribute" style="color: red;">android:state_pressed</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/transparent&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 主程序:MainActivity.java **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.testhorizontallistview; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.ui.HorizontalListView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.ui.HorizontalListViewAdapter; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.app.Activity; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.os.Bundle; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.Menu; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.AdapterView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.AdapterView.OnItemClickListener; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ImageView; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> MainActivity <span class="keyword" style="font-weight: bold; color: blue;">extends</span> Activity { </span> - <span style="color: black;"> HorizontalListView hListView; </span> - <span style="color: black;"> HorizontalListViewAdapter hListViewAdapter; </span> - <span style="color: black;"> ImageView previewImg; </span> - <span style="color: black;"> View olderSelectView = <span class="keyword" style="font-weight: bold; color: blue;">null</span>; </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> initUI(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onCreateOptionsMenu(Menu menu) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// Inflate the menu; this adds items to the action bar if it is present.</span> </span> - <span style="color: black;"> getMenuInflater().inflate(R.menu.main, menu); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> initUI(){ </span> - <span style="color: black;"> hListView = (HorizontalListView)findViewById(R.id.horizon_listview); </span> - <span style="color: black;"> previewImg = (ImageView)findViewById(R.id.image_preview); </span> - <span style="color: black;"> String[] titles = {<span class="string" style="color: red;">&#8220;怀师&#8221;</span>, <span class="string" style="color: red;">&#8220;南怀瑾军校&#8221;</span>, <span class="string" style="color: red;">&#8220;闭关&#8221;</span>, <span class="string" style="color: red;">&#8220;南怀瑾&#8221;</span>, <span class="string" style="color: red;">&#8220;南公庄严照&#8221;</span>, <span class="string" style="color: red;">&#8220;怀师法相&#8221;</span>}; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] ids = {R.drawable.nanhuaijin_miss, R.drawable.nanhuaijin_school, </span> - <span style="color: black;"> R.drawable.nanhuaijin_biguan, R.drawable.nanhuaijin, </span> - <span style="color: black;"> R.drawable.nanhuaijin_zhuangyan, R.drawable.nanhuaijin_faxiang}; </span> - <span style="color: black;"> hListViewAdapter = <span class="keyword" style="font-weight: bold; color: blue;">new</span> HorizontalListViewAdapter(getApplicationContext(),titles,ids); </span> - <span style="color: black;"> hListView.setAdapter(hListViewAdapter); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// hListView.setOnItemSelectedListener(new OnItemSelectedListener() {</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// @Override</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// public void onItemSelected(AdapterView<?> parent, View view,</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// int position, long id) {</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// // TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// if(olderSelected != null){</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// olderSelected.setSelected(false); //上一个选中的View恢复原背景</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// olderSelected = view;</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// view.setSelected(true);</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// @Override</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// public void onNothingSelected(AdapterView<?> parent) {</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// // TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// </span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// });</span> </span> - <span style="color: black;"> hListView.setOnItemClickListener(<span class="keyword" style="font-weight: bold; color: blue;">new</span> OnItemClickListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onItemClick(AdapterView<?> parent, View view, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> position, <span class="keyword" style="font-weight: bold; color: blue;">long</span> id) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// if(olderSelectView == null){</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }else{</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView.setSelected(false);</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = null;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// view.setSelected(true);</span> </span> - <span style="color: black;"> previewImg.setImageResource(ids[position]); </span> - <span style="color: black;"> hListViewAdapter.setSelectIndex(position); </span> - <span style="color: black;"> hListViewAdapter.notifyDataSetChanged(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> - <span style="color: black;"></span> </span> HorizontalListView.java 这就是自定义的横向listview **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.ui; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">/*</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * HorizontalListView.java v1.5</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> *</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * The MIT License</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * Copyright (c) 2011 Paul Soucy (paul@dev-smart.com)</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * of this software and associated documentation files (the &#8220;Software&#8221;), to deal</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * in the Software without restriction, including without limitation the rights</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * copies of the Software, and to permit persons to whom the Software is</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * furnished to do so, subject to the following conditions:</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * The above copyright notice and this permission notice shall be included in</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * all copies or substantial portions of the Software.</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * THE SOFTWARE IS PROVIDED &#8220;AS IS&#8221;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * THE SOFTWARE.</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> *</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> */</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> java.util.LinkedList; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> java.util.Queue; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.database.DataSetObserver; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Rect; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.AttributeSet; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.GestureDetector; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.GestureDetector.OnGestureListener; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.MotionEvent; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.AdapterView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ListAdapter; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.Scroller; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> HorizontalListView <span class="keyword" style="font-weight: bold; color: blue;">extends</span> AdapterView<ListAdapter> { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> mAlwaysOverrideTouch = <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> ListAdapter mAdapter; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mLeftViewIndex = &#8211;<span class="number" style="color: #c00000;">1</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mRightViewIndex = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mCurrentX; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mNextX; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mMaxX = Integer.MAX_VALUE; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mDisplayOffset = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> Scroller mScroller; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> GestureDetector mGesture; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Queue<View> mRemovedViewQueue = <span class="keyword" style="font-weight: bold; color: blue;">new</span> LinkedList<View>(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnItemSelectedListener mOnItemSelected; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnItemClickListener mOnItemClicked; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnItemLongClickListener mOnItemLongClicked; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> mDataChanged = <span class="keyword" style="font-weight: bold; color: blue;">false</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> HorizontalListView(Context context, AttributeSet attrs) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>(context, attrs); </span> - <span style="color: black;"> initView(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> initView() { </span> - <span style="color: black;"> mLeftViewIndex = &#8211;<span class="number" style="color: #c00000;">1</span>; </span> - <span style="color: black;"> mRightViewIndex = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mDisplayOffset = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mCurrentX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mNextX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mMaxX = Integer.MAX_VALUE; </span> - <span style="color: black;"> mScroller = <span class="keyword" style="font-weight: bold; color: blue;">new</span> Scroller(getContext()); </span> - <span style="color: black;"> mGesture = <span class="keyword" style="font-weight: bold; color: blue;">new</span> GestureDetector(getContext(), mOnGesture); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) { </span> - <span style="color: black;"> mOnItemSelected = listener; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setOnItemClickListener(AdapterView.OnItemClickListener listener){ </span> - <span style="color: black;"> mOnItemClicked = listener; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) { </span> - <span style="color: black;"> mOnItemLongClicked = listener; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> DataSetObserver mDataObserver = <span class="keyword" style="font-weight: bold; color: blue;">new</span> DataSetObserver() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onChanged() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span>(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>){ </span> - <span style="color: black;"> mDataChanged = <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> invalidate(); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onInvalidated() { </span> - <span style="color: black;"> reset(); </span> - <span style="color: black;"> invalidate(); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> }; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> ListAdapter getAdapter() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> mAdapter; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> View getSelectedView() { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//TODO: implement</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">null</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setAdapter(ListAdapter adapter) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mAdapter != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> mAdapter.unregisterDataSetObserver(mDataObserver); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> mAdapter = adapter; </span> - <span style="color: black;"> mAdapter.registerDataSetObserver(mDataObserver); </span> - <span style="color: black;"> reset(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> reset(){ </span> - <span style="color: black;"> initView(); </span> - <span style="color: black;"> removeAllViewsInLayout(); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setSelection(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//TODO: implement</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> addAndMeasureChild(<span class="keyword" style="font-weight: bold; color: blue;">final</span> View child, <span class="keyword" style="font-weight: bold; color: blue;">int</span> viewPos) { </span> - <span style="color: black;"> LayoutParams params = child.getLayoutParams(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(params == <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> params = <span class="keyword" style="font-weight: bold; color: blue;">new</span> LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> addViewInLayout(child, viewPos, params, <span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), </span> - <span style="color: black;"> MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onLayout(<span class="keyword" style="font-weight: bold; color: blue;">boolean</span> changed, <span class="keyword" style="font-weight: bold; color: blue;">int</span> left, <span class="keyword" style="font-weight: bold; color: blue;">int</span> top, <span class="keyword" style="font-weight: bold; color: blue;">int</span> right, <span class="keyword" style="font-weight: bold; color: blue;">int</span> bottom) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onLayout(changed, left, top, right, bottom); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mAdapter == <span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mDataChanged){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> oldCurrentX = mCurrentX; </span> - <span style="color: black;"> initView(); </span> - <span style="color: black;"> removeAllViewsInLayout(); </span> - <span style="color: black;"> mNextX = oldCurrentX; </span> - <span style="color: black;"> mDataChanged = <span class="keyword" style="font-weight: bold; color: blue;">false</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mScroller.computeScrollOffset()){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> scrollx = mScroller.getCurrX(); </span> - <span style="color: black;"> mNextX = scrollx; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mNextX <= <span class="number" style="color: #c00000;"></span>){ </span> - <span style="color: black;"> mNextX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mScroller.forceFinished(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mNextX >= mMaxX) { </span> - <span style="color: black;"> mNextX = mMaxX; </span> - <span style="color: black;"> mScroller.forceFinished(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx = mCurrentX &#8211; mNextX; </span> - <span style="color: black;"> </span> - <span style="color: black;"> removeNonVisibleItems(dx); </span> - <span style="color: black;"> fillList(dx); </span> - <span style="color: black;"> positionItems(dx); </span> - <span style="color: black;"> </span> - <span style="color: black;"> mCurrentX = mNextX; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(!mScroller.isFinished()){ </span> - <span style="color: black;"> post(<span class="keyword" style="font-weight: bold; color: blue;">new</span> Runnable(){ </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> run() { </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> fillList(<span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> edge = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> View child = getChildAt(getChildCount()-<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> edge = child.getRight(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> fillListRight(edge, dx); </span> - <span style="color: black;"> </span> - <span style="color: black;"> edge = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> child = getChildAt(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> edge = child.getLeft(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> fillListLeft(edge, dx); </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> fillListRight(<span class="keyword" style="font-weight: bold; color: blue;">int</span> rightEdge, <span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), <span class="keyword" style="font-weight: bold; color: blue;">this</span>); </span> - <span style="color: black;"> addAndMeasureChild(child, &#8211;<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> rightEdge += child.getMeasuredWidth(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mRightViewIndex == mAdapter.getCount()-<span class="number" style="color: #c00000;">1</span>) { </span> - <span style="color: black;"> mMaxX = mCurrentX + rightEdge &#8211; getWidth(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (mMaxX < <span class="number" style="color: #c00000;"></span>) { </span> - <span style="color: black;"> mMaxX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> mRightViewIndex++; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> fillListLeft(<span class="keyword" style="font-weight: bold; color: blue;">int</span> leftEdge, <span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(leftEdge + dx > <span class="number" style="color: #c00000;"></span> && mLeftViewIndex >= <span class="number" style="color: #c00000;"></span>) { </span> - <span style="color: black;"> View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), <span class="keyword" style="font-weight: bold; color: blue;">this</span>); </span> - <span style="color: black;"> addAndMeasureChild(child, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> leftEdge -= child.getMeasuredWidth(); </span> - <span style="color: black;"> mLeftViewIndex&#8211;; </span> - <span style="color: black;"> mDisplayOffset -= child.getMeasuredWidth(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> removeNonVisibleItems(<span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> View child = getChildAt(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span> && child.getRight() + dx <= <span class="number" style="color: #c00000;"></span>) { </span> - <span style="color: black;"> mDisplayOffset += child.getMeasuredWidth(); </span> - <span style="color: black;"> mRemovedViewQueue.offer(child); </span> - <span style="color: black;"> removeViewInLayout(child); </span> - <span style="color: black;"> mLeftViewIndex++; </span> - <span style="color: black;"> child = getChildAt(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> child = getChildAt(getChildCount()-<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span> && child.getLeft() + dx >= getWidth()) { </span> - <span style="color: black;"> mRemovedViewQueue.offer(child); </span> - <span style="color: black;"> removeViewInLayout(child); </span> - <span style="color: black;"> mRightViewIndex&#8211;; </span> - <span style="color: black;"> child = getChildAt(getChildCount()-<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> positionItems(<span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(getChildCount() > <span class="number" style="color: #c00000;"></span>){ </span> - <span style="color: black;"> mDisplayOffset += dx; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> left = mDisplayOffset; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">for</span>(<span class="keyword" style="font-weight: bold; color: blue;">int</span> i=<span class="number" style="color: #c00000;"></span>;i<getChildCount();i++){ </span> - <span style="color: black;"> View child = getChildAt(i); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> childWidth = child.getMeasuredWidth(); </span> - <span style="color: black;"> child.layout(left, <span class="number" style="color: #c00000;"></span>, left + childWidth, child.getMeasuredHeight()); </span> - <span style="color: black;"> left += childWidth + child.getPaddingRight(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> scrollTo(<span class="keyword" style="font-weight: bold; color: blue;">int</span> x) { </span> - <span style="color: black;"> mScroller.startScroll(mNextX, <span class="number" style="color: #c00000;"></span>, x &#8211; mNextX, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> dispatchTouchEvent(MotionEvent ev) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> handled = <span class="keyword" style="font-weight: bold; color: blue;">super</span>.dispatchTouchEvent(ev); </span> - <span style="color: black;"> handled |= mGesture.onTouchEvent(ev); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> handled; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onFling(MotionEvent e1, MotionEvent e2, <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityX, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityY) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span>(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>){ </span> - <span style="color: black;"> mScroller.fling(mNextX, <span class="number" style="color: #c00000;"></span>, (<span class="keyword" style="font-weight: bold; color: blue;">int</span>)-velocityX, <span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>, mMaxX, <span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onDown(MotionEvent e) { </span> - <span style="color: black;"> mScroller.forceFinished(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnGestureListener mOnGesture = <span class="keyword" style="font-weight: bold; color: blue;">new</span> GestureDetector.SimpleOnGestureListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onDown(MotionEvent e) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>.onDown(e); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onFling(MotionEvent e1, MotionEvent e2, <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityX, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityY) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>.onFling(e1, e2, velocityX, velocityY); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onScroll(MotionEvent e1, MotionEvent e2, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span> distanceX, <span class="keyword" style="font-weight: bold; color: blue;">float</span> distanceY) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span>(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>){ </span> - <span style="color: black;"> mNextX += (<span class="keyword" style="font-weight: bold; color: blue;">int</span>)distanceX; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onSingleTapConfirmed(MotionEvent e) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">for</span>(<span class="keyword" style="font-weight: bold; color: blue;">int</span> i=<span class="number" style="color: #c00000;"></span>;i<getChildCount();i++){ </span> - <span style="color: black;"> View child = getChildAt(i); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (isEventWithinView(e, child)) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mOnItemClicked != <span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> mOnItemClicked.onItemClick(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, child, mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i, mAdapter.getItemId( mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i )); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mOnItemSelected != <span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> mOnItemSelected.onItemSelected(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, child, mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i, mAdapter.getItemId( mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i )); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">break</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onLongPress(MotionEvent e) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> childCount = getChildCount(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">for</span> (<span class="keyword" style="font-weight: bold; color: blue;">int</span> i = <span class="number" style="color: #c00000;"></span>; i < childCount; i++) { </span> - <span style="color: black;"> View child = getChildAt(i); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (isEventWithinView(e, child)) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (mOnItemLongClicked != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> mOnItemLongClicked.onItemLongClick(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, child, mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i, mAdapter.getItemId(mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i)); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">break</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> isEventWithinView(MotionEvent e, View child) { </span> - <span style="color: black;"> Rect viewRect = <span class="keyword" style="font-weight: bold; color: blue;">new</span> Rect(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] childPosition = <span class="keyword" style="font-weight: bold; color: blue;">new</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[<span class="number" style="color: #c00000;">2</span>]; </span> - <span style="color: black;"> child.getLocationOnScreen(childPosition); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> left = childPosition[<span class="number" style="color: #c00000;"></span>]; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> right = left + child.getWidth(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> top = childPosition[<span class="number" style="color: #c00000;">1</span>]; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> bottom = top + child.getHeight(); </span> - <span style="color: black;"> viewRect.set(left, top, right, bottom); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> viewRect.contains((<span class="keyword" style="font-weight: bold; color: blue;">int</span>) e.getRawX(), (<span class="keyword" style="font-weight: bold; color: blue;">int</span>) e.getRawY()); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }; </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> - <span style="color: black;"></span> </span> HorizontalListViewAdapter.java 横向listview的适配器,我将他单独写到一个java文件里。 **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.ui; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.testhorizontallistview.R; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.util.BitmapUtil; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Bitmap; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.drawable.Drawable; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.media.ThumbnailUtils; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.LayoutInflater; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.ViewGroup; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.BaseAdapter; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ImageView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.TextView; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> HorizontalListViewAdapter <span class="keyword" style="font-weight: bold; color: blue;">extends</span> BaseAdapter{ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] mIconIDs; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> String[] mTitles; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Context mContext; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> LayoutInflater mInflater; </span> - <span style="color: black;"> Bitmap iconBitmap; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> selectIndex = &#8211;<span class="number" style="color: #c00000;">1</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> HorizontalListViewAdapter(Context context, String[] titles, <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] ids){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mContext = context; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mIconIDs = ids; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mTitles = titles; </span> - <span style="color: black;"> mInflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);<span class="comment" style="color: #008200;">//LayoutInflater.from(mContext);</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> getCount() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> mIconIDs.length; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> Object getItem(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> position; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">long</span> getItemId(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> position; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> View getView(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position, View convertView, ViewGroup parent) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> ViewHolder holder; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(convertView==<span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> holder = <span class="keyword" style="font-weight: bold; color: blue;">new</span> ViewHolder(); </span> - <span style="color: black;"> convertView = mInflater.inflate(R.layout.horizontal_list_item, <span class="keyword" style="font-weight: bold; color: blue;">null</span>); </span> - <span style="color: black;"> holder.mImage=(ImageView)convertView.findViewById(R.id.img_list_item); </span> - <span style="color: black;"> holder.mTitle=(TextView)convertView.findViewById(R.id.text_list_item); </span> - <span style="color: black;"> convertView.setTag(holder); </span> - <span style="color: black;"> }<span class="keyword" style="font-weight: bold; color: blue;">else</span>{ </span> - <span style="color: black;"> holder=(ViewHolder)convertView.getTag(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(position == selectIndex){ </span> - <span style="color: black;"> convertView.setSelected(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> }<span class="keyword" style="font-weight: bold; color: blue;">else</span>{ </span> - <span style="color: black;"> convertView.setSelected(<span class="keyword" style="font-weight: bold; color: blue;">false</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> holder.mTitle.setText(mTitles[position]); </span> - <span style="color: black;"> iconBitmap = getPropThumnail(mIconIDs[position]); </span> - <span style="color: black;"> holder.mImage.setImageBitmap(iconBitmap); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> convertView; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">static</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> ViewHolder { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> TextView mTitle ; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> ImageView mImage; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Bitmap getPropThumnail(<span class="keyword" style="font-weight: bold; color: blue;">int</span> id){ </span> - <span style="color: black;"> Drawable d = mContext.getResources().getDrawable(id); </span> - <span style="color: black;"> Bitmap b = BitmapUtil.drawableToBitmap(d); </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// Bitmap bb = BitmapUtil.getRoundedCornerBitmap(b, 100);</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> w = mContext.getResources().getDimensionPixelOffset(R.dimen.thumnail_default_width); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> h = mContext.getResources().getDimensionPixelSize(R.dimen.thumnail_default_height); </span> - <span style="color: black;"> </span> - <span style="color: black;"> Bitmap thumBitmap = ThumbnailUtils.extractThumbnail(b, w, h); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> thumBitmap; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setSelectIndex(<span class="keyword" style="font-weight: bold; color: blue;">int</span> i){ </span> - <span style="color: black;"> selectIndex = i; </span> - <span style="color: black;"> } </span> - <span style="color: black;">}</span> </span> 下面是效果图: ![](http://img.blog.csdn.net/20140315182924656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 下图是一个item被选定后,另一个item获得了焦点: ![](http://img.blog.csdn.net/20140315183047562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 下面是横向时的截图: ![](http://img.blog.csdn.net/20140315183137906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 要点如下: 1、可以说这个HorizontalListView是完美的,但美中不足的并不是其他人说的不能点击、晃动、加载不全的问题,而是这个横向Listview的高度,如果你设成wrap_cotent那么将会占据整个屏幕,**即使你将它适配器里的view的高度限制死,限制成很小,这个HorizontalListView的高度依然是全屏**。本文代码里,我把图片缩略图弄成100dip,所以把这个HorizontalListView的高度设为了150dip。 2、在适配器里,我填充了一个图片,下面是文字。为了能让浏览图片时item有反应,搞了一个selector,它的用法详见[这里](http://blog.csdn.net/shakespeare001/article/details/7788400). 但一开始在点击时完全没有反应,参考这里: [http://blog.csdn.net/ljz2009y/article/details/18820071](http://blog.csdn.net/ljz2009y/article/details/18820071) 为此我的selector如下: <?xml version=”1.0″ encoding=”utf-8″?> 将自然状态下的背景放到了最后,但点击浏览时依然没有作用。**其实最根本原因是在布局文件里horizontal_list_item.xml要让这个布局能够clickable,即:android:clickable=”true”** 3、上一步完成了,还需要点击即select一个item时,让它变色并且保持住,然后点击另外一个item时,让之前得item恢复默认背景。为了实现这个问题,我曾作如下尝试: **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="comment" style="color: #008200;">// if(olderSelectView == null){</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }else{</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView.setSelected(false);</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = null;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// view.setSelected(true);</span></span> </span> 即在click监听里,保存上一个选中的view。遗憾的是这种方法会造成item的选中状态造成混乱,比如第一个item选中了,同时第5个item也莫名其妙的被选中了。上述情况发生在滑动时,即一屏显示不完的情况下。当我横屏时,在所有的item都能一次性显示出来情况下,用上述方法么问题。后来我想到,这可以是适配器里的缓存机制造成的,**<span style="color: #ff0000;">最好不要再listview适配器外对item作修改,即便修改则一定要调适配器的: hListViewAdapter.notifyDataSetChanged();通知刷新view,毕竟适配器才是view的提供者</span>**。参考这位大大的文章:[http://longyi-java.iteye.com/blog/976067](http://longyi-java.iteye.com/blog/976067) 在适配器里加了一个接口保存选中的索引,然后再getView函数里进行判断。如果是选中的item,则将布局设为选中状态即可,horizontal_list_item.xml里的Linearlayout就会自动加载那个selector了。而无需像这个参考链接里对每个item的元素分别设置状态。</div> <div> 4、BitmapUtil是个工具类,负责将id转成一个bitmap,然后用android自带的ThumbnailUtils去提取缩略图。 </div> <div> 5、之所以horizontal_list_item布局里要设置padding是为了选中item时,整个item有种被圈住的感觉,而不是光下面一点变色。 </div> <div> 源码下载:[http://download.csdn.net/detail/yanzi1225627/7046295](http://download.csdn.net/detail/yanzi1225627/7046295)</div> <div> 欢迎Android爱好者加群 <div id="group_name" class="group_name usrInputFont"> <span class="qname" title="Android您问我讲-2">**Android您问我讲-2,**</span> </div> **群号:**<span id="group_number" class="group_number">**19241311,备注:yanzi**</span> </div> <div> </div> <div> &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;本文系原创,转载请注明作者:yanzi1225627 </div> <div> </div> <div> </div> <div> 源码下载:[http://download.csdn.net/detail/yanzi1225627/7046295](http://download.csdn.net/detail/yanzi1225627/7046295) </div> <div> 源码下载:[http://download.csdn.net/detail/yanzi1225627/7046295](http://download.csdn.net/detail/yanzi1225627/7046295) </div>

2014年6月27日 · 37 分钟 · 天边的星星

Android代码实现长按显示波纹外扩动画

项目两张图片: wave btn 代码: package com.example.waveanimation; import Android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.animation.AlphaAnimation; import android.view.animation.AnimationSet; import android.view.animation.ScaleAnimation; import android.widget.ImageView; public class MainActivity extends Activity { private static final int ANIMATIONEACHOFFSET = 600; // 每个动画的播放时间间隔 private AnimationSet aniSet, aniSet2, aniSet3; private ImageView btn, wave1, wave2, wave3; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x222) { wave2.startAnimation(aniSet2); } else if (msg.what == 0x333) { wave3.startAnimation(aniSet3); } super.handleMessage(msg); } ...

2014年6月27日 · 2 分钟 · 天边的星星

Android 两Activity之间动画效果———翻页效果

用Android rotate动画实现翻页效果,效果如图: ![](http://img.blog.csdn.net/20130826221333046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhemFpOTYzMTg0NzA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 要实现上面动画,首先搞明白rotate动画原理; (1)Degrees坐标: 0度(360度) 270度![](http://img.blog.csdn.net/20130826214747859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhemFpOTYzMTg0NzA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 90度 顺时针旋转 180 (2)rotate 关键属性 fromDegrees 开始旋转时角度 toDegrees 结束时的角度 pivotX,pivotY 旋转时的中心点 他们范围是 0—100%p (0,0)代表左上角,(100%p, 100%p)右下角 duration 动画持续时间 毫秒为单位 知道了这两点就可以实现了 在res新建 anim 文件夹 新建 离开Activity时的xml **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><?</span><span class="tag-name" style="font-weight: bold; color: #993300;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">rotate</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:duration</span>=<span class="attribute-value" style="color: blue;">&#8220;500&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:fromDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotX</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotY</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:toDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> <span style="color: #000000;">新建 进入Activity时的xml</span> **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><?</span><span class="tag-name" style="font-weight: bold; color: #993300;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">rotate</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:duration</span>=<span class="attribute-value" style="color: blue;">&#8220;500&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:fromDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;90&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotX</span>=<span class="attribute-value" style="color: blue;">&#8220;100%p&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotY</span>=<span class="attribute-value" style="color: blue;">&#8220;100%p&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:toDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> <span style="color: #000000;">最后就是代码调用了</span> **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) - <span style="color: black;">Intent <span class="attribute" style="color: red;">intent</span> = <span class="attribute-value" style="color: blue;">new</span> Intent(ActivityAnimationDemo.this, activtyanimationdemo2.class); </span> - <span style="color: black;">startActivity(intent); </span> - <span style="color: black;">overridePendingTransition(R.anim.rotate_left, R.anim.rotate_right); </span> 解释一下应放入的参数 **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) - <span style="color: black;">overridePendingTransition(进入时的动画,离开时的动画) </span> &nbsp; [源码下载](http://download.csdn.net/detail/huazai963184709/6016175)(为了方便,把移动和 旋转动画代码写一块了)

2014年6月23日 · 3 分钟 · 天边的星星