在经过被折磨了两天之后,终于搞出来了。。。
下载地址https://github.com/ManuelPeinado/FadingActionBar
我用的Android studio,这绝对是个坑。。但是又太好用了。。没办法硬着头皮搞吧。(Eclipse的同学就不清楚能不能适用了)
首先,下载,解压。然后。。(建议建一个library的文件夹,用来管理这些library)
1.导入library。library包,没什么好说的。(只导入这个包就可以用)
2.导入extras-actionbarsherlock包,(extras-actionbarcompat效果是差不多的具体我也没搞清楚- -)
ok,问题来了,有时候你会发现,library包或者actionbarsherlock导不进去!这是有多坑!
解决办法:这是Android studio的一个bug,已经存在了好久了。。方法就是重命名library包,或者剪切到其他文件夹。
然后你又会发现,这些根本编译不了。。因为很多文件不适用,有的因为找不到,有的因为版本不够。
ok,一个一个来。先去改library的。(就是你改了名字的)
Android studio是用gradle来把代码整合编译的,(这样说可能有点不准确,但是我是这样理解的)所以找到对应Module里的build.gradle文件,更改里面的内容。
很多东西系统自动找不到,你可以把那些删了,改成自己的。我的就改成了这样。
apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion "20.0.0"
defaultConfig {
versionCode 1
versionName "1.0"
targetSdkVersion 19
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
}
}
}
//apply from: '../maven_push.gradle'
注意最后一行注释或者删掉。
然后是另一个。
apply plugin: 'android-library'
dependencies {
compile project(':library')
compile "com.android.support:support-v4:20.0.0"
compile ("com.actionbarsherlock:actionbarsherlock:[4.4,)@aar") {
// Need to specifically exclude this as it is specified in ActionBarSherlock pom
exclude group: 'com.google.android', module: 'support-v4'
}
}
android {
compileSdkVersion 19
buildToolsVersion '20.0.0'
defaultConfig {
versionName '1.0'
versionCode 19
targetSdkVersion 19
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
}
}
}
//apply from: '../maven_push.gradle'
注意最开始那几行, compile project(':library') 就是引用原来的那个library,如果你改了那个library的名字,这里改成相应的名字就可以了。
compile "com.android.support:support-v4:20.0.0" support包,这里如果不改的话会报Android L的错,就是你用的最低版本太低了,不能适用于Android L,这里原来是[n,m)高中数学,想想就记起来了吧。它会默认使用最高版本的支持包,所以才会出错。
接下来就好点了。
原本这里是需要配置文件的,就是在项目的最外面,不过我觉得还是自己改了来的方便。
3.使用
(1)首先引入library(或者extras-actionbarsherlock,建议使用library包),这一个包就够了,其他的这个都已经包含了,所以不用管其他的。
(2)布局。先看下面一段FadingActionBarHelper的代码。知道这几块就好了。
FadingActionBarHelper helper = new FadingActionBarHelper()
.actionBarBackground(R.drawable.ab_background) //当listView到最上面时的actionbar
.headerLayout(R.layout.header) //listView上面一块的layout
.contentLayout(R.layout.activity_listview); //下面的listView
转回布局,由这三个方法可以看出,这三块其实是分开的,所以才能达到把图片顶出的效果。
.actionBarBackground就是一张图片
.headerLayout是你想方在listview上面的layout
.contentLayout(R.layout.activity_listview); 你的listview
(3)Activity 基本上都讲了。直接上代码吧。
.headerLayout(R.layout.header)
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/image_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/shuihan" />
.contentLayout(R.layout.activity_listview);
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/list"
android:cacheColorHint="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="match_parent" />
这里要注意,
listview的id一定要用@android格式的,不然是没有效果的。(因为这个id是library自己定义好的,在滑动的时候需要得到这个id)
然后是Activity
package com.example.app.fadingactionbar;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.manuelpeinado.fadingactionbar.FadingActionBarHelper;
import java.util.ArrayList;
import java.util.List;
public class MyActivity extends Activity {
private ListView listview;
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FadingActionBarHelper helper = new FadingActionBarHelper()
.actionBarBackground(R.drawable.ab_background) //当listView到最上面时的actionbar
.headerLayout(R.layout.header) //listView上面一块的layout
.contentLayout(R.layout.activity_listview); //下面的listView
setContentView(helper.createView(this));
helper.initActionBar(this);
list = new ArrayList<String>();
for (int i = 0; i < 40; i++) {
list.add("test1");
}
listview = (ListView) findViewById(android.R.id.list);
listview.setAdapter(new mAdapter());
}
class mAdapter extends BaseAdapter {
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view == null){
view = getLayoutInflater().inflate(R.layout.listview_item,null);
TextView title = (TextView) view.findViewById(R.id.title);
title.setText(list.get(i));
}
return view;
}
}
}
注意listview的findviewbyid哦
还有就是。。(废话真多)开源项目的更新是我们无法想象的,一定要多去尝试,多去折腾,问题解决的那一刻,那种感觉是什么都替代不了的。