Android下拉筛选DropDownMenu
项目下载
项目在GitHub上的地址:
https://github.com/Hebin320/DropDownMenu
项目在CSDN上的下载地址:
http://download.csdn.net/detail/hebin320320/9716576
项目预览图
DropDownMenu介绍与使用
这个项目是对开源项目DropDownMenu的在实际项目中的应用。在这个项目中,实现了用自定义view和fragment两种方式完成了对DropDownMenu的使用,一个view独立成一个类,通过接口的方式供Activity调用,同时解决了复用自定义view的问题。通过这个项目,可以能够很清楚地搭建一个下拉筛选框,不仅能供多个Activity使用同一个view,而且还大大减少了Activity中的代码量。
DropDownMenu在github上的地址:
https://github.com/fg2q1q3q/DropDownMenu
项目使用
Gradle
在project 中build.gradle下增加:
allprojects {repositories {...maven { url "https://jitpack.io" }}}
在app module中增加:
dependencies {compile 'com.github.fg2q1q3q:DropDownMenu:1.1.1'}
layout
<com.zxl.library.DropDownMenuandroid:id="@+id/dropDownMenu"android:layout_width="match_parent"android:layout_height="match_parent"app:ddmenuTextSize="13sp" //tab字体大小app:ddtextUnselectedColor="@color/drop_down_unselected" //tab未选中颜色app:ddtextSelectedColor="@color/drop_down_selected" //tab选中颜色app:ddmenuSelectedIcon="@mipmap/drop_down_selected_icon" //tab选中状态图标app:ddmenuUnselectedIcon="@mipmap/drop_down_unselected_icon"//tab未选中状态图标app:ddmaskColor="@color/mask_color" //遮罩颜色,一般是半透明app:ddmenuBackgroundColor="@color/white" //tab 背景颜色app:ddmenuMaxHeight="280dp"//筛选菜单最大高度,默认为wrapapp:ddneedSetSlectedColor="true"//设置选中option后tab是否改变颜色.../>
注意:DropDownMenu高度必须是match_parent,否则动画效果会出现问题
Activity中,除了下拉筛选框之外,还有它的主体内容,一般情况下是个列表;这里需要说明的是,主体内容的控件不是写在DropDownMenu的下方,而是通过view的形式,设置给DropDownMenu。
所以,新建一个xml,名字为activity_main_view
,里面就放了个TextView,用来显示筛选框选中的文字,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"android:orientation="vertical"android:layout_gravity="center"><TextView
android:id="@+id/tv_text"android:layout_width="match_parent"android:layout_height="match_parent"android:text="哈哈哈哈哈哈哈哈哈哈"android:gravity="center"/></LinearLayout>
从预览图可以看出,筛选框里面有四个界面,前两个界面是用实例化xml的方式来实现界面内容的自定义,后两个界面用Fragment的方式实现的;前两个界面的实现方式是一样的,后两个界面实现了给Fragment传参从而显示不同的内容。
第一个界面的xml,layout_first,界面只有两个按钮,实现点击改变Activity中文本框的文本;代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"android:orientation="horizontal"android:layout_gravity="center"><TextViewandroid:id="@+id/btn_one"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:background="@color/colorPrimary"android:gravity="center"android:padding="8dp"android:text="第一个"android:textColor="@color/white"android:textSize="16sp" /><TextViewandroid:id="@+id/btn_two"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:background="@drawable/ok_bg"android:gravity="center"android:padding="8dp"android:text="第二个"android:textColor="@color/white"android:textSize="16sp" /></LinearLayout>
新建一个类,名字叫做FirstView.class
,实例化xml,并对相应的控件做相应的操作,代码如下:
class FirstView {private Context context;private MyItemClickListener listener;FirstView(Context context) {this.context = context;}/*** 供Activity调用的方法 ,将选择的值传给Activity* */void setListener(MyItemClickListener listener) {this.listener = listener;}View firstView() {View view = LayoutInflater.from(context).inflate(R.layout.layout_first, null);TextView tvBtnOne = (TextView) view.findViewById(R.id.btn_one);TextView tvBtnTwo = (TextView) view.findViewById(R.id.btn_two);tvBtnOne.setOnClickListener(new mClick("第一个"));tvBtnTwo.setOnClickListener(new mClick("第二个"));return view;}private class mClick implements View.OnClickListener {String string;private mClick(String string) {this.string = string;}@Overridepublic void onClick(View v) {listener.onItemClick(v, 1, string);}}}
然后,新建一个Fragment,ThirdView.class
,xml中是三个文本框,Fragment的代码如下:
public class ThirdView extends Fragment {@InjectView(R.id.tv_01)TextView tv01;@InjectView(R.id.tv_02)TextView tv02;@InjectView(R.id.tv_03)TextView tv03;MyItemClickListener listener;public void setListener(MyItemClickListener listener) {this.listener = listener;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_third_view, container, false);ButterKnife.inject(this, view);return view;}@Overridepublic void onDestroyView() {super.onDestroyView();ButterKnife.reset(this);}/*** 通过这个方法,可以实现Fragment的复用* */public void setDifferentUse(String tag){switch (tag){case "four":tv01.setText("复用界面的第一个文本");tv02.setText("复用界面的第二个文本");tv03.setText("复用界面的第三个文本");break;default:break;}}@OnClick({R.id.tv_01, R.id.tv_02, R.id.tv_03})public void onClick(View view) {switch (view.getId()) {case R.id.tv_01:listener.onItemClick(view,3,"tvOne");break;case R.id.tv_02:listener.onItemClick(view,3,"tvTwo");break;case R.id.tv_03:listener.onItemClick(view,3,"tvThree");break;}}
}
然后在xml中引用Fragment,新建xml,名字为layout_third.xml
,代码如下:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/fg_third"android:layout_width="match_parent"android:layout_height="match_parent"android:name="com.hebin.dropdownmenu.ThirdView"tools:layout="@layout/fragment_third_view" />
最后在Activity中,new 各个界面,然后设置给DropDownMenu,即可实现效果,代码如下:
public class MainActivity extends AppCompatActivity implements MyItemClickListener {@InjectView(R.id.dropDownMenu)DropDownMenu mDropDownMenu;private String headers[] = {"界面一", "界面二","界面三","界面四"};private List<View> popupViews = new ArrayList<>();private TextView tvText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.inject(this);initView();}private void initView() {/*** 第一个界面* */FirstView firstView = new FirstView(MainActivity.this);firstView.setListener(this);popupViews.add(firstView.firstView());/*** 第二个界面* */SecView secView = new SecView(MainActivity.this);secView.setListener(this);popupViews.add(secView.secView());/*** 第三个界面* */View thirdView = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_third, null);ThirdView fragment = (ThirdView) getSupportFragmentManager().findFragmentById(R.id.fg_third);fragment.setListener(this);fragment.setDifferentUse("third");popupViews.add(thirdView);/*** 第四个界面* */View fourView = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_four, null);ThirdView fragment_01 = (ThirdView) getSupportFragmentManager().findFragmentById(R.id.fg_four);fragment_01.setListener(this);fragment_01.setDifferentUse("four");popupViews.add(fourView);/*** Dropdownmenu下面的主体部分* */View fifthView = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main_view, null);tvText = (TextView) fifthView.findViewById(R.id.tv_text);mDropDownMenu.setDropDownMenu(Arrays.asList(headers), popupViews, fifthView);}@Overridepublic void onBackPressed() {//退出activity前关闭菜单if (mDropDownMenu.isShowing()) {mDropDownMenu.closeMenu();} else {super.onBackPressed();}}/*** 每个界面中的控件的点击事件,点击将界面中的参数传给activity中调用* */@Overridepublic void onItemClick(View view, int postion, String string) {switch (postion){case 1:mDropDownMenu.setTabText(string);mDropDownMenu.closeMenu();tvText.setText(string);break;case 2:mDropDownMenu.setTabText(string);mDropDownMenu.closeMenu();tvText.setText(string);break;case 3:mDropDownMenu.setTabText(string);mDropDownMenu.closeMenu();tvText.setText(string);break;default:break;}}
}
注意:第四个界面用的也是第三个界面的Fragment,但是不能用layout_third.xml这个布局,也不能用同一个id,所以新建一个layout_four.xml,里面内容跟layout_third.xml的一样,只不过换了个ID
Android下拉筛选DropDownMenu相关推荐
- 仿美团、爱奇艺电影票下拉筛选框
仿美团.爱奇艺电影票下拉筛选框 转自github https://github.com/dongjunkun/DropDownMenu 权当笔记记录,感谢作者分享 作者简书地址 简书 效果图 主要代码 ...
- 仿基金查询输入框下拉筛选值效果(JavaScript)
http://www.weste.net/2007/11-24/19463143437.html 仿基金查询输入框下拉筛选值效果(JavaScript)
- Android下拉刷新开源库对比(转)
安卓下拉刷新开源库对比 作者:desmond1121 目前仅比对github上star数>1500的下拉刷新开源库,在比较完成之后可能会加入其它有代表性的库. Repo Repo Owner S ...
- android下拉刷新和上拉加载的一个简单库
介绍一个android下拉刷新.上拉加载的库: https://github.com/chrisbanes/Android-PullToRefresh 使用方式,创建好一个Android项目,导入li ...
- android下拉会谈效果,Android实现下拉展示条目效果
本文实例为大家分享了Android下拉展示条目的具体代码,供大家参考,具体内容如下 布局文件 xmlns:tools="http://www.easck.com/tools" an ...
- Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)
转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉载入,网上的Demo太多太多了,这 ...
- Android下拉刷新和上拉加载更多
Android下拉刷新和上拉加载更多 下拉刷新 通过android系统提供的组件:SwipeRefreshLayout 一.基本使用 1 xml中 添加 SwipeRefreshLayout 组件 该 ...
- Android下拉刷新的实现(一) - SwipeRefreshLayout篇
Android下拉刷新的实现(一) - SwipeRefreshLayout篇
- Android下拉刷新
早期下拉刷新主要是用XListView,这个类是继承ListView的,使用起来有局限性,并且在git上作者已经不维护了,之后有人自己写了一个PullToRefreshLayout,不用再继承自Lis ...
最新文章
- Integer vs int
- 新学期使用ssm开发一个教材管理系统
- 二级域名怎么设置_怎么建设自己的网站?看完这四个步骤你就明白了
- linux登录ssh怎么保存采集的脚本,ssh自动登录并且su的脚本
- 【转】gif文件格式详解
- 湿度传感器如何工作?
- SpringMVC 学习系列 (4) 之 数据绑定 -1
- 【Tomcat】Tomcat性能分析
- 轻松完成Birt报告
- Android Studio导入project和module的方法
- android 方法统计,Android 利用编译时 注入 统计App内所有方法执行时常,分析ANR
- 谣言易碎:诺基亚为何不能投靠Android阵营?
- 美图秀秀计算机教程,美图秀秀怎么抠图 美图秀秀抠图详细教程
- 计算机系统在线帮助,FoxPro应用系统中在线帮助及出错处理方法
- 【Proteus仿真】波形信号发生器(4种波形可选,频率可调)
- APP在推广之渠道为王(一 )
- BZOJ2109: [Noi2010]Plane 航空管制 解题报告
- Calculate Tangent Space是怎么计算切线的
- U9二次开发之BP定时任务插件开发
- MEM/MBA数学强化(03)整式与分式的运算