-
android 标题栏下拉选择控件(下拉菜单宽度全屏显示spinner)
2017-09-20 12:31:50android下拉菜单spinner,虽然很方便,但有些需求是下拉框是固定大小,下拉菜单栏则是宽度全屏,据我所知android自带的spinner是不好处理的,所以就自己动手吧,自己动手有饭吃。android下拉菜单spinner,虽然很方便,但有些需求是下拉框是固定大小,下拉菜单栏则是宽度全屏,据我所知android自带的spinner是不好处理的,所以就自己动手吧,自己动手有饭吃。废话少说,先上图再说
这里的实现方案是TextView加PopupWindow,并对其进行了封装。
照惯例,我们仍然从简单的说起,首先是适配器,因为我们的下拉列表其实就是一个listView,所以该适配器直接继承BaseAdapter,在这里我们只增加一个抽象方法getItemText(int position),用于TextView获取显示的文本,代码如下:
public abstract class BaseSpinnerAdapter extends BaseAdapter { public abstract String getItemText(int position); }
这次的控件会比较简单,只是TextView和PopupWindow的组合控件,所以理所当然的该控件直接继承TextView,然后分一下几步1、在构造方法中创建一个PopWindow,代码如下:
/** * 初始化列表PopupWindow */ public void init(Context context) { setGravity(Gravity.CENTER); LinearLayout layout = new LinearLayout(context); layout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); layout.setBackgroundColor(0xaa000000); layout.setOrientation(LinearLayout.VERTICAL); mPopWindow = new PopupWindow(layout, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, true); mPopWindow.setAnimationStyle(animationId); line = new View(context);//添加一条分割线,不需要可将其设置为透明色 float scale = context.getResources().getDisplayMetrics().density; line.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) (1 * scale + 0.5f))); line.setBackgroundColor(lineColor); listView = new ListView(context); listView.setDivider(new ColorDrawable(0xffd6d6d6)); listView.setDividerHeight(1); listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);//设置为单选模式,方便获取最新的点击item的下标 if (adapter != null) { listView.setAdapter(adapter); } layout.addView(line); layout.addView(listView); layout.setFocusableInTouchMode(true); mPopWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {//向外部暴露popWindow消失时的通知接口 @Override public void onDismiss() { if (statusListener != null) { statusListener.onDismiss(PopSpinner.this); } } }); //点击空白处时,关闭PopWindows layout.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { closeWindow(); return false; } }); layout.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { closeWindow(); return true; } }); setOnClickListener(this); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (adapter != null) { PopSpinner.this.setText(adapter.getItemText(position)); } closeWindow(); if (mOnSpinnerItemClickListener != null) { mOnSpinnerItemClickListener.onItemClick(parent, view, position, id); } } }); }
2、修改setOnClickListener方法,使点击该控件时弹出下拉菜单,再调用外部设置的点击事件,代码如下:------------------------------------------------ @Override public void setOnClickListener(OnClickListener l) { if (l instanceof PopSpinner) { super.setOnClickListener(l); } else { this.onClickListener = l; } } @Override public void onClick(View view) { if (mPopWindow.isShowing()) { closeWindow(); } else { showWindow(); } if (onClickListener != null) { onClickListener.onClick(view); } } ------------------------------------------------
3、定义外部响应接口------------------------------------------------ //下拉列表的item点击事件,即listView的item点击事件 public interface OnSpinnerItemClickListener { void onItemClick(AdapterView<?> parent, View view, int position, long id); } //下拉列表显示与隐藏事件 public interface WindowStatusListener { //下拉列表显示 void onShow(View view); // 下拉列表隐藏 void onDismiss(View view); } ------------------------------------------------
4、丰富特色设置---------------------------------------------- //设置adapter public void setAdapter(BaseSpinnerAdapter adapter) { this.adapter = adapter; if (listView != null) { listView.setAdapter(adapter); } if (adapter.getCount() > 0) { setSelectedItemPosition(0); } } //方便外部获取下拉列表的listView public ListView getListView() { return listView; } // 设置PopWindows显示隐藏动画 public void setAnimationStyle(int animationId) { if (mPopWindow != null) { mPopWindow.setAnimationStyle(animationId); } this.animationId = animationId; } /** * 获取当前选中的item * * @return */ public int getSelectedItemPosition() { if (listView != null) { return listView.getCheckedItemPosition(); } return 0; } //获取选中的对象 public Object getSelectItemObject() { if (adapter != null && adapter.getCount() > 0) { return adapter.getItem(getSelectedItemPosition()); } return null; } //设置选中第几个 public void setSelectedItemPosition(int position) { if (listView != null && listView.getCount() > 0) { listView.setItemChecked(listView.getCount() > position ? position : listView.getCount() - 1, true); } if (adapter != null && adapter.getCount() > 0) { setText(adapter.getItemText(adapter.getCount() > position ? position : adapter.getCount() - 1)); } } //设置顶部分割线的颜色 public void setLineColor(int lineColor) { if (line != null) { line.setBackgroundColor(lineColor); } this.lineColor = lineColor; } ------------------------------------------------
到此我们的下拉控件就完成了,使用上数据源和item的设置跟listView几乎差不多,控件中的样式的配置则跟TextView一样(因为本身就是继承TextView的),比如上图中的样式------------------------------------------------ popSpinner = new PopSpinner(this); ActionBar.LayoutParams lp = new ActionBar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT , ViewGroup.LayoutParams.MATCH_PARENT); lp.gravity = Gravity.CENTER; popSpinner.setLayoutParams(lp); popSpinner.setTextSize(16); Drawable drawable = getResources().getDrawable(R.mipmap.arrow_down); drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); popSpinner.setCompoundDrawables(null, null, drawable, null); popSpinner.setCompoundDrawablePadding(15); ------------------------------------------------
至于下拉列表中打勾的显示方式,可以在你继承的adapter中做个标记位,选中的item显示个勾。实现方案有很多种,我这里又是使用自己定义的控件,思路是TextView+RadioButton,比较简单,我查了下,网上也有不少,这里就不讲了。本文地址:http://blog.csdn.net/lanqi_x/article/details/78039435
-
Android仿微信下拉列表实现(加顶部菜单栏和底部菜单栏)
2015-03-21 21:34:27Android仿微信下拉列表实现(加顶部菜单栏和底部菜单栏),具体看博文blog.csdn.net/evankaka/article/details/44179321 -
Android下拉菜单Spinner控件
2015-01-22 20:57:43方法1(非动态创建): Spinner创建: 1.在布局栏创建spinner控件。 android:id="@+id/spinner1" android:layout_width="fill_parent" android:layout_height="wrap_content" androi方法1(非动态创建):
Spinner创建:
1.在布局栏创建spinner控件。
2.在string.xml中声明一个数组<span style="font-size:18px;"> <Spinner android:id="@+id/spinner1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="40dp" /></span>
3.创建数据适配器<span style="font-size:18px;"> <string-array name="users"> <item >first</item> <item >second</item> <item >third</item> <item >forth</item> <item >fifth</item> </string-array></span>
通过数据适配器把数据与控件绑定
第一个参数 当前对象
第二个参数 string.xml 中 string-array 节点的 name="user"
第三个参数 系统默认的文本样式
<span style="font-size:18px;"> ArrayAdapter Adapter = ArrayAdapter.createFromResource( this, R.array.users, android.R.layout.simple_spinner_item); Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);</span>
4.获取Spinner对象sp,然后将数据导入sp中
<span style="font-size:18px;"> Spinner sp = (Spinner) findViewById(R.id.spinner1); sp.setAdapter(Adapter); sp.setPrompt("序号");</span>
Spinner创建:
1.首先要创建监听器对象,为OnItemSelectedListener对象。其中,onItemSelected函数中:
第一个参数为:Spinner对象本身
第三个参数为:选中的位置<span style="font-size:18px;"> OnItemSelectedListener listener =new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub String item; item=arg0.getItemAtPosition(arg2).toString(); Toast.makeText(MainActivity.this, item, 0).show(); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "请选择一个选项", 0).show(); } };</span>
2.使监听器对象,监听spinner控件
<span style="font-size:18px;"> sp.setOnItemSelectedListener(listener);</span>
方法2(动态创建):
1.在layout文件夹中创建布局文件item.xml,在其中加入TextView控件。
2.做数据,本例中使用了ArrayList来存储数据
<span style="font-size:18px;"> ArrayList<String> names = new ArrayList<String>(); names.add("Frank"); names.add("Chales"); names.add("Cross"); names.add("james"); names.add("Aaron");</span>
3.创建数据适配器,注意这次的参数和第一次的参数不一样
<span style="font-size:18px;"> ArrayAdapter adapter = new ArrayAdapter( this, R.layout.item, R.id.tv_names, names);</span>
4.创建Spinner对象,并连接adapter与Spinner对象
<span style="font-size:18px;"> Spinner sp = (Spinner) findViewById(R.id.spinner1); sp.setAdapter(adapter);</span>
5.运行,得到结果
-
android利用PopupWindow实现点击工具栏弹出下拉菜单
2018-06-26 17:46:50android页面开发中会碰到这种需求:点击页面顶部工具栏某个按钮时需要弹出下拉菜单。该工程利用PopupWindow实现了点击工具栏弹出下拉菜单的功能的主要实现类 . -
安卓禁止下拉菜单栏
2017-11-06 16:27:541.首先创建一个类。 ... import android.content.Context; import android.view.MotionEvent; import android.view.ViewGroup; /** * Created by 15265 on 2017/11/6. */ class CustomView1.首先创建一个类。
package com.Slq.VideoPlayer; import android.content.Context; import android.view.MotionEvent; import android.view.ViewGroup; /** * Created by 15265 on 2017/11/6. */ class CustomViewGroup extends ViewGroup { public CustomViewGroup(Context context) { super(context); } @Override protected void onLayout(boolean b, int i, int i1, int i2, int i3) { } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return true; } }
2.然后在需要禁止下拉菜单栏的窗口类中或者单独一个类中编写禁止和允许下拉菜单栏的方法。
需要声明的属性
CustomViewGroup view; WindowManager manager;
禁止下拉的方法
private void prohibitDropDown() { manager = ((WindowManager) getApplicationContext() .getSystemService(Context.WINDOW_SERVICE)); WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams(); localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; localLayoutParams.gravity = Gravity.TOP; localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| // this is to enable the notification to recieve touch events WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | // Draws over status bar WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; localLayoutParams.height = (int) (50 * getResources() .getDisplayMetrics().scaledDensity); localLayoutParams.format = PixelFormat.TRANSPARENT; view = new CustomViewGroup(this); manager.addView(view, localLayoutParams); }
允许下拉的方法
private void allowDropDown(){ manager.removeView(view); }
3.然后需要在开始方法(onCreate)中写上禁止下拉的方法。
if (! Settings.canDrawOverlays(UnityPlayerActivity.this)) { Intent intent = new Intent(Settings. ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivity(intent); } prohibitDropDown();
4.在结束方法(onDestroy)中写上允许下拉的方法,否则的话在其他程序和界面的时候也不能下拉菜单栏。
5.最后需要在配置文件(AndroidMainFest)中申请权限。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
-
SystemUI下拉菜单栏和通知栏位置不一致
2020-03-04 10:16:42由于通知栏有设置相对偏移导致的问题(通知栏未居中显示),修改如下; packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @Modified protected void ...由于通知栏有设置相对偏移导致的问题(通知栏未居中显示),修改如下;
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @Modifiedprotected void setVerticalPanelTranslation(float translation) { // Fix QuickSettings and NotificationPanel is not CENTER show. // mNotificationStackScroller.setTranslationX(translation); // mQsFrame.setTranslationX(translation); // End int size = mVerticalTranslationListener.size(); for (int i = 0; i < size; i++) { mVerticalTranslationListener.get(i).run(); } }
-
android 下拉状态栏关闭某个功能的时候去掉或添加斜线
2020-06-12 17:10:16android的systemUI下拉菜单有许多的快捷方式,有些快捷方式关闭的时候会有一个斜杠 想要添加斜杠,则在关闭动作中添加: state.slash.isSlashed = true; 原来有斜杠,想要关闭斜杠,则在关闭动作中 屏蔽state.... -
安卓游戏时禁止状态栏下拉_如何在Android中禁用通知栏下拉菜单?
2021-01-13 08:30:47I am building a new lock screen for Android, but I am unable to lock the notification bar from pulling it down.I want to disable the notification bar pull-down.解决方案private void ... -
【Android开发】让导航栏下拉菜单响应事件-接上文
2021-01-11 14:11:33如何让导航栏下拉菜单相应事件 接上文: link. 步骤 1.在页面的Activity中重写onOptionsItemSelected()方法 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { int itemId = item.... -
Android 9 禁用下拉状态栏
2020-10-28 22:23:43Android9禁用下拉菜单 Android源码目录中找到以下Java源文件 vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java onDraggedDown函数返回值修改为... -
android上拉菜单和下拉菜单的实现
2013-06-03 20:12:58参考网上下拉菜单实现demo(http://www.apkbus.com/android-51289-1-1.html),在其基础上折磨了好一会儿才是勉强实现上拉菜单栏功能, 说勉强是刚好满足自己的需求,而不能大众化,如上图中只有将Button等控件至于... -
Android5.0 下拉通知栏快捷开关的添加(必看)
2016-06-03 16:42:42之前在开发的过程中修改了一些SystemUi相关的东西,今天就总结一下关于Android 5.0 下拉通知栏快捷按键的添加。 我们都知道,原生的Android5.0下拉菜单的图片是这样的: -
Android7.1 禁用系统状态栏的下拉通知菜单
2019-12-26 20:07:59为了用户界面简洁易用,需要禁用系统状态栏的下拉通知菜单。 修改如下: 文件为NotificationPanelView.java, 这个类包含了一个变量mBlockTouches public class NotificationPanelView extends PanelView ... -
Android UI设计系列之自定义ListView仿QQ空间阻尼下拉刷新和渐变菜单栏效果(8)
2020-09-02 06:06:17主要介绍了Android UI设计系列之自定义ListView仿QQ空间阻尼下拉刷新和渐变菜单栏效果,具有一定的实用性和参考价值,感兴趣的小伙伴们可以参考一下 -
【Android开发】创建一个导航栏右侧带下拉菜单的页面
2021-01-11 11:43:16Android studio 项目代码行数统计指南 -
android 弹出列表菜单_Word 中的表格能制作下拉菜单选项吗?
2020-12-28 13:05:17尽管大家都知道做表格要用 Excel,但工作中有时仍然不可避免需要在 Word 中制作表格。是不是用了 Word,表格除了输入文字就再也无法增加其他任何功能?非也,Word 中的表格也可以智能化,比如增加下拉... 选择菜单栏... -
Android 4.4.2 禁用通知栏下拉
2018-06-08 10:18:13最近做了一个项目,需要进入软件中,禁止下拉菜单栏,经查证,以下方法实现了我的需求: 系统:Android 4.4.2 1. 需要在程序中添加 service_interanl.jar 下载地址:... -
Android UI设计之<十>自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果
2016-06-06 07:52:24好久没有写有关UI的博客了,刚刚翻了一下之前的博客,最近一篇有关UI的...近来项目有个需求,要做个和QQ空间类似的菜单栏透明度渐变和下拉刷新带有阻尼回弹的效果。于是花点时间动手试了试,基本上达到了QQ空间的效果 -
android 菜单
2013-06-03 20:03:02android中实现点击,下拉菜单栏功能 -
去掉安卓原生状态栏及下拉菜单
2019-10-29 08:05:11去掉状态栏 1,StatusBar 属于系统app,在SystemUI下,该文件位于android_src/frameworks/base/packages 下面(其中android_src指的是你的android源码路径) 2,打开SystemUI的src目录SystemUI/src/... -
Android UI设计之<十三>自定义ScrollView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果
2016-10-08 08:09:31之前写过一篇Android UI设计之<十>自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果的文章,写完那篇文章后想趁热打铁再写一篇用ScrollView来实现同样效果的文章,可是写了点开头就没有继续写下去了,当时想... -
自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果
2016-06-06 18:12:14Android UI设计之<十>自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果,详见:http://blog.csdn.net/llew2011/article/details/51559694 -
自定义ScrollView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果
2016-10-09 20:06:26Android UI设计之<十三>自定义ScrollView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果,详http://blog.csdn.net/llew2011/article/details/52626148