有没有很想实现这样子的界面,本来我还在想要怎么实现呢,后来发现有个类DrawerLayout可以轻松实现
Drawer是意思是抽屉,顾名思义,这个类帮我们实现一个抽屉一样的布局,把旁边的列表拉出来
下面代码实现啦!
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<android.support.v4.widget.DrawerLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"></FrameLayout>
</RelativeLayout>
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#ffde1b45"/>
</android.support.v4.widget.DrawerLayout>
</RelativeLayout>
分别是主界面,一般会放入Fragment
和右划,显示左边列表
主界面必须放在最上面哦,这是必须的
ListView的layout_gravity是start,一般会写成left,但是google建议写成start
DrawerLayout drawerLayout;
ListView leftLv;
ArrayAdapter<String> arrayAdapter;
ArrayList<String> arrayList;
String[] strings={"Hello","good day","bye bye"};
Fragment fragment;
HelloFragment helloFragment;
ByeByeFragment byeByeFragment;
GoodDayFragment goodDayFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drawerLayout= (DrawerLayout) findViewById(R.id.drawer_layout);
leftLv=(ListView) findViewById(R.id.left_drawer);
arrayAdapter=new ArrayAdapter<String>(this,R.layout.layout_list,R.id.list_item,strings);
leftLv.setAdapter(arrayAdapter);
FragmentManager fm=getFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
if(helloFragment==null)
{
helloFragment=HelloFragment.newInstance("","");
ft.add(R.id.main_content, helloFragment).commit();
}
leftLv.setOnItemClickListener(new DrawerItemClickListener());
}
主界面显示“Hello blank fragment”,是HelloFragment,左侧拉出列表显示"Hello","good day","bye bye"
直接调用,什么都没修改,看看效果图
真是不能再丑了,可以看到原来的Fragment变灰了,而且反应超不灵敏,划了半天没划出来,还以为没实现呢。
不过网易新闻也是超不灵敏的,所以像网易新闻那样在action bar上有个控制drawer的item是必要的。
好吧,下面开始升级
处理点击事件
添加左侧列表的OnItemClickListener
class DrawerItemClickListener implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
FragmentManager fm=getFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
Log.e("sjj","position="+position);
switch (position)
{
case 0:fragment=new HelloFragment();break;
case 1:fragment=new GoodDayFragment();break;
case 2:fragment=new ByeByeFragment();break;
}
ft.replace(R.id.main_content,fragment).commit();//显示关联的Fragment
leftLv.setItemChecked(position, true);//高亮显示被点击item
drawerLayout.closeDrawer(leftLv);//关闭leftLv
}
}
点击第二个item,跳转到这个Fragment
监听open和close事件
实现DrawerLayout.DrawerListener接口,这个接口提供回调方法onDrawerOpened()
和 onDrawerClosed()
DrawerLayout.
setDrawerListener()
另一种方法,如果activity包含action bar,可以选择继承ActionBarDrawerToggle。ActionBarDrawerToggle已经实现了DrawerLayout.DrawerListener接口。
当内容被DrawerLayout改变了,应该修改action bar,比如修改title和action bar的item
可以通过重写DrawerLayout.DrawerListener的回调方法实现
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content view
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
}