您的位置:首页 > 其它

用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: