用V4包中的DrawerLayout实现下拉刷…
2016-02-26 20:06
211 查看
在V4包中有个android.support.v4.widget.DrawerLayout可以方便的实现下拉刷新和侧滑,其中下拉刷新是用Android系统自带的控件,很不好看。但还是可以看看效果。
首先xml布局文件:
http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:id="@+id/refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/white"
android:clickable="true"
android:padding="5dp"
android:scrollbars="none" >
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
其中ScrollView是侧滑,暂且不提。FrameLayout中的android.support.v4.widget.SwipeRefreshLayout才是关键。在SwipeRefreshLayout中可以添加自己定义的布局了。
MainActivity是这样写的:
public class MainActivity extends ActionBarActivity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private SwipeRefreshLayout refreshLayout;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
refreshLayout =
(SwipeRefreshLayout) findViewById(R.id.refresh_layout);
refreshLayout
.setOnRefreshListener(new
SwipeRefreshLayout.OnRefreshListener() {
@Override
public
void onRefresh() {
new
Handler().postDelayed(new Runnable() {
@Override
public
void run() {
refreshLayout.setRefreshing(true);
}
},
1000);
}
});
mDrawerLayout =
(DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new
ActionBarDrawerToggle(this,
mDrawerLayout,
R.drawable.ic_drawer,
R.string.drawer_open,
R.string.drawer_close
);
// Set the drawer toggle as
the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);
ViewTreeObserver vto =
refreshLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new
ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressLint("NewApi")
public void
onGlobalLayout() {
final
DisplayMetrics metrics = getResources()
.getDisplayMetrics();
Float
mDistanceToTriggerSync = Math.min(
(refreshLayout.getHeight()
* 0.6f),
500
* metrics.density);
try
{
Field
field = SwipeRefreshLayout.class
.getDeclaredField("mDistanceToTriggerSync");
field.setAccessible(true);
field.setFloat(refreshLayout,
mDistanceToTriggerSync);
}
catch (Exception e) {
e.printStackTrace();
}
ViewTreeObserver
obs = refreshLayout.getViewTreeObserver();
obs.removeOnGlobalLayoutListener(this);
}
});
}
@Override
protected void onPostCreate(Bundle
savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after
onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration
newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem
item) {
if
(mDrawerToggle.onOptionsItemSelected(item)) {
return
true;
}
return
super.onOptionsItemSelected(item);
}
}
因为谷歌自动带的refresh不能下拉太多距离,刚下拉一点就会回到原来的样子,所以其中有一段反射的代码:
ViewTreeObserver vto =
refreshLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new
ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressLint("NewApi")
public void
onGlobalLayout() {
final
DisplayMetrics metrics = getResources()
.getDisplayMetrics();
Float
mDistanceToTriggerSync = Math.min(
(refreshLayout.getHeight()
* 0.6f),
500
* metrics.density);
try
{
Field
field = SwipeRefreshLayout.class
.getDeclaredField("mDistanceToTriggerSync");
field.setAccessible(true);
field.setFloat(refreshLayout,
mDistanceToTriggerSync);
}
catch (Exception e) {
e.printStackTrace();
}
ViewTreeObserver
obs = refreshLayout.getViewTreeObserver();
obs.removeOnGlobalLayoutListener(this);
}
});
其主要功能是用来添加距离的。
至于侧滑,则使用的是ScrollView,实例中使用的是Left,也可以添加一个right,这样就可以左右侧滑
实例代码链接如下:
http://download.csdn.net/detail/sll110223/8355801
首先xml布局文件:
http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:id="@+id/refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/white"
android:clickable="true"
android:padding="5dp"
android:scrollbars="none" >
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
其中ScrollView是侧滑,暂且不提。FrameLayout中的android.support.v4.widget.SwipeRefreshLayout才是关键。在SwipeRefreshLayout中可以添加自己定义的布局了。
MainActivity是这样写的:
public class MainActivity extends ActionBarActivity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private SwipeRefreshLayout refreshLayout;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
refreshLayout =
(SwipeRefreshLayout) findViewById(R.id.refresh_layout);
refreshLayout
.setOnRefreshListener(new
SwipeRefreshLayout.OnRefreshListener() {
@Override
public
void onRefresh() {
new
Handler().postDelayed(new Runnable() {
@Override
public
void run() {
refreshLayout.setRefreshing(true);
}
},
1000);
}
});
mDrawerLayout =
(DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new
ActionBarDrawerToggle(this,
mDrawerLayout,
R.drawable.ic_drawer,
R.string.drawer_open,
R.string.drawer_close
);
// Set the drawer toggle as
the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);
ViewTreeObserver vto =
refreshLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new
ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressLint("NewApi")
public void
onGlobalLayout() {
final
DisplayMetrics metrics = getResources()
.getDisplayMetrics();
Float
mDistanceToTriggerSync = Math.min(
(refreshLayout.getHeight()
* 0.6f),
500
* metrics.density);
try
{
Field
field = SwipeRefreshLayout.class
.getDeclaredField("mDistanceToTriggerSync");
field.setAccessible(true);
field.setFloat(refreshLayout,
mDistanceToTriggerSync);
}
catch (Exception e) {
e.printStackTrace();
}
ViewTreeObserver
obs = refreshLayout.getViewTreeObserver();
obs.removeOnGlobalLayoutListener(this);
}
});
}
@Override
protected void onPostCreate(Bundle
savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after
onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration
newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem
item) {
if
(mDrawerToggle.onOptionsItemSelected(item)) {
return
true;
}
return
super.onOptionsItemSelected(item);
}
}
因为谷歌自动带的refresh不能下拉太多距离,刚下拉一点就会回到原来的样子,所以其中有一段反射的代码:
ViewTreeObserver vto =
refreshLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new
ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressLint("NewApi")
public void
onGlobalLayout() {
final
DisplayMetrics metrics = getResources()
.getDisplayMetrics();
Float
mDistanceToTriggerSync = Math.min(
(refreshLayout.getHeight()
* 0.6f),
500
* metrics.density);
try
{
Field
field = SwipeRefreshLayout.class
.getDeclaredField("mDistanceToTriggerSync");
field.setAccessible(true);
field.setFloat(refreshLayout,
mDistanceToTriggerSync);
}
catch (Exception e) {
e.printStackTrace();
}
ViewTreeObserver
obs = refreshLayout.getViewTreeObserver();
obs.removeOnGlobalLayoutListener(this);
}
});
其主要功能是用来添加距离的。
至于侧滑,则使用的是ScrollView,实例中使用的是Left,也可以添加一个right,这样就可以左右侧滑
实例代码链接如下:
http://download.csdn.net/detail/sll110223/8355801
相关文章推荐
- 模仿微信6.0的界面效果
- 自定义的上下拉刷新和SwipeListVie…
- Android获取屏幕宽度与长度的三个…
- 解决ListView在ScrollView中无法展…
- 如何用android sharedprefere…
- Android应用程序中,activity的管…
- perl print 与 加减乘除
- matlab 按照某列以行为单位进行排序
- 处理多个网络请求的并发的情况
- linux 利用 logrotate 管理日志
- 驾照考试:从科目一到科目四,全都是你要了解的!!(全干货)
- PHP Laravel学习实践(一)最出色的php框架,让代码成为艺术
- Object-C文件操作
- 关于链接sshd不通的几种情况--->connection refused
- perl 读取图片
- 【CodeForces 625C】K-special Tables
- 当你输入一个网址的时候,实际会发生什么? (转)
- perl 爬取 csdn 博客
- perl 登录盈盈理财
- NSDictionary和NSMutableDictionary