前段时间一直都在忙于研究生电子设计大赛和梅特勒创意大赛,所以这几个月几乎没有怎么更新博客,现在比赛已经结束了,我就想趁这段时间把之前做的App的功能提取出来分开进行一个讲解,因为App整体是为智能硬件(运动手环和三激光测量系统)提供服务的,叙述整体的功能用处不大。
这一部分想提一下Drawer的使用,对于Drawer的基本官方框架网上都有的,但是我并没有找到带有顶部主题的,于是自己探索了一下,添加了部分xml文件,完成了类似下图的效果。
同官方给的区别主要就在xml文件里面,下面直接贴上代码
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/center_main_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0.91"> </FrameLayout> <LinearLayout android:layout_width="260dp" android:layout_height="match_parent" android:background="#fff" android:orientation="vertical" android:gravity="center" android:layout_gravity="start"> <LinearLayout android:layout_width="match_parent" android:layout_height="150dp" android:background="@color/royalblue" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="AM-Tool" android:textSize="20dp" android:layout_marginTop="10dp" android:layout_marginLeft="15dp" android:textStyle="bold" android:textColor="@color/white"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginLeft="15dp" android:text="Edition:Develop" android:textSize="14dp" android:textStyle="normal" android:textColor="@color/white"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:layout_marginLeft="15dp" android:text="PM:ZacharyQi" android:textSize="14dp" android:textStyle="normal" android:textColor="@color/white"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:layout_marginLeft="15dp" android:text="RD:JoernLee" android:textSize="14dp" android:textStyle="normal" android:textColor="@color/white"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:layout_marginLeft="15dp" android:text="Made For METTLER TOLEDO" android:textSize="16dp" android:textStyle="bold" android:textColor="@color/white"/> </LinearLayout> <ListView android:id="@+id/left_drawer" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="15dp" android:background="@color/white" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> </LinearLayout>
关键点就是添加一个自己的Layout用作leftDrawer,然后便可以自定义显示的内容了,最后的DrawerList仍然采用listview或者recyclerview都可以。另外就是注意layout的gravity需要修改位start。
private void selectItem(int position) { // update the main content by replacing fragments FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); //采用add方式进行fragment切换 switch (position) { case 0: nowFragmentNumber = 0; if (lazerFragment == null) { lazerFragment = NewLazerFragment.newInstance("三激光距离测量"); transaction.add(R.id.center_main_content, lazerFragment); } //隐藏所有fragment hideAllFragment(transaction); //显示需要显示的fragment transaction.show(lazerFragment); break; case 1: nowFragmentNumber = 1; if (roomFragment == null) { roomFragment = NewRoomFragment.newInstance("室内测量"); transaction.add(R.id.center_main_content, roomFragment); } //隐藏所有fragment hideAllFragment(transaction); //显示需要显示的fragment transaction.show(roomFragment); break; case 2: nowFragmentNumber = 2; if (leanFragment == null) { leanFragment = NewLeanFragment.newInstance("平面倾斜度测试"); transaction.add(R.id.center_main_content, leanFragment); } //隐藏所有fragment hideAllFragment(transaction); //显示需要显示的fragment transaction.show(leanFragment); break; case 3: nowFragmentNumber = 3; if (planeFragment == null) { planeFragment = NewPlaneFragment.newInstance("平面标定"); transaction.add(R.id.center_main_content, planeFragment); } //隐藏所有fragment hideAllFragment(transaction); //显示需要显示的fragment transaction.show(planeFragment); break; case 4: nowFragmentNumber = 4; if (spaceFragment == null) { spaceFragment = NewSpaceFragment.newInstance("空间标定"); transaction.add(R.id.center_main_content, spaceFragment); } //隐藏所有fragment hideAllFragment(transaction); //显示需要显示的fragment transaction.show(spaceFragment); break; case 5: nowFragmentNumber = 5; if (measureFragment == null) { measureFragment = NewMeasureFragment.newInstance("图像测距"); transaction.add(R.id.center_main_content, measureFragment); } //隐藏所有fragment hideAllFragment(transaction); //显示需要显示的fragment transaction.show(measureFragment); break; case 6: nowFragmentNumber = 6; if (bleFragment == null) { bleFragment = BleFragment.newInstance("蓝牙设置"); transaction.add(R.id.center_main_content, bleFragment); } //隐藏所有fragment hideAllFragment(transaction); //显示需要显示的fragment transaction.show(bleFragment); break; } // 事务提交 transaction.commit(); // update selected item title, then close the drawer // 更新选择后的item和title,然后关闭菜单 mMenuListView.setItemChecked(position, true); setTitle(mMenuTitles[position]); /*mDrawerLayout.closeDrawer(mMenuListView);*/ mDrawerLayout.closeDrawers(); }
最后一句我把closeDrawer修改为closeDrawers,也可以改为closeDrawer,但是不能通过像之前一样传入listview来实现,要么直接使用closeDrawers关闭所有Drawer,要么采用gravity实现。
另外就是打开Drawer了,这个必须使用openDrawer(Gravity.START)来实现,同样不能使用原来的listview来实现,这个通常在Fragment的左上菜单点击事件实现。
imageReturn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { sDrawerActivity.getmDrawerLayout().openDrawer(Gravity.START); } });
以上就是实现带有自定义主题的Drawer的基本过程了,可以实现基本要求的功能,但是不一定是最好的,如果各位大大有更好的方法欢迎一起交流~